计算两个字符串的相似度
第1种:相似度计算公式 相似度=Kq*q/(Kq*q+Kr*r+Ks*s) (Kq > 0 , Kr>=0,Ka>=0)
q 是字符串1和字符串2中都存在的单词的总数
s 是字符串1 比 q 多的单词总数
r 是字符串2 比 q 多的单词总数
Kq,Kr和ka 分别是q,r,s的权重(非常重要)
根据实际的计算情况,我们设Kq=2,Kr=Ks=1
/// <summary> /// 获取两个字符串的相似度 /// </summary> /// <param name=”str1”>第一个字符串</param> /// <param name=”str2”>第二个字符串</param> /// <returns></returns> static decimal GetSimilarityWith(string str1, string str2) { decimal Kq = 2; decimal Kr = 1; decimal Ks = 1; char[] ss = str1.ToCharArray(); char[] st = str2.ToCharArray(); //获取交集数量 int q = ss.Intersect(st).Count(); int s = ss.Length - q; int r = st.Length - q; return Kq * q / (Kq * q + Kr * r + Ks * s); }
例如:
string str1="第十一届成像技术及其在原子分子物理中的应用学术研讨会";
string str2=str1;
var r= GetSimilarityWith(str1,str2);
Console.WriteLine(r); //输出如下
说明:即使肉眼看起一样,但是也会因为权重的设置比例问题,不会输出到 1,也就是说不会有100%相似度。
原文地址:C#计算两个字符串的相似度 - 建站教程 (jiuaidu.com)
第二种:莱文斯坦距离算法
static double ComputeTextSame(string str1, string str2) // 计算文本相似度函数(适用于短文本) { int textSameLength = 0; double maxLength = Math.Max(str1.Length, str2.Length); if (maxLength <= 0) { return 1.0; } try { int m = str1.Length; int n = str2.Length; int[,] d = new int[m + 1, n + 1]; for (int i = 0; i <= m; i++) d[i, 0] = i; for (int i = 0; i <= n; i++) d[0, i] = i; for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { d[i, j] = d[i - 1, j - 1] + (str1[i - 1] == str2[j - 1] ? 0 : 1); //修改一个字符 d[i, j] = Math.Min(d[i, j], d[i - 1, j] + 1); // 插入一个字符串 d[i, j] = Math.Min(d[i, j], d[i, j - 1] + 1); //删除一个字符 } } textSameLength = d[m, n]; } catch //出错返回一个很大值 { textSameLength = 10000; } return (maxLength - textSameLength) / maxLength; }
例如:
string str1="第十一届成像技术及其在原子分子物理中的应用学术研讨会";
string str2=str1;
var r= ComputeTextSame(str1,str2);
Console.WriteLine(r); //输出如下
原文地址:C#计算字符串相似性的方法 - phpStudy (xp.cn)