#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:])]