1

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

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

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

但是,我认为将单词实际映射为好像写在网格中会更聪明一些。所以我可以“书签”所有最后一个字母是-e的单词等等。因此,当我查找单词时,我可以简单地调用这些书签并确保获得成功,并且每次都减少要解析的单词数量,因为我像上面的示例一样通过多个条件搜索。

我的策略真的有意义吗?还是使用正则表达式来解决它?

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

4

1 回答 1

2

确实,这tries使得回答这些查询变得非常快速和高效。有点不清楚你是总是从词尾搜索还是从头开始搜索,但如果两者兼而有之,那么你将不得不为两个方向构建尝试。如果您需要在中间找到匹配项,那么这两种尝试都无济于事。

反向索引(例如那些为搜索引擎提供支持的索引)有时会通过将单词存储为字符n-gram来解决此问题,然后存储 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 毫秒,并且为了使用正则表达式的简单性和清晰性以及您有限的时间,我认为这是值得的。

于 2013-03-27T05:28:20.340 回答