Проверьте, насколько String звучит как другой в Java
Я хотел бы знать, существует ли какой-либо класс в Java, способный, используя свои собственные критерии, проверить, насколько String равен другому. Пример:
William Shakespeare / William Shakespeare : might be 100%
William Shakespe**a**re / William Shakespe**e**re : might have above 90%
William Shakespeare / Shakespeare, William : might have above 70% (just examples)
9 ответов
Как правило, существует алгоритм Левенштейна, который просто выводит, сколько операций вставки / обновления / удаления вам нужно будет выполнить (символьно), чтобы преобразовать одну строку в другую. У класса Apache StringUtils есть реализация.
Я вижу двух основных кандидатов:
- Кодировка Soundex, реализованная Apache Commons. Однако обратите внимание, что он в основном предназначен для одиночных, относительно коротких слов. Это не найдет сходства в вашем третьем примере. Кроме того, это действительно работает только для английских слов.
- Расстояние Левенштейна (снова введено в Apache Commons). Это не зависит от языка, но сходство для переключаемых частей, как в вашем третьем примере, будет относительно низким (более 40%). Модификации, такие как расстояние Дамерау – Левенштейна, могут дать лучшие результаты.
Вы должны использовать "мягкую" строковую метрику:
- SOUNDEX
- Metaphone
- Расстояние Хемминга
- Расстояние Левенштейна
- ...
Есть много других, см. String Metrics для обзора.
Лучший алгоритм сильно зависит от проблемной области. Например, SoundEx деградирует для восточноевропейских имен, а расстояние Хэмминга не очень вам помогает, если вы хотите сравнить сходство слов "реального мира".
Это называется SoundEx, поиск java soundex для нескольких реализаций.
Одним из них является Apache Soundex, который выглядит хорошо (хотя я сам не использовал его).
Сопоставление строк очень специфично для проблемы, потому что в большинстве случаев у вас будут одинаковые характеристики шума в строках, которые будут сопоставляться, будь то дополнительная пунктуация, опечатки или орфографические ошибки. Вам нужно будет найти алгоритм, который подходит для проблем ваших входных данных, если вы делаете это в широком масштабе.
Soundex даст вам некоторую уверенность в том, что две строки звучат одинаково, но вам, возможно, придется сначала выполнить некоторую предварительную очистку (например, удалить знаки препинания и разбить строку на строки на отдельные слова).
Лучшее, что вы можете сделать, это запустить тест, есть огромное количество различных алгоритмов, которые вы можете использовать, отличным является levenshtein, как и soundex (хотя ваш пробег зависит от вашей проблемной области). К тому же, есть два варианта этих двух алгоритмов.
Я предлагаю взглянуть на библиотеки симметрии и второй строки, которые имеют множество реализаций сопоставления строк (из двух я предпочитаю вторую библиотеку строк).
Похоже, вам предстоит решить интересную проблему, удачи!
Попробуйте SimMetrics- библиотеку с открытым исходным кодом, включая SoundEx и ChapmanMatchingSoundex, которая даст гораздо лучший результат для приведенных примеров. то есть, будет ли Shake vs Shake, будет ли этот подход использовать подход сравнения поверх SoundEx. Другая метрика, которую вы, возможно, захотите попробовать, которая, хотя и не очень хорошая фонетическая оценка, независимо (если не лучше в разных задачах по сопоставлению имен), это метрика q-Grams в той же библиотеке.