Вычислить вероятность предложения с нехваткой словарного запаса

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

Например, учебный корпус состоит из 3 предложений:

1: я, я, Сэм

2: Сэм, я

3: Я не люблю зеленый, яйца и ветчину

N = 14 (длина корпуса)

Для униграммы я получаю вероятности:

Pr ("i") = # ("i") / N = 3/14, Pr ("am") = 2/14, Pr ("like") = 1/14 и т. Д.

Для биграмм я получаю вероятности:

Pr ("am" | "i") = 2/3, Pr ("do" | "i") = 1/3 и так далее ...

Теперь я пытаюсь вычислить вероятность следующего предложения, в котором не все ngram (uni или bi) появляются в обучающем корпусе:

Я ел буррито

Для униграммы мне понадобятся следующие оценки вероятностей:

Pr («я»), Pr («съел»), Pr («а») и Pr («буррито»)

а для биграммы мне нужны следующие оценки вероятностей:

Pr («съел» | «я»), Pr («а» | «съел»), Pr («буррито» | «а»)

Очевидно, не все униграммы («ел», «буррито») и биграммы (например, («я», «ел»)) появляются в обучающем корпусе.

Я понимаю, что вы можете выполнять сглаживание (например, добавление сглаживания) в следующих случаях:

Например, словарный запас учебного корпуса

i, am, sam, do, not, like, green, egg, and, ham

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

ел буррито

Таким образом, размер расширенного словаря будет V = 13.

Таким образом, для униграммы исходные оценки вероятности Pr (w_i) = # (w_i) / N будут преобразованы в (# (w_i) + 1) / (N + V)

Итак, Pr ("i") = 4/27, Pr ("am") = 3/27, Pr ("sam") = 3/27, Pr ("do") = 2/27, Pr ("not" ) = 2/27, Pr («нравится») = 2/27, Pr («зеленый») = 2/27, Pr («яйца») = 2/27, Pr («и») = 2/27, Pr ("ветчина") = 2/27

И для трех новых слов: Pr ("съел") = 1/27, Pr ("a") = 1/27, Pr ("буррито") = 1/27.

И эти вероятности все равно будут в сумме 1,0.

Хотя это может обрабатывать случаи, когда некоторые nграммы не были в исходном обучающем наборе, вам нужно будет знать набор «новых» слов, когда вы оцениваете вероятности с помощью (# (w_i) + 1) / (N + V) ( V = сумма словаря исходной обучающей выборки (10) и тестового корпуса (3)). Я думаю, это эквивалентно предположению, что вся новая униграмма или биграмма в тестовом корпусе встречается только один раз, независимо от того, сколько раз они на самом деле встречаются.

Мой вопрос: так обычно обрабатываются токены вне словарного запаса при вычислении вероятности предложения?

Модуль NLTK nltk.module.NGramModel, похоже, был удален из-за ошибок nltk ngram model, поэтому я должен реализовать ее самостоятельно. Другой вопрос: существуют ли другие модули Python, кроме NLTK, которые реализуют обучение Ngram и вычисляют вероятность предложения?

Заранее спасибо!


person cccjjj    schedule 24.10.2016    source источник
comment
Да, это распространенный способ работы с новой лексикой: сосчитайте их один раз, теперь, когда вы знаете, что они встречались один раз. Что касается других пакетов Python, я определенно могу порекомендовать TensorFlow от Google.   -  person Prune    schedule 25.10.2016


Ответы (1)


Мой ответ основан на решении из «Обработки речи и языка» Джурафски и Мартин, на сценарии, в котором вы строите свой словарный запас на основе данных вашего обучения (у вас пустой словарь).

В этом случае вы обрабатываете любое первое вхождение нового слова вне словаря (OOV) как неизвестный токен <UNK>.

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

Я нашел эту версию в формате pdf: https://lagunita.stanford.edu/c4x/Engineering/CS-224N/asset/slp4.pdf

Что касается вашего второго вопроса, я думаю, что после настройки и предварительной обработки вашего текста вы можете использовать CountVectorizer в scikit-learn: http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html

person Mehdi    schedule 24.10.2016