繁体   English   中英

如何比较两段文字?

[英]How to compare two paragraphs of text?

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

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

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

这种方式有风险吗?

除了String.equals() ,有没有其他方法可以做到这一点?

在散列之前,您可以规范化段落,例如删除标点,转换为小写并删除其他空格。 规范化后,只有不同的段落会得到相同的哈希值。

如果MD5哈希尚未在集合中,则表示该段落是唯一的。 但事实恰恰相反。 因此,如果您发现散列已经在集合中,则可能具有相同散列值的非重复。 这是不太可能的,但你必须对所有其他人测试该段以确定。 对于String.equals会这样做。

此外,你应该很好地考虑你所谓的独特之处(关于拼写错误,空格,大写字母等),但任何方法都是如此。

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

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

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

正如其他人所建议的那样,你应该知道标点符号,空格,换行符等的微小差异可能会使你的哈希值与基本相同的段落不同。

也许您应该考虑一个不太脆弱的指标,例如。 余弦相似度非常适合匹配段落。

干杯,

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

  1. 请注意,计算哈希是一项繁重的操作。 如果您不得不重复数百万段,这可能会使您的程序变慢。
  2. 即使以这种方式,你可能会得到一些略有不同的段落(错别字段,例如错别字)。 如果是这种情况,您应该在计算哈希值之前对段落进行规范化(将其放入小写,删除多余空格等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM