Понимание точечной взаимной информации в НЛП

Реализация на Python

Обработка естественного языка (NPL) - это область искусственного интеллекта, целью которой является поиск вычислительных методов для интерпретации человеческого языка в устной или письменной форме. Идея НЛП выходит за рамки простой задачи классификации, которую можно решить с помощью алгоритмов машинного обучения или сетевых сетей глубокого обучения. В самом деле, НЛП - это интерпретация: вы хотите обучить свою модель не только обнаружению часто встречающихся слов, их подсчету или устранению некоторых шумных знаков препинания; вы хотите, чтобы оно сообщало вам, позитивное или негативное настроение разговора, является ли содержание электронного письма простой рекламой или чем-то важным, были ли отзывы о книгах-триллерах в последние годы хорошими или плохими.

Однако обрабатывать слова, документы, темы как числовые данные гораздо сложнее, чем работать с числами или изображениями. Действительно, даже НЛП использует методы глубоких нейронных сетей для решения данной задачи, и, по определению, каждый алгоритм может принимать только числовые переменные в качестве входных данных. Итак, как мы можем «дать количественную оценку» слову?

Идея алгоритма НЛП заключается в переносе слов в векторное пространство, где каждое слово является D-мерным вектором функций. Таким образом, мы можем вычислить некоторые количественные показатели слов и слов между ними, а именно их косинусное сходство. Излишне говорить, что это далеко не исчерпывающее объяснение, поэтому, если вам интересно, я предлагаю это чтение.

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

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

Тем не менее, это непростая задача, поскольку, если оба слова часто встречаются сами по себе, их совместное появление может быть всего лишь случайностью. А именно, подумайте о названии «Лас-Вегас»: не так часто можно читать только «Лас» или «Вегас» (конечно, на английском языке corpora). Мы видим их только в биграмме Лас-Вегаса, поэтому они, вероятно, образуют уникальную концепцию. С другой стороны, если мы подумаем о «Нью-Йорке», легко увидеть, что слово «новый», вероятно, будет очень часто встречаться в разных контекстах. Как мы можем оценить, что совпадение с Йорком значимо, а не так расплывчато, как «новая собака, новая кошка…»?

Ответ кроется в критерии точечной взаимной информации (PMI). Идея PMI заключается в том, что мы хотим количественно оценить вероятность одновременного появления двух слов, принимая во внимание тот факт, что это может быть вызвано частотой встречаемости отдельных слов. Следовательно, алгоритм вычисляет (логарифмическую) вероятность одновременного появления, масштабированную на произведение единственной вероятности возникновения, следующим образом:

Теперь, зная, что, когда 'a' и 'b' независимы, их совместная вероятность равна произведению их предельных вероятностей, когда отношение равно 1 (следовательно, журнал равен 0), это означает, что два слова вместе не совпадают. не образуют уникальной концепции: они возникают случайно.

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

Теперь давайте посмотрим на практическое применение PMI с экспоненциальным, а не с логарифмом. В качестве основного корпуса я загрузил часть первой главы Гарри Поттера и философского камня и сохранил ее в переменной под названием hp.

hp = [line.strip() for line in open('harry_potter.txt', encoding='utf8')]
from nltk.collocations import BigramCollocationFinder, BigramAssocMeasures
from nltk.corpus import stopwords

Затем, как только импортировали необходимые пакеты (подробнее о них вы можете прочитать здесь), я очистил текст от лишних элементов, таких как стоп-слова.

stopwords_ = set(stopwords.words('english'))
words = [word.lower() for word in hp.split() 
         if len(word) > 2 
         and word not in stopwords_]

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

finder = BigramCollocationFinder.from_words(words)
bgm = BigramAssocMeasures()
score = bgm.mi_like
collocations = {'_'.join(bigram): pmi for bigram, pmi in finder.score_ngrams(score)}

Обратите внимание, что метрика, используемая для вычисления PMI, не такая, как указано выше (логарифмическая). Действительно, метод mi_like возвращает другую версию этой оценки, которая является следующей (из официальной документации):

"""Scores ngrams using a variant of mutual information. The keyword         argument power sets an exponent (default 3) for the numerator. No         logarithm of the result is calculated."""

Результаты отсортированы по убыванию, наиболее вероятная пара слов находится вверху. Посмотрим на первые:

collocations

Хорошо, может быть, harder_concentrate и Fall_asleep не так связаны, как нам говорит алгоритм, но, тем не менее, он хорошо поработал с остальными. Плюс учтите, что я тренировал его только на 2106 словах:

len(hp.split())
2106

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

Однако целью этой статьи было дать интуитивное понимание процедуры PMI, а также представление о том, как работать с семантикой и алгоритмами. Ключевой концепцией всегда является найти способ «перевести» в математические концепции то, что люди могут читать между строк. Это означает не только термины и зависимости, но также пословицы, неологизмы, сленг, метафоры и так далее.

Если вам интересна эта тема, вот несколько полезных ссылок: