Есть ли алгоритм, который говорит семантическое сходство двух фраз - PullRequest
61 голосов
/ 15 сентября 2008

ввод: фраза 1, фраза 2

вывод: значение семантического сходства (между 0 и 1) или вероятность того, что эти две фразы говорят об одном и том же

Ответы [ 11 ]

41 голосов
/ 15 сентября 2008

Возможно, вы захотите проверить этот документ:

Сходство предложений на основе семантических сетей и статистики корпуса (PDF)

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

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

С уважением,

Мт.

32 голосов
/ 07 октября 2008

На это есть короткий и длинный ответ.

Краткий ответ:

Используйте пакет WordNet :: Similarity Perl . Если Perl не является вашим языком выбора, проверьте страницу проекта WordNet в Принстоне или обратитесь к Google для поиска библиотеки-оболочки.

Длинный ответ:

Определение сходства слов - сложная проблема, и исследования в этой области все еще очень актуальны. Чтобы вычислить сходство, вам нужно соответствующее представление , означающее слова. Но что будет означать, скажем, «стул»? На самом деле, что является точным значением слова "стул"? Если вы долго и усердно об этом думаете, это изменит ваше мнение, вы слегка сойдете с ума и, наконец, начнете исследовательскую карьеру в области философии или компьютерной лингвистики, чтобы найти правду ™. И философы, и лингвисты пытались найти ответ буквально тысячи лет, и конца этому не видно.

Итак, если вы заинтересованы в более глубоком изучении этой проблемы, я настоятельно рекомендую прочитать главу 20.7 в Обработка речи и языка Юрафски и Мартина, некоторые из которых доступны через Google Книги . Он дает очень хороший обзор современного уровня методов распределения, которые используют статистику совпадений слов, чтобы определить меру сходства слов. Однако вы вряд ли найдете библиотеки, реализующие их.

7 голосов
/ 16 сентября 2008

Возможно, вы захотите зарегистрироваться в проекте WordNet в Принстонском университете. Один из возможных подходов заключается в том, чтобы сначала пропустить каждую фразу через список стоп-слов (удалить «общие» слова, такие как «a», «to», «the» и т. Д.), Затем для каждого из оставшихся слов В каждой фразе вы можете вычислить семантическое «сходство» между каждым словом в другой фразе, используя меру расстояния, основанную на WordNet. Мера расстояния может быть что-то вроде: количество дуг, которые вы должны пройти в WordNet, чтобы перейти от word1 к word2.

Извините, это довольно высокий уровень. Я очевидно никогда не пробовал это. Просто быстрая мысль.

5 голосов
/ 14 января 2016

Для тех, кто только что пришел, я бы посоветовал взглянуть на SEMILAR - http://www.semanticsimilarity.org/. Они реализуют множество современных методов исследования для расчета сходства слов и предложений. Это написано на Java.

SEMILAR API поставляется с различными методами сходства, основанными на Wordnet, скрытом семантическом анализе (LSA), скрытом выделении дирихле (LDA), BLEU, метеоре, точечной взаимной информации (PMI), методах на основе зависимостей, оптимизированных методах на основе квадратичного назначения, и т. д. И методы сходства работают в разных гранулярностях - от слова к слову, от предложения к предложению или к более крупным текстам.

5 голосов
/ 15 сентября 2008

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

3 голосов
/ 01 октября 2014

Извините, что выкопал 6-летний вопрос, но, поскольку я только что наткнулся на этот пост сегодня, я добавлю ответ на тот случай, если кто-то еще ищет что-то подобное.

cortical.io разработал процесс для вычисления семантического сходства двух выражений, и у них есть демонстрация этого на их веб-сайте . Они предлагают бесплатный API, обеспечивающий доступ к функциональности , так что вы можете использовать его в своем собственном приложении без необходимости самостоятельно реализовывать алгоритм.

3 голосов
/ 15 сентября 2008

Одним из простых решений является использование точечного произведения символьных n-граммовых векторов. Это устойчиво по отношению к изменениям порядка (которые не являются многими метриками расстояния редактирования) и фиксирует множество проблем, связанных со стеммингом. Это также предотвращает проблему полного семантического понимания AI-complete.

Чтобы вычислить вектор n-грамм, просто выберите значение n (скажем, 3) и хэшируйте каждую последовательность из трех слов в фразе в вектор. Нормируйте вектор на единицу длины, затем возьмите скалярное произведение разных векторов, чтобы обнаружить сходство.

Этот подход был описан в J. Митчелл, М. Лапата. Композиция в распределительных моделях семантики. Когнитивная наука. 34, нет 8, с. 1388–1429, ноябрь 2010 г., DOI 10.1111 / j.1551-6709.2010.01106.x

2 голосов
/ 17 января 2013

Попробуйте SimService , который предоставляет сервис для вычисления похожих слов и словосочетаний.

2 голосов
/ 04 июля 2010

Я бы взглянул на статистические методы, которые учитывают вероятность появления каждого слова в предложении. Это позволит вам придавать меньшее значение популярным словам, таким как «и», «или», «the», и придавать большее значение словам, которые выглядят менее регулярно и, следовательно, являются лучшим отличительным фактором. Например, если у вас есть два предложения:

1) Алгоритм Смит-Уотерман дает меру сходства между двумя строками. 2) Мы рассмотрели алгоритм Смит-Уотерман и нашли, что он достаточно хорош для нашего проекта.

Тот факт, что два предложения разделяют слова «кузнец-водник» и слова «алгоритмы» (которые не так часто встречаются как «и», «или» и т. Д.), Позволит вам сказать, что предложения могут действительно говорить на одну и ту же тему.

Подводя итог, я бы посоветовал вам взглянуть на: 1) меры сходства строк; 2) Статистические методы;

Надеюсь, это поможет.

1 голос
/ 15 сентября 2008

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

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