【问题标题】:How to match one word or 2,3,4,5-consecutive words between two documents?如何在两个文档之间匹配一个单词或 2,3,4,5-连续单词?
【发布时间】:2014-11-10 00:18:54
【问题描述】:

我有两个文本文档,并且想要获取两个文档之间的单词匹配。单词可以匹配任何地方——例如,doc1的word#5可以匹配doc2的word#3和word#67;然后 doc1 的 word#23 可以再次匹配 doc2 的 word#3 和 word#67 - 所以我想要所有匹配项。此外,除了一个单词匹配之外,我还希望在两个文档之间获得连续的多个(2 个单词、3 个单词 ....15 个单词等)单词匹配。我应该如何在 Java 中解决这个问题?我一直在研究正则表达式,但仍然不相信确切的方法。

【问题讨论】:

  • 简单的暴力匹配,通过对每个单词运行循环,然后是每对单词等等。正则表达式似乎提供了一种有效执行此操作的方法,但无法理解该方法。

标签: java text matching


【解决方案1】:

首先,您需要将文档分成 n 个单词的字符串(1 个单词、2 个单词、3 个单词、...、n 个单词)——这些字符串称为 n-gram。参考here

其次,从文档 A 创建一组 n-gram。然后,对于文档 B 中的每个 n-gram,检查它是否在集合中。

【讨论】:

    【解决方案2】:

    我建议您为每个文档维护一个单个单词的树集,遍历第一个树集并检查与第二个树集的匹配项应该可以完成您的任务。

    对于多个单词部分,使用相同的技巧只获取两个单词组,例如

    word1 word2 word3 yay!
    

    获取word1 word2 并将其放入树集中,然后获取word2 word3 并执行相同操作。您可以使用正则表达式来删除标点符号,因此该算法应包括三个步骤:

    1. 从标点符号中清除文档
    2. “索引”单词和连续单词组
    3. 比较阶段

    关于第 1 点要小心,因为例如这些短语是相同的:

    我吃了,猫没吃,我吃了

    我吃了猫,不是吗?做了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多