从大字典中匹配子字符串的最快方法

时间:2015-09-30 16:55:46

标签: python algorithm search text substring

我有一些(通常是<300个符号长度)字符串,如'aabbccdcabcbbacdaaa'。

有python词典,其中键是类似格式的字符串,例如'bcccd',密钥长度从10到100个符号不等。该词典有五十万项目。

我需要将我的初始字符串与字典值匹配,或者发现字典中没有正确的值。匹配条件:字典键应该在字符串内(严格匹配)。

在计算速度方面,最好的方法是什么? 我觉得应该有一些棘手的方法来哈希我的初始字符串和字典键,以便应用一些聪明的子字符串搜索方式(如Rabin-Karp或Knuth-Morris-Pratt)。或者后缀树状结构可能是一个很好的解决方案吗?

3 个答案:

答案 0 :(得分:4)

刚刚找到了Aho-Corasick for Python的合理实现 - pyahocorasick。摘自页面末尾的示例:

import ahocorasick
A = ahocorasick.Automaton()

for k, v in your_big_dict.iteritems():
    A.add_word(k, v)

A.make_automaton()
for item in A.iter(your_long_string):
    print(item)

答案 1 :(得分:1)

您可以使用以下格式:

for key in your_dictionary:
    if key in your_string:
        print(key+' is in both your string and the dictionary. It has the value '+str(your_dictionary[key]))

如果您希望以任何方式更改此内容,请在评论中告诉我,我们将很乐意更新。

答案 2 :(得分:1)

def search(string, dict_search):
    # If those 2 lines are too expensive, calculate them and pass as arguments
    max_key = max(len(x) for x in dict_search)
    min_key = min(len(x) for x in dict_search)

    return set(
        string[x:x+i] 
        for i in range(min_key, max_key+1)
        for x in range(len(string)-i+1)
        if string[x:x+i] in dict_search
    )

运行:

>>> search('aabbccdcabcbbacdaaa', {'aaa', 'acd', 'adb', 'bccd', 'cbbb', 'abc'})
{'aaa', 'abc', 'acd', 'bccd'}