Algorithm 在文本中搜索单词列表的算法
我有一个单词列表,非常小,大约1000个左右。我想检查该列表中的任何单词是否出现在输入文本中。如果是这样的话,我想知道发生了什么。输入文本是几百个单词,这些都是来自网络的文本段落——这意味着有很多来自不同网站的段落。我正试图找到它的最佳算法 我可以看到两种明显的方法--Algorithm 在文本中搜索单词列表的算法,algorithm,search,Algorithm,Search,我有一个单词列表,非常小,大约1000个左右。我想检查该列表中的任何单词是否出现在输入文本中。如果是这样的话,我想知道发生了什么。输入文本是几百个单词,这些都是来自网络的文本段落——这意味着有很多来自不同网站的段落。我正试图找到它的最佳算法 我可以看到两种明显的方法-- 一种强力搜索文本列表中每个单词的方法 从输入文本中创建一个单词哈希表,然后从哈希表中的列表中搜索每个单词。这很快 有更好的解决办法吗 我正在使用python,但我不确定这是否会改变算法 此外,作为对上述解决方案2的优化,我希望将
"dog|cat|horse|skunk"
然后对文本运行正则表达式匹配。如何获得所有匹配项将取决于特定的正则表达式库,但它确实有效。对于非常大的单词列表,您可能需要编写代码来读取单词并生成正则表达式,但这并不十分困难,而且效果也很好
不过,正则表达式的结果与Aho-Corasick算法的结果有所不同。例如,如果您正在搜索字符串“我的因果报应吃掉了您的教条”中的单词“dog”和“dogma”。正则表达式库搜索将报告找到“dogma”。Aho Corasick实施将报告在同一位置发现“狗”和“教条”
如果您想让Aho-Corasick算法只报告整个单词,您必须稍微修改算法
Regex也会报告部分单词的匹配。也就是说,如果你在搜索“狗”,它会在“教条”中找到它。但是您可以修改正则表达式,使其仅给出整词。通常,这是通过\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
“从输入文本中创建一个单词哈希表,然后从哈希表中的列表中搜索每个单词。这很快。有更好的解决方案吗?”这种方法有什么问题?你为什么不满意呢?(你试过了吗?)这是我能想到的最好的解决办法。我只是想看看是否有更好的解决办法。我已经试过了,所以我正在考虑我解释过的我想添加到它中的优化。在我深入研究优化之前,我想确保没有其他我没有考虑的解决方案。