Я обучил языковые модели 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 и вычисляют вероятность предложения?
Заранее спасибо!