计算两个字符串之间距离的算法

时间:2016-02-14 18:16:39

标签: python string levenshtein-distance

是否有任何字符串距离算法没有考虑到单词的顺序?

以下算法未给出所需的结果(在该示例中,所需结果应为1):

[0][0], [0][1], ... [0][n]

制作它的一种方法是按字母顺序排列字符串,然后再使用上述算法:

import jaro
jaro.jaro_winkler_metric(u'Michael Jordan',u'Jordan Michael')
>>>0.47

import Levenshtein
Levenshtein.ratio('Michael Jordan', 'Jordan Michael')
>>>0.5

from difflib import SequenceMatcher
SequenceMatcher(None, 'Michael Jordan', 'Jordan Michael').ratio()
>>>0.5

但是这里姓名和姓氏的信息丢失了,不会有“稳定”的结果。

我使用''.join(sorted('Michael Jordan')) >>>' JMaacdehilnor' ''.join(sorted('Jordan Michael')) >>>' JMaacdehilnor' 中的permutations创建了一个函数,该函数接受所有可能的单词编译并比较字符串并输出最大值。结果令人满意,但是当我必须比较数百万个名字时,整个程序真的很慢。

可以做的其他事情是对诸如以下的词进行排序:

itertools

似乎很好的方式和简单的方法来减少计算,但我们放松了一些敏感的情况。例如:

' '.join(sorted('Michael Jordan'.split()))
>>>'Jordan Michael'
' '.join(sorted('Jordan Michael'.split()))
>>>'Jordan Michael'

这两个名字是相同的,有些人将'他们的名字'从'b'翻译成'mp'(我就是其中之一)。用这种方式我们就失去了这个'匹配'。

是否有任何字符串距离算法比较单词并且不考虑单词的顺序?或者是否有建议如何有效地实现所需的功能?

3 个答案:

答案 0 :(得分:3)

尝试fuzzywuzzy

安装:

pip install fuzzywuzzy
pip install python-Levenshtein

使用顺序无关紧要:

fuzz.token_sort_ratio(u'Michael Jordan',u'Jordan Michael')
>>100

答案 1 :(得分:0)

尝试转换为小写,然后排序。使用原始字符串排序的问题是python看到大写的顺序更高。 (如果你要去levenshtein距离,这个空间应该不是问题)

>>> ''.join(sorted('Michael Jordan'.lower()))
' aacdehijlmnor'

然后使用.index()方法获取子字符串位置。 (您也可以使用使用re模块的this answer并使其更具可变性)

答案 2 :(得分:0)

您可以对两个字符串进行标记(例如,使用NLTK标记器),计算每个字对之间的距离并返回所有距离的总和。