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

 天使骨头_799 发布于 2023-02-02 19:21

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

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

    一种蛮力的方式,从文本列表中搜索每个单词.

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

有更好的解决方案吗?

我正在使用python虽然我不确定是否会改变算法.

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

我搜索了SO并看到了两个类似的问题,其中一个问题提出了一个哈希表,但我想得到任何关于我想到的优化的指示.

以下是有关SO的先前提问题 -

是否有一种有效的算法来执行反向全文搜索?

搜索另一个大型列表中的大量单词列表

编辑:我刚刚发现另一个关于SO的问题是关于同样的问题.

文本中多字匹配的算法

我想没有比哈希表更好的解决方案了.但我真的想优化它,以便对单词列表的更改可以让我在快速存储的所有文本上运行算法.我应该更改添加到问题的标签还包括一些数据库技术吗?

1 个回答
  • 还有不是一个哈希表更好的解决方案.如果您要在大量文本中搜索一组固定的单词,那么您使用Aho-Corasick字符串匹配算法的方式就是这样.

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

    你可以用正则表达式做类似的事情.例如,您可能希望在某些文本中找到"dog","cat","horse"和"skunk"等字样.您可以构建正则表达式:

    "dog|cat|horse|skunk"
    

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

    但是,正则表达式的结果和Aho-Corasick算法的结果存在差异.例如,如果你在字符串"我的业力吃了你的教条"中搜索"dog"和"dogma"这两个词.正则表达式库搜索将报告发现"教条".Aho-Corasick实施将报告在同一位置找到"狗"和"教条".

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

    正则表达式也将报告部分单词的匹配.也就是说,如果你正在寻找"狗",它会在"教条"中找到它.但是你可以修改正则表达式只给出整个单词.通常情况下,这完成了\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
    

    2023-02-02 19:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有