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
包中的不同功能,看看哪种功能最适合您的情况。
我有一个字符串要与候选人列表进行匹配。这是一个例子:
# 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
包中的不同功能,看看哪种功能最适合您的情况。