1

我正在寻找一种在两个字符串(例如:名称)之间输出匹配百分比的方法,同时还考虑到它们可能相同但单词的顺序不同。我尝试使用 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 is 包含与 a 相同但顺序不同的单词。

在我上面提到的情况下,有没有其他方法可以匹配字符串并获得更高的匹配百分比。还应考虑到名称可能包含两个以上的单词。

谢谢!

4

2 回答 2

2

这取决于您对增强匹配的期望。如果您认为第二个应该是 1.0,那么它很简单:将字符串拆分为单词,对单词进行排序,然后应用 SM ( SequenceMatcher)。如果您想对排序进行匹配惩罚,您可以使用任何转换函数来测量两个单词列表之间的距离,并将其用作最终匹配的一个因素。

这有助于推动你前进吗?

于 2018-10-31T17:42:00.197 回答
1

您可以使用其他字符串相似性算法。相似性算法的选择广泛基于使用情况。谨慎选择!

因此,库textdistance有许多文本距离算法。最适合您的情况是使用Sorensen 骰子相似度或Jaccard相似度。

代码:

import textdistance as td

a = "john doe"
c = "doe john"
print(td.sorensen.normalized_similarity(a,c))

输出:

1.0
于 2018-10-31T17:52:20.457 回答