Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在文本中搜索单词列表的算法_Algorithm_Search - Fatal编程技术网

Algorithm 在文本中搜索单词列表的算法

Algorithm 在文本中搜索单词列表的算法,algorithm,search,Algorithm,Search,我有一个单词列表,非常小,大约1000个左右。我想检查该列表中的任何单词是否出现在输入文本中。如果是这样的话,我想知道发生了什么。输入文本是几百个单词,这些都是来自网络的文本段落——这意味着有很多来自不同网站的段落。我正试图找到它的最佳算法 我可以看到两种明显的方法-- 一种强力搜索文本列表中每个单词的方法 从输入文本中创建一个单词哈希表,然后从哈希表中的列表中搜索每个单词。这很快 有更好的解决办法吗 我正在使用python,但我不确定这是否会改变算法 此外,作为对上述解决方案2的优化,我希望将

我有一个单词列表,非常小,大约1000个左右。我想检查该列表中的任何单词是否出现在输入文本中。如果是这样的话,我想知道发生了什么。输入文本是几百个单词,这些都是来自网络的文本段落——这意味着有很多来自不同网站的段落。我正试图找到它的最佳算法

我可以看到两种明显的方法--

  • 一种强力搜索文本列表中每个单词的方法

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

  • 有更好的解决办法吗

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

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

    我搜索了这么多,看到了两个类似的问题,其中一个建议使用哈希表,但我想得到我心目中的优化的任何指针

    以下是之前就SO提出的问题-

    编辑:我刚刚发现了另一个关于SO的问题,这是关于同一个问题的

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

    有一个比哈希表更好的解决方案。如果要在大量文本中搜索一组固定的单词,则可以使用

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

    您可以使用正则表达式执行类似的操作。例如,您可能希望在某些文本中找到单词“狗”、“猫”、“马”和“臭鼬”。您可以构建正则表达式:

    "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
    

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