Модель языка N-грамм ничего не возвращает

#python #dictionary #prediction #n-gram #language-model

Вопрос:

Я следую учебнику здесь: https://www.analyticsvidhya.com/blog/2019/08/comprehensive-guide-language-model-nlp-python-code/#h2_5 для создания языковой модели. Я слежу за тем, что касается языковой модели N-граммы.

Это завершенный код:

 from nltk.corpus import reuters
from nltk import bigrams, trigrams
from collections import Counter, defaultdict

# Create a placeholder for model
model = defaultdict(lambda: defaultdict(lambda: 0))

# Count frequency of co-occurance
for sentence in reuters.sents():
    for w1, w2, w3 in trigrams(sentence, pad_right=True, pad_left=True):
        model[(w1, w2)][w3]  = 1

# Let's transform the counts to probabilities
for w1_w2 in model:
    total_count = float(sum(model[w1_w2].values()))
    for w3 in model[w1_w2]:
        model[w1_w2][w3] /= total_count

input = input("Hi there! Please enter an incomplete sentence and I can help you
 finish it!n").lower().split()

print(model[tuple(input)])
 

Чтобы получить вывод из модели, веб-сайт делает это: print(dict(model["the", "price"])) но я хочу сгенерировать вывод из введенного пользователем предложения. Когда я пишу print(model[tuple(input)]) , это дает мне пустой defaultdict.

Не обращайте внимания на это (сохранение для истории):

Как я могу дать ему список, который я создаю из входных данных? model является ли словарь, и я читал, что использование списка в качестве ключа не является хорошей идеей, но это именно то, что они делают? И я предполагаю, что мой не работает, потому что я перечисляю список? Должен ли я повторять слова, чтобы получить результаты?

В качестве примечания, рассматривает ли эта модель предложение в целом, чтобы предсказать следующее слово или только последнее слово?

Комментарии:

1. 1. в словаре используются кортежи, а не списки (см. model[(w1, w2)][w3]... 2. Из вызова trigrams я могу только заключить, что он использует триграммы, т. Е.: вычисляет вероятность слова с учетом появления 2 предыдущих.

2. @JuanR Я совершенно упустил, что он использовал кортежи! И да, триграмма также предполагает это. Спасибо, что указали на все это!!

Ответ №1:

Я должен был дать модели последние два слова из списка, а не все, даже если это два слова. Вот так:

 model[tuple(input[-2:])]