Python文本相似性計算之編輯距離詳解
編輯距離
編輯距離(Edit Distance),又稱Levenshtein距離,是指兩個字串之間,由一個轉(zhuǎn)成另一個所需的最少編輯操作次數(shù)。編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。一般來說,編輯距離越小,兩個串的相似度越大。
例如將kitten一字轉(zhuǎn)成sitting:('kitten' 和 ‘sitting' 的編輯距離為3)
sitten (k→s)
sittin (e→i)
sitting (→g)
Python中的Levenshtein包可以方便的計算編輯距離
包的安裝: pip install python-Levenshtein
我們來使用下:
# -*- coding:utf-8 -*- import Levenshtein texta = '艾倫 圖靈傳' textb = '艾倫•圖靈傳' print Levenshtein.distance(texta,textb)
上面的程序執(zhí)行結(jié)果為3,但是只改了一個字符,為什么會發(fā)生這樣的情況?
原因是Python將這兩個字符串看成string類型,而在 string 類型中,默認的 utf-8 編碼下,一個中文字符是用三個字節(jié)來表示的。
解決辦法是將字符串轉(zhuǎn)換成unicode格式,即可返回正確的結(jié)果1。
# -*- coding:utf-8 -*- import Levenshtein texta = u'艾倫 圖靈傳' textb = u'艾倫•圖靈傳' print Levenshtein.distance(texta,textb)
接下來重點介紹下保重幾個方法的作用:
Levenshtein.distance(str1, str2)
計算編輯距離(也稱Levenshtein距離)。是描述由一個字串轉(zhuǎn)化成另一個字串最少的操作次數(shù),在其中的操作包括插入、刪除、替換。算法實現(xiàn):動態(tài)規(guī)劃。
Levenshtein.hamming(str1, str2)
計算漢明距離。要求str1和str2必須長度一致。是描述兩個等長字串之間對應(yīng)位置上不同字符的個數(shù)。
Levenshtein.ratio(str1, str2)
計算萊文斯坦比。計算公式 r = (sum – ldist) / sum
, 其中sum是指str1 和 str2 字串的長度總和,ldist是類編輯距離。注意這里是類編輯距離,在類編輯距離中刪除、插入依然+1,但是替換+2。
Levenshtein.jaro(s1, s2)
計算jaro距離,Jaro Distance據(jù)說是用來判定健康記錄上兩個名字是否相同,也有說是是用于人口普查,我們先來看一下Jaro Distance的定義。
兩個給定字符串S1和S2的Jaro Distance為:
其中的m為s1, s2匹配的字符數(shù),t是換位的數(shù)目。
兩個分別來自S1和S2的字符如果相距不超過
時,我們就認為這兩個字符串是匹配的;而這些相互匹配的字符則決定了換位的數(shù)目t,簡單來說就是不同順序的匹配字符的數(shù)目的一半即為換位的數(shù)目t。舉例來說,MARTHA與MARHTA的字符都是匹配的,但是這些匹配的字符中,T和H要換位才能把MARTHA變?yōu)镸ARHTA,那么T和H就是不同的順序的匹配字符,t=2/2=1
。
兩個字符串的Jaro Distance即為:
Levenshtein.jaro_winkler(s1, s2)
計算Jaro–Winkler距離,而Jaro-Winkler則給予了起始部分就相同的字符串更高的分數(shù),他定義了一個前綴p,給予兩個字符串,如果前綴部分有長度為ι的部分相同,則Jaro-Winkler Distance為:
dj是兩個字符串的Jaro Distance
ι是前綴的相同的長度,但是規(guī)定最大為4
p則是調(diào)整分數(shù)的常數(shù),規(guī)定不能超過25,不然可能出現(xiàn)dw大于1的情況,Winkler將這個常數(shù)定義為0.1
這樣,上面提及的MARTHA和MARHTA的Jaro-Winkler Distance為:
dw = 0.944 + (3 * 0.1(1 − 0.944)) = 0.961
個人覺得算法可以完善的點:
去除停用詞(主要是標點符號的影響)
針對中文進行分析,按照詞比較是不是要比按照字比較效果更好?
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用python能有所幫助,如果有疑問大家可以留言交流。
其他參考資料:
https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance
http://www.coli.uni-saarland.de/courses/LT1/2011/slides/Python-Levenshtein.html#Levenshtein-inverse
相關(guān)文章
python中的單下劃線與雙下劃線以及絕對導(dǎo)入與相對導(dǎo)入
這篇文章主要介紹了python中的單下劃線與雙下劃線以及絕對導(dǎo)入與相對導(dǎo)入說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11