Какие есть хорошие способы найти «родство» двух тел текста? - PullRequest
7 голосов
/ 31 августа 2009

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

Какие есть хорошие способы сделать это? Существуют ли известные алгоритмы для этого, которые являются хорошими, есть ли какие-либо решения GPL и т. Д.?

Мне не нужно это запускать в реальном времени, так как я могу все пересчитать. Меня больше интересует получение хороших результатов, чем время выполнения.

Я просто подумал, что спрошу сообщество переполнения стека, прежде чем писать и писать свои собственные вещи. Должны быть люди, которые уже нашли хорошие решения для этого.

Ответы [ 7 ]

2 голосов
/ 31 августа 2009

Эти статьи о семантическом родстве и семантическом сходстве могут быть полезны. И этот ТАК вопрос о латентном семантическом анализе .

Вы также можете поискать в Soundex слова, которые "звучат одинаково" фонетически.

2 голосов
/ 31 августа 2009

Я никогда не использовал его, но вы можете посмотреть на Расстояние Левенштейна

1 голос
/ 31 августа 2009

Джефф говорил о чем-то подобном на касте стручков, чтобы найти связанные вопросы, перечисленные здесь с правой стороны. ( в подкасте 32 )

Один большой совет заключался в удалении всех общих слов , таких как "the", "this" и т. Д. Это даст вам более значимые слова для сравнения.

А вот аналогичный вопрос Существует ли алгоритм, который сообщает семантическое сходство двух фраз

0 голосов
/ 01 сентября 2009

Фонетические алгоритмы

В статье Beyond SoundEx - функции нечеткого поиска в MS SQL Server показано, как установить и использовать библиотеку SimMetrics в SQL Server. Эта библиотека позволяет найти относительное сходство между строками и включает в себя множество алгоритмов.

В итоге я использовал Jaro Winkler для сопоставления имен. Вот дополнительная информация, где я спросил о соответствующих именах в SO: Соответствующие записи на основе персонального имени

Несколько алгоритмов, основанных на Расстояние Левенштейна , также доступны в библиотеке SimMetric и, вероятно, будут полезны в вашем приложении.

0 голосов
/ 31 августа 2009

См. Заметки курса Мэннинга и Рагхавана о MinHashing и поиске похожих предметов, а также C # (?) Версия . Я полагаю, что методы получены из исследований Уллмана и Мотвани.

0 голосов
/ 31 августа 2009

Это вполне выполнимо для разумных больших текстов, но сложнее для небольших текстов.

Я сделал это однажды так, и это сработало довольно хорошо:

  • Отфильтровать все "общие" слова (например, a, an, in и т. Д.) (Отфильтровывает около 10-30% слов)
  • Подсчитайте частоты оставшихся слов, сохраните вершину x наиболее часто встречающихся слов, это ваши темы.
  • В качестве дополнительного шага вы можете создать группы из 2/3/4 последующих слов и сравнить их с группами в других текстах. Я использовал это как меру для плагиата.
0 голосов
/ 31 августа 2009

Эта книга может быть актуальной.

Редактировать: вот связанный ТАК вопрос

...