如何在Python中获得字符串相似度的概率?
我想要一个十进制值,如0.9(表示90%),最好使用标准Python和库。
例如:
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
如何在Python中获得字符串相似度的概率?
我想要一个十进制值,如0.9(表示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
SequenceMatcher
和python-Levenshtein
模块。https://dev59.com/C2w15IYBdhLWcg3wT6H2 - ssoler更可靠,它还可以自定义
sorted(... .get_matching_blocks())[-1] > min_match`检查。 - ThorSummonerget_closest_matches
)的关注。它是一个便利函数,可能正是你正在寻找的,也就是说请阅读文档!在我的特定应用程序中,我正在进行一些基本的错误检查/向用户提供错误输入的报告,并且这个答案允许我向他们报告潜在的匹配项以及“相似度”是多少。不过,如果你不需要显示相似度,请务必查看get_closest_matches
。 - svenevs优点:
内置的Python库,无需额外安装包。
缺点:太过有限,还有许多其他适用于字符串相似度的好算法。
>>> from difflib import SequenceMatcher
>>> s = SequenceMatcher(None, "abcd", "bcde")
>>> s.ratio()
0.75
这是一个非常好的库,覆盖面广且问题很少。 它支持以下功能:
优点:
易于使用,支持多种算法,经过测试。
缺点:不是内置库。
示例:
>>> 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
jellyfish
很棒。截至今天,jellyfish
使用本地库(具有纯 Python 回退)。 - Kevin SmythTheFuzz
是一个用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
您可以创建如下函数:
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))
if self.similar(search_string, item.text()) > 0.80:
可以工作了。谢谢。 - answerSeeker请注意,difflib.SequenceMatcher
仅仅 找到最长连续匹配的子序列,这通常不是所需的结果,举个例子:
>>> a1 = "Apple"
>>> a2 = "Appel"
>>> a1 *= 50
>>> a2 *= 50
>>> SequenceMatcher(None, a1, a2).ratio()
0.012 # very low
>>> SequenceMatcher(None, a1, a2).get_matching_blocks()
[Match(a=0, b=0, size=3), Match(a=250, b=250, size=0)] # only the first block is recorded
在生物信息学中,找到两个字符串之间的相似性与成对序列比对的概念密切相关。为此,有许多专用库可供使用,包括biopython。以下示例实现了Needleman Wunsch算法:
>>> from Bio.Align import PairwiseAligner
>>> aligner = PairwiseAligner()
>>> aligner.score(a1, a2)
200.0
>>> aligner.algorithm
'Needleman-Wunsch'
使用 Biopython 或其他生物信息学软件包比 Python 标准库中的任何部分都更加灵活,因为可以使用许多不同的评分方案和算法。此外,您实际上可以获取匹配序列以可视化发生的情况:>>> alignment = next(aligner.align(a1, a2))
>>> alignment.score
200.0
>>> print(alignment)
Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-
|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-
App-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-el
包 distance 包括 Levenshtein 距离:
import distance
distance.levenshtein("lenvestein", "levenshtein")
# 3
标准化、度量、相似度和距离
(标准化) 相似度和距离
度量距离
BLEU评分
BLEU,即双语评估替补,是用于比较文本候选翻译和一个或多个参考翻译的评分。
完全匹配得分为1.0,而完全不匹配得分为0.0。
虽然最初是用于翻译领域,但它可以用来评估自然语言处理任务套件生成的文本。
代码:
import nltk
from nltk.translate import bleu
from nltk.translate.bleu_score import SmoothingFunction
smoothie = SmoothingFunction().method4
C1='Text'
C2='Best'
print('BLEUscore:',bleu([C1], C2, smoothing_function=smoothie))
C1='Test' C2='Test'
BLEUscore: 1.0
C1='Test' C2='Best'
BLEUscore: 0.2326589746035907
C1='Test' C2='Text'
BLEUscore: 0.2866227639866161
您还可以比较句子相似度:
C1='It is tough.' C2='It is rough.'
BLEUscore: 0.7348889200874658
C1='It is tough.' C2='It is tough.'
BLEUscore: 1.0
如果输入的内容很大,内置的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