Языковая модель для НЛП

Если вы заинтересованы в обработке естественного языка, тогда языковые модели — очень важная и важная часть НЛП, которую вам необходимо понять.

До развития машинного обучения, особенно глубокого обучения, языковые модели строились на основе различных статистических подходов, таких как: языковая модель на основе n-грамм, скрытая марковская модель, на основе правил НЛП и т. д.

Языковые модели настолько полезны в наши дни, что большинство крупных технологических компаний и их очень ценные продукты широко используют их. Google Assistant, Apple Siri, Microsoft Cortana, Amazon Alexa используют языковые модели для разных целей.

Здесь, в этой записи блога, я расскажу о двух типах языковых моделей, которые будут использоваться для автодополнения:
1. Статистическая языковая модель: мы разработаем языковую модель на основе n-gram (tri-gram) с использованием библиотеки nltk Python и свой собственный корпус Reuters.
2. Нейронная языковая модель.Глубокие нейронные сети — это современные технологии, которые можно использовать при разработке языковых моделей. Мы разработаем простую модель LSTM, которую можно использовать для того же.

Содержание:
1. Обзор языковой модели
2. Языковая модель на основе N-грамм
3. Нейронная языковая модель

Обзор языковой модели

Основной концепцией языковой модели является предсказание вероятности последовательности слов или символов. Все приложения, связанные с NLP, такие как машинный перевод, теги POS, распознавание речи и т. д., используют эту концепцию сохранения последовательности слов или символов.

Вероятность («Это очень хорошо») › Вероятность («Это очень ничего») P(‘хорошо’ | ‘Это очень’) эквивалентно P(w4 | w1,w2,w3)

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

См. также:  Как создать змею в Pygame - Часть 2

Немного математики (условная вероятность и цепное правило)

Мы используем цепное правило, чтобы найти совместную вероятность следующего слова/символа с учетом последовательности слов/символов.

Языковая модель на основе N-грамм

N-грамма — это последовательность из n последовательных токенов или слов в корпусе.

Например, если у нас есть такое предложение: среда — хорошее место для блогов, посвященных машинному обучению
Если мы представим приведенное выше предложение, используя один грамм техника будет примерно такой: [среда, это, хорошее, место, для, машины, обучения, блогов]
Если мы представим приведенное выше предложение, используя биграмму, это будет что-то вроде этого: [medium is a, is a, a, a, a, good, good place, place for, for, for, for machine, machine learning, Learning blogs]
Если мы представим приведенное выше предложение, используя tri -gram это будет что-то вроде этого: [среда — это хорошее место, хорошее место для, место для машины, для машинного обучения, блоги по машинному обучению]

Вот так это продолжается.

Мы рассчитаем вероятность, применив цепное правило (img-3 и img-4).
Как я уже упоминалцепное правило вычисляет совместную вероятность последовательности, используя условную вероятность слова с учетом предыдущих слов.
Но вычисление всех условных вероятностей очень сложно и не имеет к ним доступа.
В таком случае мы аппроксимируем контекст слова (an), просматривая последнее слово контекста (an-1).
p(an|a1,a2,a3,a4,…, ан-1) = р(ан|ан-1).

Построение модели n-грамм с использованием python

На данный момент у нас есть общее представление о том, как работает модель n-грамм и вычисляет вероятность, мы построим то же самое на python.
Мы собираемся использовать библиотеку nltk Python и ее корпус Reuters для того же.
Давайте сначала импортируем зависимости.

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

# two history/previous tokens as the key
{('this', 'is'):{'very':2, # third token with out 2
                 'nice':3, # third token with out 3
                 'a':1}}   # third token with out 1

После создания приведенной выше модели (вложенного словаря) мы рассчитаем процентное соотношение каждого третьего токена по отношению к двум предыдущим токенам.
Это поможет нам правильно предсказать результат с помощью вероятностной меры.

См. также:  Как обнаружить циклы на графике

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

Ограничения подхода n-грамм

  1. Как правило, если мы увеличим «n», модель попытается работать лучше, но в конечном итоге нам потребуется больше вычислительной мощности и огромный ресурс памяти (ОЗУ) для того же.
  2. Здесь, в этом подходе, мы строим модель, основанную на вероятности совпадения слов. Это даст нулевую вероятность всем словам, отсутствующим в обучающем корпусе, что совсем не желательно.

Модель нейронного языка

Благодаря развитию глубоких нейронных сетей, в частности рекуррентных нейронных сетей и, в частности, LSTM (ДОЛГАЯ КРАТКОВРЕМЕННАЯ ПАМЯТЬ) , модели нейронного языка становятся очень мощными и современными методами.

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

Разработка модели нейронного языка в Python

Прежде чем приступить к коду, ознакомьтесь со следующими блогами Christopher Olah и Andrej Karpathy на LSTM и RNN.
Эти блоги потрясающе, и я лично предпочитаю читать их в любое время, когда захочу.
Мы создадим языковую модель, которая будет принимать последовательность символов вместо слов и пытаться предсказать следующие символы.

Импортируем необходимые модули

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

В рамках предварительной обработки очищенного текста мы выполним следующие шаги перед подгонкой модели.
1. Теперь мы создадим список последовательностей символов фиксированной длины для обучения языковой модели.
2. Кодирование каждого символа путем присвоения каждому символу уникального номера.
3. Разделение данных на обучающий набор и проверочный набор, где X будет первым n-1 символов, а Y будет n-м символом.

См. также:  Развертывание — Модели ML и DL в Google App Engine с использованием Flask API

Теперь мы готовы запустить нашу модель LSTM.
ПРИМЕЧАНИЕ. В рамках построения модели lstm я использовал двухуровневые сети lstm, и из-за меньшего количества вычислительных ресурсов я использовал очень мало данных для того же. В рамках своей деятельности вы можете играть с моделью, увеличивая или уменьшая количество слоев, изменяя коэффициент отсева, изменяя количество нейронов в каждом слое, чтобы добиться максимальной производительности.

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

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

Репозиторий кода

Вы можете получить набор данных и всю записную книжку ipython здесь, на GitHub.

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: