Нахождение условной вероятности триграммы в питоне nltk

Я начал учиться NLTK отсюда я следую учебному пособию, где они находят условную вероятность, используя подобные биграммы.

import nltk
from nltk.corpus import brown
cfreq_brown_2gram = nltk.ConditionalFreqDist(nltk.bigrams(brown.words()))

Однако я хочу найти условную вероятность, используя триграммы. Когда я пытаюсь изменить nltk.bigrams в nltk.trigrams Я получаю следующую ошибку.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "home/env/local/lib/python2.7/site-packages/nltk/probability.py", line 1705, in __init__
    for (cond, sample) in cond_samples:
ValueError: too many values to unpack (expected 2)

Как я могу рассчитать условную вероятность, используя триграммы?

2 ответа

Решение

nltk.ConditionalFreqDist ожидает своих данных в виде последовательности (condition, item) кортежи. nltk.trigrams возвращает кортежи длины 3, что приводит к точной ошибке, которую вы опубликовали.

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

brown_trigrams = nltk.trigrams(brown.words())
condition_pairs = (((w0, w1), w2) for w0, w1, w2 in brown_trigrams)
cfd_brown = nltk.ConditionalFreqDist(condition_pairs)

Вы можете использовать модель n-грамм, описанную здесь.

Пример для использования:

from nltk.util import ngrams

input= '...'
N = 3
trigrams = ngrams(input.split(), N)
for grams in trigrams:
  print grams

Я настоятельно рекомендую вам прочитать вышеуказанную документацию и надеюсь, что это поможет.

Другие вопросы по тегам