2015-07-13 5 views
5

рассмотреть следующие строки:Сортировка строк на основе сходства

  • он ДСО
  • прощай
  • привет
  • = (до свидания)
  • (он) (LLO)
  • до свидания
  • гелий

Я пытаюсь сортировать их таким образом, что подобные слова приходит вместе, я знаю

  1. alphanumerical sorting не вариант
  2. удаления специальных символов ",-_ and etc то сравнение, безусловно, полезно, но результаты не будут как я надеюсь.

Примечание:

там может быть несколько различных желанной Ouput для этого, один из которых является:

DESIRED ВЫВОД:

  1. привет
  2. он LLO
  3. (он) (LLO)
  4. гелия
  5. прощай
  6. до свидания
  7. = (до свидания)

поэтому мой вопрос в том, что если есть Java пакет, который сравнивает строки, и в конечном счете, сортировать их на основе в теме .

Я слышал о таких терминах, как n-gram и skip-gram, но не совсем понял их. Я даже не уверен, могут ли они быть полезными для меня вообще.

ОБНОВЛЕНИЕ: Обнаружение сходства, безусловно, является частью моего вопроса, но главной проблемой является сортировка.

+2

Возможный дубликат [Сравнение строк сходства в Java] (http://stackoverflow.com/questions/955110/similarity-string-comparison -in-java) – dognose

+0

Возможно, область, которую вы ищете, - это НЛП, обработка естественного языка, поскольку вы упоминаете 'hello' (' helium') и 'goodbye' в соединении. Алгоритм soundex установлен, но не поможет с пробелами. –

+0

@dognose thx для ссылки, я могу видеть ее очень полезную для сравнения. но этот подход ограничивает сортировку. как его можно использовать для сортировки? – nafas

ответ

4

Вот один из возможных подходов.

Подсчитайте edit distance/Levenshtein distance между каждой парой строк, а затем вы используете просмотр строк как полный график, где весы ребер поступают с расстояния редактирования. Выберите пороговое значение для этих весов и удалите все весы, которые высоки. Затем найдите cliques на этом графике. Если ваш порог будет довольно низким, возможно, даже поиск подключенных компонентов будет вариантом.

Примечание: Возможно, было бы лучше заменить какое-либо расстояние редактирования одним из способов подобия в ссылке, которую отправил @dognose. Также обратите внимание, что поиск кликов будет очень медленным, если у вас есть большое количество строк

+0

Я использовал клики подход для некоторых подобных проблем раньше, это, безусловно, работает. но, как вы упомянули, это может быть очень медленным. к сожалению, для меня у меня около 10 мил + данных. так что клика будет не в порядке – nafas

+0

Как насчет того, как найти подключенные компоненты? – Simon

+0

Проблема может возникнуть, если у нас есть A-B и B-C и A-D, но не A-C, а не B-D, тогда как мы решаем, как их сортировать? – nafas

Смежные вопросы