Подтвердить что ты не робот

Проверьте, насколько строка звучит как другая в 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)
4b9b3361

Ответ 1

Как правило, существует алгоритм levenshtein, который просто выводит количество операций вставки/обновления/удаления, которые вы должны выполнить ( characterwise), чтобы преобразовать одну строку в другую. Apache StringUtils класс имеет реализацию.

Ответ 2

Я вижу двух основных кандидатов:

  • Soundex кодировка, реализованная Apache Commons. Однако обратите внимание, что это в основном предназначено для одиночных, относительно коротких слов. Он не найдет сходства в вашем третьем примере. Кроме того, он действительно работает только для английских слов.
  • расстояние Левенштейна (снова реализовано в Apache Commons). Это языковой агностик, но сходство для коммутируемых частей, как в вашем третьем примере, будет относительно низким (более 40%). Модификации, такие как расстояние Дамерау-Левенштейна, могут дать лучшие результаты.

Ответ 3

Вы должны использовать "мягкую" строковую метрику:

Есть много других, см. String Metrics для обзора.

Лучший алгоритм сильно зависит от проблемного поля. Например, SoundEx ухудшается для восточноевропейских имен, а расстояние Хэмминга не очень помогает вам, если вы хотите сравнить сходство слов "реального мира".

Ответ 5

Это называется SoundEx, lookup java soundex для нескольких реализаций.

один из них apache soundex, который выглядит хорошо (хотя я сам его не использовал).

Ответ 7

Вы можете попробовать SoundEx алгоритм.

Ответ 8

Совпадение строк очень проблематично, потому что большую часть времени у вас будут одинаковые характеристики шума в ваших строках, которые должны быть сопоставлены, будь то дополнительная пунктуация, опечатки или орфографические ошибки. Вам нужно будет найти алгоритм, который подходит для проблем с вашими входными данными, если вы делаете это в широких масштабах.

Soundex даст вам уверенность в том, что две строки звучат одинаково, но сначала вам придется сначала сделать чистую очистку (например, удаление пунктуации и токенирование строки в отдельные слова).

Лучшее, что вы можете сделать, это запустить тест, есть огромное количество различных алгоритмов, которые вы можете использовать, а levenshtein - отличный, как и soundex (хотя ваш пробег будет отличаться в зависимости от вашей проблемной области). Существуют также варианты этих двух алгоритмов, BTW.

Я предлагаю взглянуть на simmetrics и вторая строка, которые имеют множество реализаций соответствия строк (из них я предпочитаю вторую библиотеку строк).

Похоже, у вас есть интересная проблема для решения, удачи!

Ответ 9

попробуйте SimMetrics - библиотека с открытым исходным кодом, включая SoundEx и ChapmanMatchingSoundex, которые дадут гораздо лучший результат для приведенных примеров. то есть Shake vs Shake, будет ли этот подход использовать подход, соответствующий вершине SoundEx. Другой показатель, который вы, возможно, захотите попробовать, который, хотя и не является фонетическим, очень хорошо независимо (если не лучше в разных задачах сопоставления имен), является метрикой q-Grams в той же библиотеке.