Проверьте, насколько String звучит как другой в Java - PullRequest
13 голосов
/ 17 марта 2010

Я хотел бы знать, есть ли в 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 ]

14 голосов
/ 17 марта 2010

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

  • Кодировка Soundex , реализованная Apache Commons . Однако обратите внимание, что он в основном предназначен для одиночных, относительно коротких слов. Это не найдет сходства в вашем третьем примере. Кроме того, он действительно работает только для английских слов.
  • Расстояние Левенштейна (Снова реализовано на Apache Commons ). Это не зависит от языка, но сходство для переключаемых частей, как в третьем примере, будет относительно низким (более 40%). Такие изменения, как расстояние Дамерау – Левенштейна , могут дать лучшие результаты.
7 голосов
/ 17 марта 2010

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

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

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

6 голосов
/ 17 марта 2010

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

2 голосов
/ 17 марта 2010

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

2 голосов
/ 17 марта 2010

Похоже на SoundEx , реализация доступна в Apache Commons .

2 голосов
/ 17 марта 2010

Это называется SoundEx, поиск Java Soundex для нескольких реализаций.

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

2 голосов
/ 17 марта 2010

Вы можете использовать: Класс Soundex

0 голосов
/ 18 марта 2010

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

0 голосов
/ 17 марта 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...