Python 字符串相似度(有复杂度)

Python string similarity (with complexity)

我有一个字符串要与候选人列表进行匹配。这是一个例子:

# ignore case
string = "The Shining" # The Stanley Kubrick Movie
candidates = ['Shining', 'The shins', 'Shining, The'] 
most_similar(string, candidates)
==> 'Shining, The'

做一个"literal string comparison",我通常在这种情况下使用Levenshtein distance或比率。但是,我想做一个更复杂的相似性测试,以便上述情况下的最佳匹配是 Shining, The

我猜这是一个可能已得到广泛解决的常见问题,所以我想知道 library/tool/etc。可能是获得我想要做的事情的最佳方式?

您正在寻找 gensim or fuzzywuzzy 包。

在这种特定情况下,您可能倾向于 fuzzywuzzy,因为您只是想进行字符串匹配。

gensim 更多地用于计算文档、段落、句子、单词、语料库等的相似度分数和矢量表示...目的是捕获 semantic/topical 含义而不是文字字符串匹配.

所以在你的情况下,使用模糊字符串匹配,你可以这样做:

from fuzzywuzzy import fuzz

fuzz.partial_ratio('Shining', 'The shins')
>>> 50 

fuzz.partial_ratio('Shining', 'Shining, The')
>>> 100

fuzz.partial_ratio('Shining', 'unrelated')
>>> 14

partial_ratio 函数区分大小写,因此您可能希望将所有输​​入小写。它会输出 0 到 100 之间的分数(100 是非常强的匹配)。这取决于您如何从那里过滤掉匹配项,也许使用阈值:if score > 75: its a match

我建议查看 fuzzywuzzy 包中的不同功能,看看哪种功能最适合您的情况。