Есть ли алгоритм, который говорит о семантическом сходстве двух фраз?
Ввод: фраза 1, фраза 2
вывод: значение семантического сходства (между 0 и 1), или вероятность того, что эти две фразы говорят об одном и том же
11 ответов
Вы можете проверить эту статью:
Сходство предложений на основе семантических сетей и корпусной статистики (PDF)
Я реализовал описанный алгоритм. Наш контекст был очень общим (фактически любые два предложения на английском языке), и мы обнаружили, что выбранный подход был слишком медленным и результаты, хотя и многообещающие, не достаточно хороши (или, вероятно, будут такими без значительных, дополнительных усилий).
Вы не даете много контекста, поэтому я не могу рекомендовать это, но чтение статьи может быть полезным для вас, чтобы понять, как решить проблему.
С Уважением,
Мэтт.
На это есть короткий и длинный ответ.
Краткий ответ:
Используйте пакет WordNet::Similarity Perl. Если Perl не является вашим языком выбора, проверьте страницу проекта WordNet в Принстоне или обратитесь к Google за библиотекой-оболочкой.
Длинный ответ:
Определение сходства слов - сложная проблема, и исследования в этой области все еще очень актуальны. Чтобы вычислить сходство, вам нужно соответствующее представление значения слова. Но что будет означать, скажем, "стул"? На самом деле, что именно означает "стул"? Если вы долго и усердно об этом думаете, это изменит ваше мнение, вы слегка сойдете с ума и, наконец, начнете исследовательскую карьеру в области философии или компьютерной лингвистики, чтобы найти правду ™. И философы, и лингвисты пытались найти ответ буквально тысячи лет, и конца этому не видно.
Поэтому, если вы заинтересованы в более глубоком изучении этой проблемы, я настоятельно рекомендую прочитать главу 20.7 " Обработка речи и языка" Юрафски и Мартина, некоторые из которых доступны через Google Книги. Он дает очень хороший обзор современного уровня методов распределения, которые используют статистику совпадений слов, чтобы определить меру сходства слов. Однако вы вряд ли найдете библиотеки, реализующие их.
Для тех, кто только что пришел, я бы посоветовал взглянуть на SEMILAR - http://www.semanticsimilarity.org/. Они реализуют множество современных методов исследования для расчета сходства слов и предложений. Это написано на Java.
SEMILAR API поставляется с различными методами сходства, основанными на Wordnet, скрытом семантическом анализе (LSA), скрытом распределении дирихле (LDA), BLEU, метеоре, точечной взаимной информации (PMI), методах на основе зависимостей, оптимизированных методах на основе квадратичного назначения и т. Д. методы сходства работают в разных гранулярностях - от слова к слову, от предложения к предложению или к более крупным текстам.
Возможно, вы захотите зарегистрироваться в проекте WordNet в Принстонском университете. Один из возможных подходов к этому состоит в том, чтобы сначала пропустить каждую фразу через список стоп-слов (удалить "общие" слова, такие как "a", "to", "the" и т. Д.) Затем для каждого из оставшихся слов в В каждой фразе вы можете вычислить семантическое "сходство" между каждым словом в другой фразе, используя меру расстояния, основанную на WordNet. Мера расстояния может быть что-то вроде: количество дуг, которые вы должны пройти в WordNet, чтобы перейти от word1 к word2.
Извините, это довольно высокого уровня. Я очевидно никогда не пробовал это. Просто быстрая мысль.
Я бы посмотрел в скрытой семантической индексации для этого. Я считаю, что вы можете создать нечто похожее на индекс поиска в векторном пространстве, но с семантически связанными терминами, находящимися ближе друг к другу, то есть с меньшим углом между ними. Если я узнаю больше, я опубликую здесь.
Извините, что выкопал 6-летний вопрос, но, поскольку я только что наткнулся на этот пост сегодня, я добавлю ответ на случай, если кто-то еще ищет что-то подобное.
cortical.io разработал процесс для вычисления семантического сходства двух выражений, и у них есть демонстрация этого на их веб-сайте. Они предлагают бесплатный API, обеспечивающий доступ к функциональности, поэтому вы можете использовать его в своем собственном приложении, не прибегая к реализации алгоритма самостоятельно.
Одно простое решение состоит в том, чтобы использовать точечное произведение символьных n-граммовых векторов. Это устойчиво по отношению к изменениям порядка (которые не являются многими метриками расстояния редактирования) и фиксирует множество проблем, связанных со стеммингом. Это также предотвращает AI-полную проблему полного семантического понимания.
Чтобы вычислить вектор n-граммы, просто выберите значение n (скажем, 3) и хешируйте каждую последовательность из трех слов в фразе в вектор. Нормируйте вектор на единицу длины, затем возьмите скалярное произведение разных векторов, чтобы обнаружить сходство.
Этот подход был описан в J. Mitchell и M. Lapata, "Композиция в распределительных моделях семантики", Cognitive Science, vol. 34, нет. 8, с. 1388–1429, ноябрь 2010 г., DOI 10.1111/j.1551-6709.2010.01106.x
Я хотел бы взглянуть на статистические методы, которые учитывают вероятность появления каждого слова в предложении. Это позволит вам придавать меньшее значение популярным словам, таким как "и", "или", "the", и придавать большее значение словам, которые выглядят менее регулярно и, следовательно, являются лучшим отличительным фактором. Например, если у вас есть два предложения:
1) Алгоритм Смит-Уотерман дает вам меру сходства между двумя строками. 2) Мы рассмотрели алгоритм Смит-Уотерман и нашли, что он достаточно хорош для нашего проекта.
Тот факт, что эти два предложения разделяют слова "кузнец-водник" и слова "алгоритмы" (которые не так часто встречаются, как "и", "или" и т. Д.), Позволит вам сказать, что эти два предложения действительно могут говорить о той же теме.
Подводя итог, я хотел бы предложить вам взглянуть на: 1) меры сходства строк; 2) статистические методы;
Надеюсь это поможет.
Попробуйте SimService, который предоставляет сервис для вычисления похожих слов и словосочетаний.
Это требует, чтобы ваш алгоритм действительно знал, о чем вы говорите. Это может быть сделано в некоторой элементарной форме, просто сравнивая слова и ища синонимы и т. Д., Но любой точный результат потребует некоторой формы интеллекта.
Взгляните на http://mkusner.github.io/publications/WMD.pdf этой статье описывается алгоритм, называемый расстоянием Word Mover, который пытается раскрыть семантическое сходство. Он опирается на баллы сходства, как диктуется word2vec. Интеграция этого с GoogleNews-vector-отрицательным 300 дает желаемые результаты.