对比两个文件相似度 余弦算法

文件A1 包含字符Bi 的个数BiN1,文件A2 包含的字符Bi 的个数BiN2

利用余弦算法:   相似度 = (B1N1*B1N2 +B2N1*B2N2+....+BiN1*BiN2)/(Math.sqrt(B1N1^2 +B2N1^2+....+BiN1^2)*Math.sqrt(B1N2^2 +B2N2^2+....+BiN2^2).

Math.sqrt() 代表开方。

具体代码如下:

public class SimilarDegreeByCos
{
    /*
     * 计算两个字符串(英文字符)的相似度,简单的余弦计算,未添权重
     */
     public static double getSimilarDegree(String str1, String str2)
     {
        //创建向量空间模型,使用map实现,主键为词项,值为长度为2的数组,存放着对应词项在字符串中的出现次数
         Map<String, int[]> vectorSpace = new HashMap<String, int[]>();
         int[] itemCountArray = null;//为了避免频繁产生局部变量,所以将itemCountArray声明在此

         //以空格为分隔符,分解字符串
         String strArray[] = str1.split(" ");
         for(int i=0; i<strArray.length; ++i)
         {
             if(vectorSpace.containsKey(strArray[i]))
                 ++(vectorSpace.get(strArray[i])[0]);
             else
             {
                 itemCountArray = new int[2];
                 itemCountArray[0] = 1;
                 itemCountArray[1] = 0;
                 vectorSpace.put(strArray[i], itemCountArray);
             }
         }

         strArray = str2.split(" ");
         for(int i=0; i<strArray.length; ++i)
         {
             if(vectorSpace.containsKey(strArray[i]))
                 ++(vectorSpace.get(strArray[i])[1]);
             else
             {
                 itemCountArray = new int[2];
                 itemCountArray[0] = 0;
                 itemCountArray[1] = 1;
                 vectorSpace.put(strArray[i], itemCountArray);
             }
         }

         //计算相似度
         double vector1Modulo = 0.00;//向量1的模
         double vector2Modulo = 0.00;//向量2的模
         double vectorProduct = 0.00; //向量积
         Iterator iter = vectorSpace.entrySet().iterator();

         while(iter.hasNext())
         {
             Map.Entry entry = (Map.Entry)iter.next();
             itemCountArray = (int[])entry.getValue();

             vector1Modulo += itemCountArray[0]*itemCountArray[0];
             vector2Modulo += itemCountArray[1]*itemCountArray[1];

             vectorProduct += itemCountArray[0]*itemCountArray[1];
         }

         vector1Modulo = Math.sqrt(vector1Modulo);
         vector2Modulo = Math.sqrt(vector2Modulo);

         //返回相似度
        return (vectorProduct/(vector1Modulo*vector2Modulo));
     }

     /*
      *
      */
     public static void main(String args[])
     {
         String str0 = "gold silver truck";
         String str1 = "gold silver truck";
         String str2 = "Shipment of gold damaged in a fire";
         String str3 = "Delivery of silver arrived in a silver truck";
         String str4 = "Shipment of gold arrived in a truck";
         String str5 = "gold gold gold gold gold gold";

         System.out.println(SimilarDegreeByCos.getSimilarDegree(str2, str4));
//         System.out.println(SimilarDegreeByCos.getSimilarDegree(str1, str3));
//         System.out.println(SimilarDegreeByCos.getSimilarDegree(str1, str4));
//         System.out.println(SimilarDegreeByCos.getSimilarDegree(str1, str5));
     }
}
时间: 2024-10-05 20:48:09

对比两个文件相似度 余弦算法的相关文章

SQL Server对比两字段的相似度(函数算法)

原文:SQL Server对比两字段的相似度(函数算法) 相似度函数 概述    比较两个字段的相似度    最近有人问到关于两个字段求相似度的函数,所以就写了一篇关于相似度的函数,分别是“简单的模糊匹配”,“顺序匹配”,“一对一位置匹配”.在平时的这种函数可能会需要用到,可能业务需求不一样,这里只给出参照,实际情况可以相对修改. 本文所有的两个字段比较都是除以比较字段本身,例如A与B比较,找出的长度除以A的长度,因为考虑如果A的长度大于B的长度,相似度会超100%,例如‘abbc’,'ab'.

快速遍历对比两个文件下的md5值

[[email protected] Activity]# find /opt/xyrpg/rpgserver_s1/XMLData/Activity/ -type f -exec md5sum {} \;|sed 's/rpgserver_s1/rpgserver_s2/'|md5sum -c /opt/xyrpg/rpgserver_s2/XMLData/Activity/ActivityCondition.xml: FAILED /opt/xyrpg/rpgserver_s2/XMLDat

linux对比两个文件的差异

在项目维护阶段,经常会对垃圾文件进行清理.比如没有在数据库中的文件进行删除,这个时候最好的选择就是使用shell命令了:废话不多说直接上代码: 1.首先准备好从数据表导出来的数据,方法随意 2.在服务器查看指定目录下所有文件的文件名,并生成文件. ls *.* >***.txt 3.对比两个文件的文件内容不同的部分,并且删除 #!/bin/sh #BEGIN cat test1.txt | sort | uniq | sort > a_u.txt cat test2.txt | sort |

python对比两个文件问题

写一个比较两个文本文件的程序. 如果不同, 给出第一个不同处的行号和 列号. 比较的时候可以使用zip()函数 1 a=open('test.txt','r') 2 b=open('test2.txt','r') 3 row=0 4 for linea,lineb in zip(a,b): 5 row+=1 6 if not linea==lineb: 7 col=0 8 for chara,charb in zip(linea,lineb): 9 col+=1 10 if not chara=

awk 对两个文件进行合并操作

1.awk命令概念 $0 表示一个文本中的一行记录 $1...N 表示一行中的第 1...N 字段 FNR     The input record number in the current input file.  #已读入当前文件的记录数 NR      The total number of input records seen so far.      #已读入的总记录数 next    Stop processing the current input record. The nex

simhash算法实现--查找文件相似度

一.Simhash简介 SimHash是用来网页去重最常用的hash方法,速度很快.Google采用这种算法来解决万亿级别的网页去重任务. SimHash算法的主要思想是降维.将高维的特征向量映射成一个低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似. 在simhash的发明人Charikar的论文中并没有给出具体的simhash算法和证明,"量子图灵"得出的证明simhash是由随机超平面hash算法演变而来的. 参考文献:<Dete

关于文本相似度-LD算法和余弦算法的比较

具体算法代码网上有现成的工具类.不一一列举了.我在做某个项目的时候发现LD算法有个弊端.就是对于较大文本(>5w)的相似度计算会特别慢,原因在于LD的计算形式是: LD 可能衡量两字符串的相似性.它们的距离就是一个字符串转换成那一个字符串过程中的添加.删除.修改数值.如果文本变的非常的大可以想象计算的次数 如果两个字符串都是20000字符,则LD矩阵的大小为20000*20000*2=800000000Byte=800MB.故,在比较长字符串的时候,还有其他性能更好的算法. 下面介绍下余弦算法 

Python对比两个txt文件内容

difflib模块作为python的标准库模块,无需安装,作用是比对文本之间的差异,且支持输出可读性比较强的html格式. #!coding=utf-8 # 2018-9-19 import sys import difflib # 读取配置文件函数 def read_file(file_name): try: file_handle = open(file_name, 'r') text = file_handle.read().splitlines() # 读取后以行进行分割 file_ha

对比两个压缩包内文件,将不同的文件及文件夹单独移到一个新文件夹里

项目需要,要对比两个apk,看是否有新增文件,并列出. 个人写这个写了有段时间,如果不跟业务结合的话可能就不会写这么久了(感慨下,还是单纯的逻辑代码简单啊!) 上代码 private String testFile(String path1,String unzipPath1,String path2,String unzipPath2,String newUnzipPath) throws Exception{ long l = System.currentTimeMillis(); //将压