如何在Python中获得一个字符串与另一个字符串相似的概率?
我想要得到一个十进制值,比如0.9(意思是90%)等等。最好是标准的Python和库。
e.g.
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
如何在Python中获得一个字符串与另一个字符串相似的概率?
我想要得到一个十进制值,比如0.9(意思是90%)等等。最好是标准的Python和库。
e.g.
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
当前回答
Textdistance:
TextDistance - python库,用于通过多种算法比较两个或多个序列之间的距离。它有Textdistance
30 +算法 纯python实现 简单的使用 两个以上的序列比较 有些算法在一个类中有多个实现。 可选的numpy使用最高速度。
例二:
import textdistance
textdistance.hamming('test', 'text')
输出:
1
Example2:
import textdistance
textdistance.hamming.normalized_similarity('test', 'text')
输出:
0.75
谢谢,干杯!
其他回答
内置的SequenceMatcher在大输入时非常慢,下面是如何用diff-match-patch完成的:
from diff_match_patch import diff_match_patch
def compute_similarity_and_diff(text1, text2):
dmp = diff_match_patch()
dmp.Diff_Timeout = 0.0
diff = dmp.diff_main(text1, text2, False)
# similarity
common_text = sum([len(txt) for op, txt in diff if op == 0])
text_length = max(len(text1), len(text2))
sim = common_text / text_length
return sim, diff
包装距离包括Levenshtein距离:
import distance
distance.levenshtein("lenvestein", "levenshtein")
# 3
如上所述,有许多指标可以定义字符串之间的相似性和距离。我将给出我的5美分,通过展示一个Jaccard与Q-Grams相似的例子和一个编辑距离的例子。
库
from nltk.metrics.distance import jaccard_distance
from nltk.util import ngrams
from nltk.metrics.distance import edit_distance
Jaccard相似
1-jaccard_distance(set(ngrams('Apple', 2)), set(ngrams('Appel', 2)))
我们得到:
0.33333333333333337
还有苹果和芒果
1-jaccard_distance(set(ngrams('Apple', 2)), set(ngrams('Mango', 2)))
我们得到:
0.0
编辑距离
edit_distance('Apple', 'Appel')
我们得到:
2
最后,
edit_distance('Apple', 'Mango')
我们得到:
5
q - grams上的余弦相似度(q=2)
另一个解决方案是使用textdistance库。我将提供一个余弦相似度的例子
import textdistance
1-textdistance.Cosine(qval=2).distance('Apple', 'Appel')
我们得到:
0.5
出于我的目的,我有自己的quick_ratio(),它比difflib SequenceMatcher的quick_ratio()快2倍,同时提供类似的结果。A和b是字符串:
score = 0
for letters in enumerate(a):
score = score + b.count(letters[1])
TheFuzz是一个用python实现Levenshtein距离的包,在某些情况下,当你希望两个不同的字符串被认为是相同的时,它带有一些帮助函数来提供帮助。例如:
>>> 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