【问题标题】:I want to read a string with multiple names and match them with names in a list Python我想读取具有多个名称的字符串并将它们与列表 Python 中的名称匹配
【发布时间】:2020-11-30 21:17:20
【问题描述】:

在 Python 中,我收到一串姓氏和姓氏,例如“Jmes Mai, Richard Hammond Jrmy Clarkson”。这些是用户输入,因此我无法验证它们是否会用逗号分隔或拼写正确。用户还可以根据需要填写任意数量的名称。此外,我还有一个列表,其中包含 +- 200 个用户可以选择的人名。

我现在要做的是从大列表中列出与用户选择的名称最匹配的这些名称。因此,在上面的示例中,我希望输出为 [James May, Richard Hammond, Jeremy Clarkson](鉴于这些存在于大量名称中。)

到目前为止,我已经尝试在所有可能的子字符串中切割字符串。并使用来自fuzzywuzzy 包的process.extract 以一种将所有子字符串匹配并放入列表的方式强制解决此问题。删除此重复项后。这样做的问题是它会产生很多误报并且需要很长时间,所以我想知道是否有更好的方法来做到这一点。

提前谢谢你!

def match_names(s):
    lst = []
    for name in names:
        for tup in process.extract(name.lower(), options(s)):
            if tup[1] > 95:
                if name not in lst:
                    lst.append(name)
    return lst

【问题讨论】:

  • 你听说过Levenshtein距离吗?
  • 补充@ombk 的建议,这里有一个很好的article George Pipis 写的关于如何在Python 中构建自动更正。
  • @ombk 是的,我想到了这一点,它的作用与 process.extract 函数大致相同。问题在于围绕字符串匹配算法的实现。感谢您的回复!

标签: python string-matching fuzzywuzzy


【解决方案1】:

尝试使用 difflib 库并导入 get_close_matches,如下所示:

from difflib import get_close_matches
for i, j in zip(len(name), len(lst)):
    if len(get_close_matches(name,lst[i])>0):
        'Do what ever you wish here'

【讨论】:

  • 我不明白在这种情况下应该是什么名字。关键是一个字符串中有多个名称。此外,在 Python 中无法获取字符串和列表的范围。您的意思是列表和名称字符串的长度吗?
  • 是的,我的错,现在试试。我给了你一个方向,所以你可以自己思考你的例子的答案。
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2019-06-24
相关资源
最近更新 更多