映射字符串的功能是否有助于更快地解析字符串?

时间:2013-03-27 02:23:14

标签: python regex string dictionary

我正在建立一个词汇词典,可以帮助我根据语音和拼写法查找英语单词。这本词典将帮助我找到我需要教孩子的英语单词的具体例子。

为此,我制作了一个包含大约200k字键的大型Python字典,其价值就是它们的语音。

要查找单词,例如,带有最终 -aK * e 字形的单词,其中K *将是任意数量的辅音,我可以使用正则表达式解析所有键。

然而,我认为实际映射单词会更加聪明,就像写在网格中一样。所以我可以“标记”所有最终字母为 -e 的单词,依此类推。因此,当我查找单词时,我可以简单地调用这些书签,并确保有一个点击,每次减少要解析的单词数量,因为我通过多个条件搜索,如上例所示。

我的策略真的有意义吗?或者正在使用正则表达式来实现它?

我没有时间编程,在我花费宝贵的时间打字之前,我想要一些专家建议。谢谢。

1 个答案:

答案 0 :(得分:2)

tries确实能够非常快速有效地回答这些问题。有点不清楚你是否总是从单词的结尾或从头开始搜索,但是如果两者都是一点点,那么你将不得不为两个方向构建尝试。如果你需要在中间找到匹配,那么trie都不会有帮助。

反向索引(如那些支持搜索引擎的索引)有时通过将单词存储为字符n-grams来解决此问题,然后在n-gram之间存储连接信息以构建单词。例如,'溢出'可能被分解为'ove','rfl'和'ow',并且某些元数据存在于某处,注意到存在组合这三个n-gram的单词。以不同的方式分解每个单词可以实现前导和尾随通配符查询,尽管我在细节上模糊: - /

或者考虑这个事实,除非性能真正对此应用程序至关重要,否则使用正则表达式可能足够快(并且可能会进一步优化)字典大小,非常简单。使用80k字词典进行快速和肮脏的测试:

with open('dictionary.txt') as fin:
    words = fin.read().strip().split('\n')

import re
import time
expr = re.compile(r'a[^aeiouy]+e$', re.I)

# Of course, this extends easily to using a dictionary, too
def bench():
    start = -time.time()
    matches = [word for word in words if expr.search(word)]
    return start + time.time()

在我的电脑上花了大约50毫秒,为了简单明了地使用正则表达式和你有限的时间,我认为这是值得的。