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