【问题标题】:Best way to do a fuzzy key lookup in Python?在 Python 中进行模糊键查找的最佳方法是什么?
【发布时间】:2017-12-28 22:25:30
【问题描述】:

我有一个问题,我需要在哈希映射中进行模糊查找,即返回与最接近查询的键对应的值,在我的例子中是通过 Levenshtein 距离测量的。

我目前的方法是使用特殊的查找方法对dict 进行子类化,该方法计算与所有键的 Levenshtein 距离,然后返回得分最低的键的值。基本上是这样的:

import Levenshtein

class FuzzyLookupDict(dict):

    def fuzzy_lookup(self, query):
        levs = [(key, Levenshtein.ratio(query, key)) for key in self.keys()]
        key, score = max(levs, key=lambda lev: lev[1])
        return self.get(key)

这是一个好方法还是我没有想到的更好的解决方案?

【问题讨论】:

  • 除非你能找到一种聪明的方法来索引额外表中的键,否则我认为如果不搜索所有键就不可能做到这一点。

标签: python data-structures hashmap hashtable python-collections


【解决方案1】:

这个问题通常用Levenshtein automata 解决。一个字符串 w 和一个数字 n 的 Levenshtein 自动机是一个有限状态自动机,它可以识别到 Levenshtein 距离 w 的所有字符串的集合最多n。

该算法比使用动态规划为每个字典单词分别计算 Levenshtein 距离要快得多。

Jule Jacob 的博文 Levenshtein automata can be simple and fast 是一个很好的起点,Nick Johnsonz 的 Damn Cool Algorithms: Levenshtein Automata 是更深入的介绍。

您可以在 Github 上找到一些 Python 实现,例如 https://github.com/antoinewdg/pyffs。

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多