【问题标题】:Is mapping features of strings helping parsing strings faster?字符串的映射特性是否有助于更快地解析字符串?
【发布时间】:2013-03-17 01:33:38
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 您所描述的内容听起来有点像后缀树(或 trie),这是一种非常标准的方法,可以从大量文本中进行快速查找,只需部分查找值.我想一个正则表达式(至少以你描述的方式)会很慢。

标签: python regex string dictionary


【解决方案1】:

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

反向索引(例如那些为搜索引擎提供支持的索引)有时会通过将单词存储为字符 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 毫秒,为了简单明了地使用正则表达式以及您有限的时间,我认为这是值得的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多