我正在建立一个词汇词典,可以帮助我根据语音和拼写法查找英语单词。这本词典将帮助我找到我需要教孩子的英语单词的具体例子。
为此,我制作了一个包含大约200k字键的大型Python字典,其价值就是它们的语音。
要查找单词,例如,带有最终 -aK * e 字形的单词,其中K *将是任意数量的辅音,我可以使用正则表达式解析所有键。
然而,我认为实际映射单词会更加聪明,就像写在网格中一样。所以我可以“标记”所有最终字母为 -e 的单词,依此类推。因此,当我查找单词时,我可以简单地调用这些书签,并确保有一个点击,每次减少要解析的单词数量,因为我通过多个条件搜索,如上例所示。
我的策略真的有意义吗?或者正在使用正则表达式来实现它?
我没有时间编程,在我花费宝贵的时间打字之前,我想要一些专家建议。谢谢。
答案 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毫秒,为了简单明了地使用正则表达式和你有限的时间,我认为这是值得的。