首页 .NET/Web C#文本相似度算法

C#文本相似度算法

作者:胡同里的砖头 围观群众:2907 更新于:2013-12-19

在向量空间模型中,文本泛指各种机器可读的记录。用D(Document)表示,特征项(Term,用t表示)是指出现在文档D中且能够代表该文档内容的基本语言单位,主要是由词或者短语构成,文本可以用特征项集表示为D(T1,T2,…,Tn),其中Tk是特征项,1<=k<=N。例如一篇文档中有a、b、c、d四个特征项,那么这篇文档就可以表示为D(a,b,c,d)。对含有n个特征项的文本而言,通常会给每个特征项赋予一定的权重表示其重要程度。即D=D(T1,W1;T2,W2;…,Tn,Wn),简记为D=D(W1,W2,…,Wn),我们把它叫做文本D的向量表示。其中Wk是Tk的权重,1<=k<=N。在上面那个例子中,假设a、b、c、d的权重分别为30,20,20,10,那么该文本的向量表示为D(30,20,20,10)。在向量空间模型中,两个文本D1和D2之间的内容相关度Sim(D1,D2)常用向量之间夹角的余弦值表示,公式为:
余弦公式略
其中,W1k、W2k分别表示文本D1和D2第K个特征项的权值,1<=k<=N。
在自动归类中,我们可以利用类似的方法来计算待归类文档和某类目的相关度。例如文本D1的特征项为a,b,c,d,权值分别为30,20,20,10,类目C1的特征项为a,c,d,e,权值分别为40,30,20,10,则D1的向量表示为D1(30,20,20,10,0),C1的向量表示为C1(40,0,30,20,10),则根据上式计算出来的文本D1与类目C1相关度是0.86

那个相关度0.86是怎么算出来的? 

 

是这样的,抛开你的前面的赘述

在数学当中,n维向量是 V{v1, v2, v3, ..., vn}
他的模: |v| = sqrt ( v1*v1 + v2*v2 + ... + vn*vn )
两个向量的点击 m*n = n1*m1 + n2*m2 + ...... + nn*mn
相似度 = (m*n) /(|m|*|n|)
物理意义就是两个向量的空间夹角的余弦数值
对于你的例子
d1*c1 = 30*40 + 20*0 + 20*30 + 10*20 + 0*10 = 2000
|d1| = sqrt(30*30 +20*20 + 20*20 + 10*10 + 0*0) = sqrt(1800)
|c1| = sqrt(40*40 + 0*0 + 30*30 + 20*20 + 10*10) = sqrt(3000)
相似度 = d1*c1/(|d1|*|c1|)= 2000/sqrt(1800*3000)= 0.86066

 

 

C#实现代码

01./// <summary>   
02./// 计算相似度   
03./// </summary>   
04./// <param name="text1">词典一</param>   
05./// <param name="text2">词典二</param>   
06./// <returns>词典一和词典二的相似度</returns>   
07.public double Similarity(Dictionary<string, int> text1, Dictionary<string, int> text2)  
08.{  
09.    double similarity = 0.0, numerator = 0.0, denominator1 = 0.0, denominator2 = 0.0;  
10.    int temp1, temp2;  
11.    Dictionary<string, int> dictionary1 = new Dictionary<string,int>(text1);  
12.    Dictionary<string, int> dictionary2 = new Dictionary<string,int>(text2);  
13.    if ((dictionary1.Count < 1) || (dictionary2.Count < 1))//如果任一篇文章中不含有汉字   
14.    {  
15.        return 0.0;  
16.    }  
17.    Dictionary<string, int>.KeyCollection keys1 = dictionary1.Keys;  
18.    foreach (string key in keys1)  
19.    {  
20.        dictionary1.TryGetValue(key, out temp1);  
21.        if (!dictionary2.TryGetValue(key, out temp2))  
22.        {  
23.            temp2 = 0;  
24.        }  
25.        dictionary2.Remove(key);  
26.        numerator += temp1 * temp2;  
27.        denominator1 += temp1 * temp1;  
28.        denominator2 += temp2 * temp2;  
29.    }  
30.    Dictionary<string, int>.KeyCollection keys2 = dictionary2.Keys;  
31.    foreach (string key in keys2)  
32.    {  
33.        dictionary2.TryGetValue(key, out temp2);  
34.        denominator2 += temp2 * temp2;  
35.    }  
36.    similarity = numerator / (Math.Sqrt(denominator1 * denominator2));  
37.    return similarity;  
38.}  

 

  • 本文标题: C#文本相似度算法
  • 文章分类:【.NET/Web】
  • 非特殊说明,本文版权归【胡同里的砖头】个人博客 所有,转载请注明出处.
留言评论
站点声明:
1、本站【胡同里的砖头】个人博客,借鉴网上一些博客模板,取其各优点模块自行拼装开发,本博客开发纯属个人爱好。
2、所有笔记提供给广大用户交流使用,可转载,可复制,纯个人开发所遇问题锦集记录使用
Copyright © huzlblog.com All Rights Reserved. 备案号:苏ICP备2021056683号-8