微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Python中将Levenshtein距离大于80%的单词分组

如何解决如何在Python中将Levenshtein距离大于80%的单词分组

这将名称分组

from fuzzywuzzy import fuzz

combined_list = ['rakesh', 'zakesh', 'bikash', 'zikash', 'goldman LLC', 'oldman LLC']
combined_list.append('bakesh')
print('input names:', combined_list)

grs = list() # groups of names with distance > 80
for name in combined_list:
    for g in grs:
        if all(fuzz.ratio(name, w) > 80 for w in g):
            g.append(name)
            break
    else:
        grs.append([name, ])

print('output groups:', grs)
outlist = [el for g in grs for el in g]
print('output list:', outlist)

生产

input names: ['rakesh', 'zakesh', 'bikash', 'zikash', 'goldman LLC', 'oldman LLC', 'bakesh']
output groups: [['rakesh', 'zakesh', 'bakesh'], ['bikash', 'zikash'], ['goldman LLC', 'oldman LLC']]
output list: ['rakesh', 'zakesh', 'bakesh', 'bikash', 'zikash', 'goldman LLC', 'oldman LLC']

如您所见,名称已正确分组,但顺序可能不是您想要的。

解决方法

假设我有一个列表:

person_name = ['zakesh','oldman LLC','bikash','goldman LLC','zikash','rakesh']

我试图以这种方式对列表进行分组,以使两个字符串之间的Levenshtein距离最大。为了找出两个单词之间的比例,我使用了python包Fuzzywuzzy

例子 :-

>>> from fuzzywuzzy import fuzz
>>> combined_list = ['rakesh','zakesh','oldman LLC']
>>> fuzz.ratio('goldman LLC','oldman LLC')
95
>>> fuzz.ratio('rakesh','zakesh')
83
>>> fuzz.ratio('bikash','zikash')
83
>>>

我的最终目标:

我的最终目标是对单词进行分组,使它们之间的Levenshtein距离超过80%?

我的清单应如下所示:-

person_name = ['bikash','rakesh','oldman LLC'] because the distance between `bikash` and `zikash` is very high so they should be together.

码:

我正在尝试通过排序来实现这一点,但关键功能应该是fuzz.ratio。下面的代码无法正常工作,但是我正从这个角度解决问题。

from fuzzywuzzy import fuzz
combined_list = ['rakesh','oldman LLC']
combined_list.sort(key=lambda x,y: fuzz.ratio(x,y))
print combined_list

谁能帮我把这些词结合起来,使它们之间的Levenshtein距离超过80%?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。