查找两个字符串之间的匹配百分比,同时考虑单词的顺序 - Python
Find match percentage between two strings also taking intro consideration the order of the words - Python
我正在寻找一种方法来输出两个字符串(例如:名称)之间的匹配百分比,同时还考虑到它们可能相同但单词的顺序不同。
我尝试使用 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 顺序不同。
在我上面提到的情况下,有没有其他方法可以匹配字符串并获得更高的匹配率。还应考虑到名称可能包含两个以上的单词。
谢谢!
这取决于您对增强匹配的期望。如果你认为第二个应该是1.0,那么很简单:将字符串拆分成单词,对单词进行排序,然后应用SM(SequenceMatcher
)。如果你想对排序进行匹配惩罚,你可以使用任何转换函数来测量两个单词列表之间的距离,并将其用作最终匹配的一个因素。
这对您有帮助吗?
您可以使用其他字符串相似度算法。相似性算法的选择广泛基于使用情况。谨慎选择!
因此,库 textdistance has many text distance algorithms. The best for your case would be to use Sorensen dice similarity or Jaccard 相似度。
代码:
import textdistance as td
a = "john doe"
c = "doe john"
print(td.sorensen.normalized_similarity(a,c))
输出:
1.0
我正在寻找一种方法来输出两个字符串(例如:名称)之间的匹配百分比,同时还考虑到它们可能相同但单词的顺序不同。 我尝试使用 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 顺序不同。
在我上面提到的情况下,有没有其他方法可以匹配字符串并获得更高的匹配率。还应考虑到名称可能包含两个以上的单词。
谢谢!
这取决于您对增强匹配的期望。如果你认为第二个应该是1.0,那么很简单:将字符串拆分成单词,对单词进行排序,然后应用SM(SequenceMatcher
)。如果你想对排序进行匹配惩罚,你可以使用任何转换函数来测量两个单词列表之间的距离,并将其用作最终匹配的一个因素。
这对您有帮助吗?
您可以使用其他字符串相似度算法。相似性算法的选择广泛基于使用情况。谨慎选择!
因此,库 textdistance has many text distance algorithms. The best for your case would be to use Sorensen dice similarity or Jaccard 相似度。
代码:
import textdistance as td
a = "john doe"
c = "doe john"
print(td.sorensen.normalized_similarity(a,c))
输出:
1.0