algorithm голосования - Есть ли алгоритм, который говорит о семантическом сходстве двух фраз




moore voting (10)

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

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


Answers

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

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


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


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


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


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

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

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

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

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


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

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

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

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

С Уважением,

Мэтт.


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

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

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


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


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

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


Моя интуиция такова:

После k итераций основного цикла вы создали дерево суффикса, которое содержит все суффиксы полной строки, начинающиеся с первых k символов.

В начале это означает, что дерево суффикса содержит один корневой узел, который представляет всю строку (это единственный суффикс, начинающийся с 0).

После итераций len (string) у вас есть дерево суффикса, содержащее все суффиксы.

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

Например, предположим, что вы видели символы abcabc. Активная точка будет представлять точку в дереве, соответствующую суффиксу «abc».

Активная точка представлена ​​(origin, first, last). Это означает, что вы в данный момент находитесь в точке дерева, к которому вы подключились, начиная с начала узла, а затем подавая символы в строке [first: last]

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

Примечание 1: указатели суффиксов дают ссылку на следующее кратчайшее соответствие для каждого узла.

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

Примечание 3: часть канонизации просто экономит время при проверке активной точки. Например, предположим, что вы всегда использовали origin = 0 и просто изменили первый и последний. Чтобы проверить активную точку, вам нужно будет следовать дереву суффикса каждый раз по всем промежуточным узлам. Имеет смысл кэшировать результат этого пути, записывая только расстояние от последнего узла.

Можете ли вы привести пример кода того, что вы подразумеваете под «фиксировать» ограничивающие переменные?

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





algorithm nlp semantics