我們在做數(shù)據(jù)系統(tǒng)的時(shí)候,經(jīng)常會用到模糊搜索,但是,數(shù)據(jù)庫提供的模糊搜索并不具備按照相關(guān)度進(jìn)行排序的功能。
現(xiàn)在提供一個比較兩個字符串相似度的方法。
通過計(jì)算出兩個字符串的相似度,就可以通過Linq在內(nèi)存中對數(shù)據(jù)進(jìn)行排序和篩選,選出和目標(biāo)字符串最相似的一個結(jié)果。
本次所用到的相似度計(jì)算公式是 相似度=Kq*q/(Kq*q+Kr*r+Ks*s) (Kq > 0 , Kr>=0,Ka>=0)
其中,q是字符串1和字符串2中都存在的單詞的總數(shù),s是字符串1中存在,字符串2中不存在的單詞總數(shù),r是字符串2中存在,字符串1中不存在的單詞總數(shù). Kq,Kr和ka分別是q,r,s的權(quán)重,根據(jù)實(shí)際的計(jì)算情況,我們設(shè)Kq=2,Kr=Ks=1.
根據(jù)這個相似度計(jì)算公式,得出以下程序代碼:
/// 獲取兩個字符串的相似度
/// </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();
//獲取交集數(shù)量
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);
}
這就是計(jì)算字符串相似度的方法,但是實(shí)際應(yīng)用時(shí),還需要考慮到同義詞或近義詞的情況發(fā)生, 如“愛造人小說閱讀的更新最快”和“愛造人小說閱讀地更新最快” 。兩個字符串在一定意義上說其實(shí)是相同的,如果使用上述方法計(jì)算就會出現(xiàn)不準(zhǔn)確的情況。所以在實(shí)際應(yīng)用的時(shí)候,我們需要替換同義詞或近義詞,計(jì)算替換后的相似度。
如果是近義詞,需要綜合替換近義詞前和近義詞后的計(jì)算結(jié)果,得出兩個字符串的實(shí)際相似度。
推薦閱讀: 權(quán)財(cái)
浙公網(wǎng)安備 33010602011771號