【问题标题】:Is there a standard way in Python to fuzzy match a string with arbitrary list of acceptable values?Python中是否有一种标准方法可以将字符串与任意可接受值列表进行模糊匹配?
【发布时间】:2013-04-11 23:41:54
【问题描述】:

我希望有这样的功能:

def findSimilar(string, options):
    ....
    return aString

其中aString 类似于传递的字符串,但存在于options 中。我正在使用这个函数来规范来自我正在开发的玩具应用程序的用户输入。我读过有关使用 levenshtein distance 的信息,但我决定在这里问一下,因为我希望 Python 标准库中有一个简单的解决方案。

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只有在发布者已经尝试自己解决问题时才会提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、堆栈跟踪、编译器错误 - 不管是什么适用的)。您提供的详细信息越多,您可能收到的答案就越多。
  • @MartijnPieters 我正在寻找一个更“主观”的答案。因为我完全不知道如何编写这个答案。
  • 对于“相似”,您是指最多的共同字符(dg 类似于 djgk),还是具有最大共同字符串的字符(fghi 类似于 abcdefg)

标签: python string python-2.7


【解决方案1】:

使用difflib.get_close_matches

get_close_matches(word,可能性[, n][, cutoff])

返回最佳“足够好”匹配的列表。 word 是需要紧密匹配的序列(通常是字符串),并且 可能性是匹配单词的序列列表 (通常是字符串列表)。

【讨论】:

    【解决方案2】:

    计算 Levenshtein 距离:

    http://en.wikipedia.org/wiki/Levenshtein_distance

    已经有python实现了,虽然我不知道它们的质量...

    【讨论】:

      【解决方案3】:

      我想你可能想看看这篇文章。你只需要一个模糊字符串比较器。

      https://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison

      【讨论】:

        【解决方案4】:

        我建议使用fuzzywuzzy Seat Geek。他们有一个很棒的功能叫做 process 可以完全满足您从他们的网站上寻找的功能,但适合您的问题:

            string = "new york jets"
            options = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
            process.extract(string, options, limit=2)
        [('New York Jets', 100), ('New York Giants', 78)]
        

        【讨论】:

        • 请注意,按照建议,fuzzywuzzy 使用 Levenshtein 距离。
        【解决方案5】:

        根据您的问题描述,您不需要任何类型的字符串相似性,您只需要知道输入字符串是否在列表中。为此,只需使用一个集合,并测试该字符串是否在集合中,如下所示:

        def isStringAcceptable(string, set):
            return string in set
        

        如果你想容忍用户输入错误的字符串,你需要决定你要容忍什么样的错误。使用诸如 Levinshtein distance 之类的东西可能对你想要的东西来说太过分了,而且它可能会给你带来有趣的结果。如果您只想检查大小写,请致电string.lower() 并确保您的集合中的所有字符串都是小写的。您可能不需要像字符串相似度指标这样花哨的东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-21
          相关资源
          最近更新 更多