Простое введение в N-Gram
Вступление
Возможно, вы видели функцию предложения слов на своем смартфоне. Когда вы вводите одно слово, клавиатура понимает, что вы набираете, и предлагает следующее подходящее слово. Если вы выберете предложенное слово, оно будет предлагать еще одно, еще и еще одно, пока у вас не получатся эти забавные предложения.
Это простая концепция, известная как языковое моделирование. Итак, языковое моделирование читает письменный текст и пытается присвоить вероятность следующему слову. Давайте посмотрим на пример.
Интуитивно предположим, что у нас есть 100 слов, которые нужно рассмотреть для следующего слова, языковая модель принимает во внимание предыдущее слово и дает вероятность этим 100 словам. Затем он может предоставить пользователям 3 основных варианта в рамках функции предложения слов. Теперь дадим формальное определение LM.
Языковая модель
Обычно языковая модель известна как способ придания вероятности предложению.
Но ждать! Разве ранее мы не упоминали, что LM присваивает вероятность следующему слову? Давайте разберем приведенное выше уравнение, чтобы разобраться в этом подробнее.
Как вы можете видеть в уравнении 1, LM не только может присвоить вероятность следующему данному слову, но также может дать вероятность всему предложению. Тогда LM сможет понять, какое предложение может звучать хорошо, а какое - нет.
Классно, правда? Но что скрывается за такой потрясающей функцией? Есть много способов создать эту языковую модель. В этом посте мы рассмотрим простой метод под названием n-грамм.
N-грамм
Одна из ключевых идей заключается в том, что ngram просматривает только n слов за раз. Давайте поработаем с примером «кошка села на циновку».
Предположим, что n = 2 (также известное как биграмма), он попытается предсказать второе слово на основе первого. Например:
- кошка: Биграм пытается запомнить, что после «the» следует «cat».
- кошка сидела: после слова «кошка» следует «сидеть».
- сидел: после слова «сидел» он означает «включен»
То же самое и с n = 3. Что касается слов «кот сидел», триграмма знает, что «сат» идет после «кот». Думаю, вы поняли идею.
Эта концепция масштабируется до n слов (n-грамма). Итак, как ngram узнает обо всех этих шаблонах? Это теория вероятностей.
Биграмма
Для простоты рассмотрим случай биграммы. Из приведенного выше примера мы знаем, что «кошка» стоит после «», что можно обозначить как P (cat | the).
P (cat | the): вероятность того, что следующим словом будет «кошка» с учетом слова «the».
Чтобы вычислить эту вероятность, просто используйте приведенную ниже формулу.
где c (кот) - количество вхождений слова «кот» во всем корпусе. То же самое и с c (the). Интуитивно это уравнение говорит следующее: Сколько из всех слов «the» следует за словом «cat»? И вуаля, теперь у нас есть P (cat | the) .
Биграмма против триграммы
Биграмма проста и довольно эффективна, но во многих случаях она не работает. Например:
В начале предложения модель видит «то», за которым следует «кот». Если мы используем биграмму и полагаемся только на одно предыдущее слово, очень трудно догадаться, что подчеркиваемое слово - это «мат», поскольку оно, вероятно, снова порождает «кот». К счастью, триграмма или 4 грамма могут решить эту проблему. т.е. если мы видим «сидел на», более вероятно, что следующее слово будет «мат».
Однако это не означает, что чем длиннее рассматриваемая последовательность, тем лучше прогноз. Для 6-граммовой, например, не очень часто можно увидеть точное «кошка села на». Таким образом, это не очень эффективно.
В большинстве случаев чаще всего используются биграмма и триграмма.
Отклонение и интерполяция
Также бывают случаи, когда ваш набор данных невелик и 3-граммовый не может распознать некоторые точные слова; Таким образом, вероятность равна 0. Это сделает вашу 3-граммовую реализацию бесполезной.
Вы легко можете сделать простое if-else и использовать 2 грамма на случай, если 3 грамма не помогут. Или используйте 1 грамм в случае, если 2 грамма не помогут. Это называется отступление.
Другой метод, интерполяция, позволяет одновременно рассматривать разные диаграммы. Идея состоит в том, чтобы придать вес (λ) вашему n-грамму, чтобы ваша 3-граммовая модель могла также учитывать значение 2-грамма и 1-грамма. т.е.
- 60% на 3 грамма
- 35% на 2 грамма
- 05% на 1 грамм
Настраивайте вес вручную, пока не почувствуете, что это правильно. Вы также можете использовать автоматический метод, но мы не будем останавливаться на этом в этой статье. Вы можете обратиться к this для получения дополнительной информации о том, как правильно установить эти веса.
Реализация
Теперь давайте попробуем использовать эту LM для создания предложения на основе случайного начального слова. Для этой задачи мы воспользуемся Сценарий фильма Гарри Поттер и философский камень для обучения нашей ngram. Код ниже вы также можете найти в этом ядре.
Затем мы можем подсчитать частоту униграммы, биграммы и триграммы. Это будет использоваться позже для вычисления вероятности.
Теперь, когда мы можем подсчитать n-грамм, мы можем вычислить его вероятность. Мы будем использовать линейную интерполяцию 0,01, 0,4 и 0,5 соответственно для 1 грамма, 2 грамма и 3 грамма.
Попробуем составить 20 слов. Начальные будут рандомизированы, и выберем лучшее следующее слово.
Итак, как это будет работать? Ниже представлены результаты каждого поколения.
Generation #1: protecting the stone , but i think i 'll be a wizard . . . . . . . . Generation #2: platform 9 3/4 ? think you 're going to be the same . . . . . . . Generation #3: sacrifice himself , he 's got a little bit . . . . . . . . . . .
Заключение
N-грамм - это простой, но мощный метод моделирования языка, просто глядя на 2–3 слова. Это довольно практично во многих приложениях, например, при предложении слов на мобильном устройстве, благодаря простоте и скорости вычислений. Однако N-грамм не является надежным, когда дело доходит до генерации длинного предложения, где текущее слово зависит от самого первого слова в предложении. Эта долгосрочная зависимость больше подходит для такой модели, как нейронная сеть, но это тема для более поздней публикации.