网页去重(四)之余弦夹角计算相似度

       网页去重之余弦夹角计算相似度

1.   相似度度量

  相似度度量(Similarity),即计算个体间的相似程度,相似度度量的值越小,说明个体间相似度越小,相似度的值越大说明个体差异越大。

对于多个不同的文本或者短文本对话消息要来计算他们之间的相似度如何,一个好的做法就是将这些文本中词语,映射到向量空间,形成文本中文字和向量数据的映射关系,通过计算几个或者多个不同的向量的差异的大小,来计算文本的相似度。下面介绍一个详细成熟的向量空间余弦相似度方法计算相似度

向量空间余弦相似度(Cosine Similarity)

余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。

网页去重(四)之余弦夹角计算相似度_第1张图片

  其中,xi,yi是两篇文章中特征值。

2.   例子:

现有1.txt;2.txt两篇文章(这两篇文章完全相同),根据前面的特征值提取,我们可以得到如下图:

 网页去重(四)之余弦夹角计算相似度_第2张图片

那么根据特征值量化来算出来的余弦角度是1.00000000002;那么也可以这么说这两篇文章是相同。从而可以从数据源那里剔除重复的文章。


文章3:

 网页去重(四)之余弦夹角计算相似度_第3张图片

文章3和文章1比较,那么得出的结果是:0.4580397638611053。这里两篇文章的相似度不及一般,我们可以判断这两篇文章不是同一篇文章。

 

3. 算法实现:

 

 /**
     * 利用余弦夹角判断两篇文章的相似度(事先要排序)
     * @paraminputFileStr1
     * @paraminputFileStr2
     * @paramoutPutFileStr
     */
    public static Double getSimilarily(StringinputFileStr1,String inputFileStr2,String outPutFileStr){
       Double result = 0.0;
       try {
           Map<String, Double> map1 = getMapFromFile(inputFileStr1);
           Map<String, Double> map2 = getMapFromFile(inputFileStr2);
           int len =map1.size()<map2.size()?map1.size():map2.size();
           Double fz=0.0;
           Double fm = 0.0;
           Double fma = 0.0;
           Double fmb = 0.0;
          
           int index=0;
           Set<String> set1 =map1.keySet();
           Iterator<String> iter1 =set1.iterator();
           Set<String> set2 =map2.keySet();
           Iterator<String> iter2 =set2.iterator();
           while(index< len){
              String key1 =iter1.next();
              Double value1 = map1.get(key1);
              fma += value1*value1;
              String key2 =iter2.next();
              Double value2 = map2.get(key2);
              fmb += value2*value2;
           /*  if(value2 == 0.006625787919281005){
                  System.out.println(fz);
              }*/
              fz +=value1*value2;
              index ++;
           }
           fm = Math.sqrt(fma)*Math.sqrt(fmb);
           result = fz/fm;
           /*while(iter1.hasNext()){
              index ++;
              if(index > len) break;
              String key =iter1.next();
              Double value = map1.get(key);
              fma += value*value;
           }
           index = 0;
           Set<String> set2 =map2.keySet();
           Iterator<String> iter2 =set2.iterator();
           while(iter2.hasNext()){
              index ++;
              if(index > len) break;
              String key =iter2.next();
              Double value = map2.get(key);
              fmb += value*value;
           }*/
          
          
          
       } catch(Exception e) {
           e.printStackTrace();
       }
       return result;
    }

你可能感兴趣的:(网页去重(四)之余弦夹角计算相似度)