Расстояние между значениями двух предложений

Я ищу способ измерить семантическое расстояние между двумя предложениями. Предположим, у нас есть следующие предложения:

(S1) The beautiful cherry blossoms in Japan. 
(S2) The beautiful Japan.

S2 создается из S1 путем исключения слов "вишня", "цветет" и "в". Я хочу определить функцию, которая дает большое расстояние между S1 и S2. Причина этого заключается в том, что они действительно имеют разное значение, так как прекрасное модифицирует цветение вишни, а не Японию.

2 ответа

Как указал Роб, это очень сложная проблема. Это требует, чтобы программа не только понимала лингвистическую семантику, но также имела энциклопедические знания. Например, когда мы говорим "Прекрасная вишня в Японии", мы говорим о прекрасной вишне, которая случается в Японии, или мы говорим об одном коллективном объекте "вишни", который красив и случилось в Японии? Это требует сочетания энциклопедических и языковых знаний.

С чисто энциклопедической точки зрения рассмотрим предложения

  1. Красивые вишни в Японии.
  2. Красивая сакура в Японии.
  3. Красивые цветы в Японии.

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

Сказав это, можно сделать немного, основываясь на деревьях разбора предложений. Например, если вы посмотрите на деревья разбора избирательных округов двух предложенных вами предложений, вы сможете разбить их на фразы (NP, VP и т. Д.). Для многих примеров достаточно определить расстояние между двумя предложениями как максимальное расстояние между его составляющими фразами, где расстояние между фразами, в свою очередь, может основываться на лексических базах данных, таких как WordNet, или онтологиях, таких как Yago.

Для WordNet легкодоступным пакетом для измерения семантических расстояний является пакет WS4J на основе Ja va. У них также есть онлайн демо. Эти семантические расстояния основаны на расстоянии пути между двумя терминами в графе онтологий (кроме LESK, который просто вычисляет перекрытие терминов в глоссариях словаря).

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

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

  1. Google универсальный кодировщик предложений.

https://tfhub.dev/google/universal-sentence-encoder/2

  1. Infersent от Facebook

https://github.com/facebookresearch/InferSent

  1. Усреднение слов по векторам.

  2. Spacy также обеспечивает сходство между двумя предложениями на основе векторов слов

https://spacy.io/usage/spacy-101

так далее

Попробуйте модели, основанные на BERT, например,

MoverScore: https://pypi.org/project/moverscore/

что очень хорошо для фиксации семантического сходства двух предложений. Ссылка на статью: https://arxiv.org/abs/1909.02622

Также вы можете поискать такие задачи, как "СТС" (семантическое текстовое подобие).

Другие вопросы по тегам