【问题标题】:Algorithm to search for a list of words in a text搜索文本中单词列表的算法
【发布时间】:2014-02-03 07:11:26
【问题描述】:

我有一个单词列表,大约 1000 个左右。我想检查该列表中的任何单词是否出现在输入文本中。如果是这样,我想知道发生了哪些。输入文本是几百个单词,这些是来自网络的文本段落——这意味着其中有很多来自不同的站点。我正在努力为它找到最好的算法。

我可以看到两种明显的方法来做到这一点--

  1. 从文本列表中搜索每个单词的蛮力方法。

  2. 根据输入文本创建一个单词哈希表,然后从哈希表的列表中搜索每个单词。这很快。

有没有更好的解决方案?

我正在使用 python,但我不确定这是否会改变算法。

作为对上述解决方案 2 的优化,我想将生成的哈希表存储到持久存储 (DB) 中,这样如果单词列表发生更改,我可以重新使用哈希表而无需再次创建它.当然,如果输入文本发生变化,我必须生成哈希表。是否可以将哈希表保存到数据库?有什么建议吗?我目前正在为我的项目使用 MongoDB,我只能在其中存储 json 文档。我是 MongoDB 的新手,刚刚开始使用它,还没有完全了解它的全部潜力。

我搜索了 SO 并看到两个类似问题的问题,其中一个建议使用哈希表,但我想获得任何关于我想到的优化的指针。

这里是之前关于 SO 的问题 -

Is there an efficient algorithm to perform inverted full text search?

Searching a large list of words in another large list

编辑:我刚刚在 SO 上发现了另一个关于相同问题的问题。

Algorithm for multiple word matching in text

我想没有比哈希表更好的解决方案了。但我真的很想对其进行优化,以便对单词列表的更改可以让我对我存储的所有文本快速运行算法。我是否应该更改添加到问题中的标签以包含一些数据库技术?

【问题讨论】:

  • "从输入文本中创建一个单词的哈希表,然后从哈希表的列表中搜索每个单词。这样很快。有没有更好的解决方案?" 这种方法有什么问题?你为什么不满意? (你试过吗?)
  • 这是我能想到的最佳解决方案。我只是想看看是否存在更好的解决方案。我已经尝试过了,所以正在考虑我解释的优化,我想添加到它。在深入研究优化之前,我想确保没有其他我不考虑的解决方案。

标签: algorithm search


【解决方案1】:

比哈希表更好的解决方案。如果您想在大量文本中搜索一组固定的单词,您可以使用Aho-Corasick string matching algorithm

该算法根据您要搜索的单词构建一个状态机,然后通过该状态机运行输入文本,并在找到匹配项时输出匹配项。因为构建状态机需要一些时间,所以该算法最适合搜索非常大的文本体。

你可以用正则表达式做类似的事情。例如,您可能希望在某些文本中查找单词“dog”、“cat”、“horse”和“skunk”。您可以构建一个正则表达式:

"dog|cat|horse|skunk"

然后对文本运行正则表达式匹配。如何获得所有匹配项将取决于您的特定正则表达式库,但它确实有效。对于非常大的单词列表,您需要编写代码来读取单词并生成正则表达式,但这并不难,而且效果很好。

不过,正则表达式的结果和 Aho-Corasick 算法的结果是有区别的。例如,如果您在字符串“My karma ate your dogma”中搜索单词“dog”和“dogma”。正则表达式库搜索将报告发现“教条”。 Aho-Corasick 实现将报告在同一位置找到“dog”和“dogma”。

如果您希望 Aho-Corasick 算法仅报告整个单词,您必须稍微修改算法。

Regex 也会报告部分单词的匹配。也就是说,如果您要搜索“dog”,它会在“dogma”中找到它。但是您可以修改正则表达式以仅给出整个单词。通常,这是通过\b 完成的,如下所示:

"\b(cat|dog|horse|skunk)\b"

您选择的算法很大程度上取决于输入文本的大小。如果输入文本不是太大,您可以创建您要查找的单词的哈希表。然后检查输入文本,将其分解为单词,并检查哈希表以查看该单词是否在表中。在伪代码中:

hashTable = Build hash table from target words
for each word in input text
    if word in hashTable then
        output word

或者,如果您想要输入文本中的匹配单词列表:

hashTable = Build hash table from target words
foundWords = empty hash table
for each word in input text
    if word in hashTable then
        add word to foundWords

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多