【问题标题】:How to compare two paragraphs of text?如何比较两段文字?
【发布时间】:2013-03-01 05:06:18
【问题描述】:

我需要删除包含许多段落的文本中的重复段落。

我使用 java.security.MessageDigest 类中的函数来计算每个段落的 MD5 哈希值,然后将这些哈希值添加到 Set 中。

如果add()'ed成功,则表示最新的段落是重复的。

这样有风险吗?

除了String.equals(),还有其他办法吗?

【问题讨论】:

  • 我认为这是一种更好的方法,而不是进行字符串比较。
  • 我同意拉文德拉的观点。 MD5 不会产生唯一的哈希值。
  • 他们需要完全匹配还是忽略前导/尾随空格?
  • @SachinKainth md5 如何在相同的输入下产生不同的哈希值?
  • 我想,这没问题。但是,由于标点符号和其他特殊字符,即使消息相同,哈希值也可能会有所不同。如果这是可以接受的;这个解决方案没问题。

标签: java string compare md5 paragraph


【解决方案1】:

在散列之前,您可以规范化段落,例如删除标点符号,转换为小写并删除额外的空格。 规范化后,仅存在差异的段落将获得相同的哈希值。

【讨论】:

    【解决方案2】:

    如果 MD5 散列尚未在集合中,则表示该段落是唯一的。但事实并非如此。因此,如果您发现哈希已经在集合中,您可能可能有一个具有相同哈希值的非重复项。这不太可能发生,但您必须针对所有其他段落测试该段落才能确定。对于那个 String.equals 就可以了。

    此外,您应该很好地考虑您所谓的唯一性(关于错字、空格、大写等),但任何方法都是如此。

    【讨论】:

      【解决方案3】:

      无需计算 MD5 哈希,只需使用 HashSet 并尝试将字符串本身放入此集合中。这将使用 String#hashCode() 方法计算字符串的哈希值并检查它是否已经在集合中。

      public Set removeDuplicates(String[] paragraphs) {
          Set<String> set = new LinkedHashSet<String>();
          for (String p : paragraphs) {
              set.add(p);
          }
          return set;
      }
      

      使用LinkedHashSet 甚至可以保持段落的原始顺序。

      【讨论】:

        【解决方案4】:

        正如其他人所建议的那样,您应该注意,标点符号、空格、换行符等方面的微小差异可能会使您的哈希值在本质上相同的段落中有所不同。

        也许您应该考虑一个不那么脆弱的指标,例如。 Cosine Similarity 非常适合匹配段落。

        干杯,

        【讨论】:

          【解决方案5】:

          我认为这是一个好方法。但是,有一些事情要记住:

          1. 请注意,计算哈希是一项繁重的操作。如果您不得不重复数百万个段落,这可能会使您的程序变慢。
          2. 即使采用这种方式,您最终也可能会发现稍有不同的段落(例如,有拼写错误)而无法检测到。如果是这种情况,您应该在计算哈希之前对段落进行规范化(将其转换为小写,删除多余的空格等)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-17
            • 1970-01-01
            • 2017-06-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-17
            相关资源
            最近更新 更多