Как сравнить два абзаца текста?
Мне нужно удалить дублированные абзацы в тексте со многими абзацами.
Я использую функции из класса java.security.MessageDigest
вычислить значение хеша MD5 каждого абзаца, а затем добавить эти значения хеша в Set
,
Если add()
'успешно завершено, это означает, что последний абзац является дубликатом.
Есть ли такой риск?
Кроме String.equals()
Есть ли другой способ сделать это?
5 ответов
Перед хэшированием вы можете нормализовать абзацы, например удалить пунктуацию, преобразовать в нижний регистр и удалить дополнительные пробелы. После нормализации абзацы, которые отличаются только там, получат одинаковый хэш.
Как и предполагали другие, вы должны знать, что мелкие различия в пунктуации, пробелах, переносах строк и т. Д. Могут сделать ваши хэши разными для абзацев, которые по сути одинаковы.
Возможно, вам следует рассмотреть менее хрупкую метрику, например, например. косинусное сходство, которое хорошо подходит для сопоставления абзацев.
Ура,
Нет необходимости вычислять хеш 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
даже сохраняет первоначальный порядок абзацев.
Если хеша MD5 еще нет в наборе, это означает, что абзац уникален. Но обратное не верно. Таким образом, если вы обнаружите, что хеш уже находится в наборе, вы можете потенциально иметь не дубликат с таким же значением хеша. Это было бы очень маловероятно, но вам придется проверить этот абзац против всех остальных, чтобы быть уверенным. Для этого String.equals будет делать.
Более того, вы должны очень хорошо рассмотреть то, что вы называете уникальным (относительно опечаток, пробелов, прописных и т. Д.), Но это будет иметь место с любым методом.
Я думаю, что это хороший способ. Однако есть некоторые вещи, которые нужно иметь в виду:
- Обратите внимание, что вычисление хеша - сложная операция. Это может сделать вашу программу медленной, если вам придется повторять ее для миллионов абзацев.
- Даже в этом случае вы можете получить несколько другие абзацы (с опечатками, например), идущие undetecetd. Если это так, вы должны нормализовать абзацы перед вычислением хэша (перевод в нижний регистр, удаление лишних пробелов и т. Д.).