找出两个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。 以下是您可能会参考的一些内容:

  1. 海明距离
  2. Levenshtein距离
  3. Damerau-Levenshtein距离
  4. 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