找出两个string之间的相似性百分比
我如何得到一个string在Python中与另一个string相似的概率?
我想要得到一个十进制值,如:
0.9 #means 90%
等等
最好使用标准的Python和库。
例如
similar("Apple","Appel") #would have a high prob. similar("Apple","Mango") #would have a lower prob.
有一个内置的。
from difflib import SequenceMatcher def similar(a, b): return SequenceMatcher(None, a, b).ratio()
使用它:
>>> similar("Apple","Appel") 0.8 >>> similar("Apple","Mango") 0.0
我想也许你正在寻找一个描述string之间距离的algorithm。 以下是您可能会参考的一些内容:
- 海明距离
- Levenshtein距离
- Damerau-Levenshtein距离
- Jaro-Winkler距离
Fuzzy Wuzzy
是一个在python中实现Levenshtein距离的包 ,有些帮助函数可以帮助您在某些情况下可能需要将两个不同的string视为相同。 例如:
>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 91 >>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 100
你可以创build一个如下的函数:
def similar(w1, w2): w1 = w1 + ' ' * (len(w2) - len(w1)) w2 = w2 + ' ' * (len(w1) - len(w2)) return sum(1 if i == j else 0 for i, j in zip(w1, w2)) / float(len(w1))
包裹距离包括Levenshtein距离:
import distance distance.levenshtein("lenvestein", "levenshtein") # 3
解决scheme1:Python内置
使用difflib中的 SequenceMatcher
优点 :本地python库,不需要额外的软件包。
缺点 :太有限了,那里有很多其他的string相似性很好的algorithm。
例如 :
>>> from difflib import SequenceMatcher >>> s = SequenceMatcher(None, "abcd", "bcde") >>> s.ratio() 0.75
解决scheme#2: 水母图书馆
它是一个很好的图书馆,覆盖面很好,问题很less。 它支持:
– Levenshtein距离
– Damerau-Levenshtein距离
– Jaro距离
– Jaro-Winkler距离
– 匹配评估方法比较
– 海明距离
优点 :易于使用,支持algorithm的色域,testing。
缺点 :不是本地库。
例如 :
>>> import jellyfish >>> jellyfish.levenshtein_distance(u'jellyfish', u'smellyfish') 2 >>> jellyfish.jaro_distance(u'jellyfish', u'smellyfish') 0.89629629629629637 >>> jellyfish.damerau_levenshtein_distance(u'jellyfish', u'jellyfihs') 1