我正在寻找一种在两个字符串(例如:名称)之间输出匹配百分比的方法,同时还要考虑它们可能是相同的,但单词顺序不同。 我尝试使用SequenceMatcher(),但结果只是部分令人满意:
a = "john doe"
b = "jon doe"
c = "doe john"
d = "jon d"
e = 'john do'
s = SequenceMatcher(None, a, b)
s.ratio()
0.9333333333333333
s = SequenceMatcher(None, a, c)
s.ratio()
0.5
s = SequenceMatcher(None, a, d)
s.ratio()
0.7692307692307693
s = SequenceMatcher(None, a, e)
s.ratio()
0.9333333333333333
除第二个结果外,我都同意。我注意到,没有考虑到 c 包含与a相同的单词,但以 a 的顺序排列。
在上面提到的情况下,还有其他任何方法可以匹配字符串并获得更高的匹配百分比。还应该考虑到名称可能包含两个以上的单词。
谢谢!
答案 0 :(得分:1)
这取决于您对增强匹配的期望。如果您认为第二个应为1.0,则很简单:将字符串拆分为单词,对单词进行排序,然后 then 应用SM(SequenceMatcher
)。如果您希望对排序进行匹配惩罚,则可以使用任何转换函数来测量两个单词列表之间的距离,并将其用作最终匹配的一个因素。
这有助于您前进吗?
答案 1 :(得分:1)
您可以使用其他字符串相似性算法。相似度算法的选择广泛地基于用法。仔细选择!
因此,库textdistance具有许多文本距离算法。最适合您的情况是使用Sorensen dice相似度或Jaccard相似度。
代码:
import textdistance as td
a = "john doe"
c = "doe john"
print(td.sorensen.normalized_similarity(a,c))
输出:
1.0