【问题标题】:How to hash strings in python to match within 1 character?如何在python中散列字符串以匹配1个字符?
【发布时间】:2013-02-13 15:29:38
【问题描述】:

我读过 LSH 散列,想知道匹配 1 个字符内的字符串的最佳实现是什么?

test = {'dog':1, 'cat': 2, 'eagle': 3} 

test['dog']
>> 1

如果我查找 test['dogs'] 或 test['dogg'],我也想返回 1。我意识到如果我要查找“log”或“cog”它也会返回 1,但我可以编写一个方法来排除这些结果。

此外,我如何进一步使用此方法让一般字符串返回 X 个字符内的匹配项?

string1 = "brown dogs"
string2 = "brown doggie"

假设我的字典中只存储了 string1,那么查找 string2 将返回 string1。

谢谢

【问题讨论】:

  • 简而言之,你不能。哈希表是错误的工具。
  • 那行不通,因为你描述的不是equivalence relation
  • 那么您是否要获取与给定键最相似的键的值?对吗?
  • @SLaks 我不知道这与等价关系有什么关系。
  • @freakish:哈希表的键比较(哈希函数)必须是等价关系。

标签: python string search hash


【解决方案1】:

好吧,您可以通过它们共有的开头长度来定义 2 个字符串之间的相似性(例如,dogadogs 为 3)。这很简单,但可以满足您的需求。

有了这个假设,你可以这样定义:

>>> test = {'dog':1, 'cat': 2, 'eagle': 3}
>>> def same_start(s1, s2):
    ret = 0
    for i in range(min(len(s1), len(s2))):
        if s1[i] != s2[i]:
            break
        ret += 1
    return ret

>>> def closest_match(s):
    return max(((k, v, same_start(k, s)) for k, v in test.iteritems()), key=lambda x: x[2])[1]

>>> closest_match('dogs')  # matches dog
1
>>> closest_match('cogs')  # matches cat
2
>>> closest_match('eaogs') # matches eagle
3
>>> 

【讨论】:

    【解决方案2】:

    也许您可以尝试使用 Soundex 函数作为您的字典键?

    【讨论】:

      【解决方案3】:

      由于您的关系不是 1:1,也许您可​​以使用重新定义的 __getitem__ 定义自己的 dict 类型,这可以返回可能项目的列表。这就是我的意思:

      class MyDict(dict):
        def __getitem__(self, key):
          l = []
          for k, v in self.items():
            if key.startswith(k): # or some other comparation method
              l.append(v)
          return l
      

      这只是一个想法,可能其他 dict 方法也应该重新定义以避免可能的错误或无限循环。此外,如果您只想返回一项而不是列表,@Emmanuel's answer 在这里可能非常有用,这样您就不必重新定义所有内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        • 2019-06-26
        • 2020-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多