查找两个字符串之间的匹配百分比,同时考虑单词-Python的顺序

查找两个字符串之间的匹配百分比,同时考虑单词-Python的顺序,python,algorithm,string-matching,sequencematcher,Python,Algorithm,String Matching,Sequencematcher,我正在寻找一种方法来输出两个字符串(例如:名称)之间的匹配百分比,同时也考虑到它们可能相同,但单词的顺序不同。 我尝试使用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,

我正在寻找一种方法来输出两个字符串(例如:名称)之间的匹配百分比,同时也考虑到它们可能相同,但单词的顺序不同。 我尝试使用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
除了第二个结果外,我对所有结果都满意。我注意到它没有考虑到cis包含与a相同的单词,但顺序不同

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


谢谢大家!

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


这有助于推动您前进吗?

您可以使用其他字符串相似性算法。相似性算法的选择通常是基于使用情况。小心选择

因此,该库有许多文本距离算法。对于您的案例,最好使用相似性或相似性

代码:

输出:

1.0

如果你必须给出一个数字,
john doe
doe john
有多相似?要警惕误报。我认识一个叫“蛋白石克拉克”的女人和一个叫“克拉克蛋白石”的男人。为了简单起见,我假设约翰·多伊和多伊·约翰是同一个人,不在乎假阳性。谢谢。如果你要假设“xy”等于“yx”,那么在匹配之前只需对字符串中的单词进行排序。嗨!首先谢谢你的回答。我将看一看您提出的算法,以确定哪种算法最适合我的情况。但我有一个问题:如果两个弦的长度不同,那么Sonrensen是如何工作的?例如,一个可能是“John Doe”,另一个可能是“John Jack Doe”。为了简化事情,我们假设是同一个人,忽略潜在的误报。再次感谢。@calin.bule它基于集合的交集。请阅读链接中的内容以了解更多详细信息。对于不同的长度,它肯定会有较低的分数。嗨!谢谢你的回答。我不知道如何计算单词列表之间的距离。你能详细说明一下吗?如果你不知道如何计算距离,那么你需要做一些研究——看看张贴指南和毗湿奴德夫的参考资料。再次你好。它确实起到了作用。我从字符串中删除了特殊字符,然后将它们拆分为单词。不过,与SequenceMatcher进行了比较,因为我在公司的计算机上工作,我可以安装Anaconda,但不能安装任何未随附的软件包。将字数最少的字符串与字数相同的其他字符串的排列进行比较。最后的结果是最高的比赛。它适用于人名,但由于行数较多,执行起来需要很多时间。我正在进行并行执行。好的。。。那么您的应用程序比字符串对的单个检查更复杂?如果重复执行此操作,则只需对所有名称进行一次排序。然后在名称长度上使用“groupby”来标识用于相互检查的类。如果您需要找到所有最高匹配的组合,这将进入图形距离领域。
1.0