Я бы порекомендовал использовать цепи Маркова https://en.wikipedia.org/wiki/Markov_chain
Очень банальный пример для вашей справки.
Предположим, что вы собираетесь анализировать 1-грамм.
Проанализированные тексты:
monkey eats banana
dog eats bone
униграммы: monkey
, eats
, banana
, dog
, bone
, BEGIN
, END
.
Каждое предложение начинается с начала.
Возможны два перехода:
BEGIN->monkey
BEGIN->dog
Это означает, что существует 50% вероятность того, что предложение начнется с monkey
.
Теперь после monkey
есть 100% шанс перехода monkey->eats
(потому что не было никакого другого monkey->*
переходав проанализированных текстах.
Теперь после eats
есть 50% шанс banana
и 50% шанс bone
.
Так что в целом с этой моделью мы можем генерировать следующие предложения:
monkey eats banana
monkey eats bone
dog eats bone
dog eats banana
каждый из них должен получить 25%
Обратите внимание, что кость и банан всегда переходят в END
С диграммами вы просто разделите его наmonkey eats
-> banana END
Это просто упрощенная общая картина, надеюсь, это поможет
Редактировать
Что касается сглаживания, упомянутого в комментарии, используйте Лаплас.
Предположим, что вы видели каждое слово на единицу больше, чем мы на самом деле.
Так, например, теперь у нас будет:
eats bone (2)
eats banana (2)
eats chocolate (1)
eats dog (1)
Конечно, в этом случае мы имеемочень маленький набор данных, но для большего набора данных вы получите что-то вроде:
eats bone (104)
eats banana (1031)
eats chocolate (1)
eats dog (3)
...