我需要删除包含许多段落的文本中的重复段落。
我使用类java.security.MessageDigest
中的函数来计算每个段落的MD5哈希值,然后将这些哈希值添加到Set
。
如果成功add()
,则表示最新段落是重复段落。
这样有风险吗?
String.equals()
除外,还有其他办法吗?
答案 0 :(得分:2)
在散列之前,您可以将段落标准化,例如删除标点符号,转换为小写并删除其他空格。 规范化后,只有不同的段落会得到相同的哈希值。
答案 1 :(得分:1)
如果MD5哈希值尚未出现在集合中,则表示该段落是唯一的。但事实恰恰相反。因此,如果您发现散列已经在集合中,则可能具有相同散列值的非重复。这是不太可能的,但你必须对所有其他人测试该段以确定。对于String.equals会这样做。
此外,你应该很好地考虑你所谓的独特之处(关于拼写错误,空格,大写字母等),但任何方法都是如此。
答案 2 :(得分:1)
无需计算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
甚至保留段落的原始顺序。
答案 3 :(得分:1)
正如其他人所建议的那样,你应该知道标点符号,空格,换行符等的微小差异可能会使你的哈希值与基本相同的段落不同。
也许您应该考虑一个不太脆弱的指标,例如。 Cosine Similarity非常适合匹配段落。
干杯,
答案 4 :(得分:0)
我认为这是一个好方法。但是,有一些事情要记住: