此刻供给一个对照两个字符串相似度的要领。
通过计算出两个字符串的相似度,就可以通过Linq在内存中对数据进行排序和筛选,选出和方针字符串最相似的一个功效。
本次所用到的相似度计算公式是 相似度=Kq*q/(Kq*q+Kr*r+Ks*s) (Kq > 0 , Kr>=0,Ka>=0)
此中,q是字符串1和字符串2中都存在的单词的总数,s是字符串1中存在,字符串2中不存在的单词总数,r是字符串2中存在,字符串1中不存在的单词总数. Kq,Kr和ka分袂是q,r,s的权重,按照实际的计算情况,我们设Kq=2,Kr=Ks=1.
按照这个相似度计算公式,得出以下措施代码:
/// <summary>
/// 获取两个字符串的相似度
/// </summary>
/// <param name=”sourceString”>第一个字符串</param>
/// <param name=”str”>第二个字符串</param>
/// <returns></returns>
public static decimal GetSimilarityWith(this string sourceString, string str)
{
decimal Kq = 2;
decimal Kr = 1;
decimal Ks = 1;
char[] ss = sourceString.ToCharArray();
char[] st = str.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);
}
这就是计算字符串相似度的要领,但是实际应用时,,还需要考虑到同义词或近义词的情况产生, 如“爱造人小说阅读的更新最快”和“爱造人小说阅读地更新最快” 。两个字符串在必然意义上说其实是不异的,如果使用上述要领计算就会呈现禁绝确的情况。所以在实际应用的时候,我们需要替换同义词或近义词,计算替换后的相似度。
如果是近义词,需要综合替换近义词前和近义词后的计算功效,得出两个字符串的实际相似度。