匹配给定文本文件中的大量条目

时间:2016-09-14 17:15:32

标签: text string-matching

我正在尝试匹配给定文本文件中的条目列表。这个名单非常庞大。它是一个组织名称列表,其中名称可以包含多个单词。每个文本文件都是一种常用的文章,有几个段落,每个文本总共大约5000个单词。它是一个纯文本内容,我没有明确的界限可以找到组织名称。

我正在寻找一种方法,通过该方式在文本文件中搜索列表中的所有条目,并识别和标记匹配的任何条目。

是否有任何工具或框架可以执行此操作?

我试图浏览维基百科中列出的所有文本挖掘工具,但似乎都没有符合这一需求。

任何输入都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

方法1:有限状态机

您可以将搜索词组合成有限状态机(FSM)。然后,生成的FSM可以在线性时间内同时扫描文档中的所有术语。由于FSM可以在每个文档上重复使用,因此创建它的费用将在您必须搜索的所有文本上摊销。

一个好的正则表达式库将成为一个封闭的FSM。编写构建自己的代码可能超出了Stack Overflow答案的范围。

基本思想是从正则表达式开始,该表达式是所有搜索词的替代。假设您的组织列表包含" cat"和#34;狗"。您将这些组合为cat|dog。如果您还必须搜索"粉红猪",您的正则表达式将为cat|dog|pink pigs

从正则表达式中,您可以构建图形。图表的节点是状态,用于跟踪您刚刚看到的文本。图形的边缘是转换,它告诉状态机给定当前状态和输入中的下一个字符的状态。有些州被标记为" final"状态,如果你遇到其中一个,你刚刚找到了你的一个组织的实例。

从除了最简单的正则表达式之外的所有正则表达式构建图形是繁琐的,并且计算成本很高,因此您可能希望找到一个经过良好测试的正则表达式库,它已经完成了这项工作。

方法2:一次搜索一个术语

根据您拥有的搜索字词数,您拥有的文档数量以及简单文本搜索工具的速度(可能是次线性),最好只循环使用这些术语并搜索每个文档术语作为单独的命令。这当然是最简单的方法。

for doc in documents:
   for term in search_terms:
       search(term, doc)

请注意,以这种方式嵌套循环可能对磁盘缓存最友好。

如果这是一次性任务,我会采取这种方法。如果您必须继续搜索新文档(或使用不同的搜索词列表),这可能会太昂贵。

方法3:后缀树

将所有文档连接成一个巨大的文档,构建后缀树,对搜索词进行排序,并遍历后缀树以查找匹配项。构建和使用后缀数组的大部分细节都在Jon Bentley article from Dr. Dobb's中,但您也可以找到许多其他资源。

这种方法是内存密集型的,主要是缓存友好的,因此非常快。

答案 1 :(得分:1)

使用前缀树又称Trie。

将所有候选人名称加载到前缀树中。 对于您的文档,将它们与树匹配。

前缀树看起来大致如下:

{}
+-> a
|   +-> ap
|   |   +-> ... apple
|   +-> az
|       +-> ... azure
+-> b
    +-> ba
        +-> ... banana republic