比较两个字符串的相似度算法
平時(shí)的編碼中,我們經(jīng)常需要判斷兩個(gè)文本的相似性,不管是用來做文本糾錯(cuò)或者去重等等,那么我們應(yīng)該以什么維度來判斷相似性呢?這些算法又怎么實(shí)現(xiàn)呢?這篇文章對(duì)常見的計(jì)算方式做一個(gè)記錄。Levenshtein 距離,又稱編輯距離,指的是兩個(gè)字符串之間,由一個(gè)轉(zhuǎn)換成另一個(gè)所需的最少編輯操作次數(shù)。許可的編輯操作包括將一個(gè)字符替換成另一個(gè)字符,插入一個(gè)字符,刪除一個(gè)字符。編輯距離的算法是首先由俄國科學(xué)家Levenshtein提出的,故又叫Levenshtein Distance。我們?cè)谧鰯?shù)據(jù)系統(tǒng)的時(shí)候,經(jīng)常會(huì)用到模糊搜索,但是,數(shù)據(jù)庫提供的模糊搜索并不具備按照相關(guān)度進(jìn)行排序的功能。現(xiàn)在提供一個(gè)比較兩個(gè)字符串相似度的方法。通過計(jì)算出兩個(gè)字符串的相似度,就可以通過Linq在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行排序和篩選,選出和目標(biāo)字符串最相似的一個(gè)結(jié)果。本次所用到的相似度計(jì)算公式是 相似度=Kqq/(Kqq+Krr+Kss) (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ì)算情況,我們?cè)O(shè)Kq=2,Kr=Ks=1. 根據(jù)這個(gè)相似度計(jì)算公式,得出以下程序代碼:
///?<summary>///?獲取兩個(gè)字符串的相似度 ///?</summary>///?<param?name=”sourceString”>第一個(gè)字符串</param>///?<param?name=”str”>第二個(gè)字符串</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ā)生, 如“愛造人小說閱讀的更新最快”和“愛造人小說閱讀地更新最快” 。兩個(gè)字符串在一定意義上說其實(shí)是相同的,如果使用上述方法計(jì)算就會(huì)出現(xiàn)不準(zhǔn)確的情況。所以在實(shí)際應(yīng)用的時(shí)候,我們需要替換同義詞或近義詞,計(jì)算替換后的相似度。如果是近義詞,需要綜合替換近義詞前和近義詞后的計(jì)算結(jié)果,得出兩個(gè)字符串的實(shí)際相似度。
總結(jié)
以上是生活随笔為你收集整理的比较两个字符串的相似度算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用表达式自定义Serilog输出格式
- 下一篇: dotnet中的counters说明(三