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

StackOverflow https://stackoverflow.com/questions/62328

  •  09-06-2019
  •  | 
  •  

Вопрос

входные данные:фраза 1, фраза 2

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

Это было полезно?

Решение


Возможно, вы захотите ознакомиться с этой статьей:

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

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

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

С уважением,

Мэтт.

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Попробуй SimService Симсервис, который предоставляет сервис для вычисления top-n похожих слов и сходства фраз.

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

Взгляните на http://mkusner.github.io/publications/WMD.pdf В этой статье описывается алгоритм под названием Word Mover distance, который пытается выявить семантическое сходство.Он полагается на оценки сходства, продиктованные word2vec.Интеграция этого с GoogleNews-vectors-negative300 дает желаемые результаты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top