#python #nlp #google-colaboratory #n-gram #trigram
#python #нлп #google-colaboratory #n-грамм #триграмма
Вопрос:
Моя языковая модель биграммы работает нормально, когда на входе задается одно слово, но когда я даю два слова моей модели триграммы, она ведет себя странно и предсказывает «неизвестно» в качестве следующего слова. Мой код:
def get_unigram_probability(word):
if word not in unigram:
return 0
return unigram[word] / total_words
def get_bigram_probability(words):
if words not in bigram:
return 0
return bigram[words] / unigram[words[0]]
V = len(vocabulary)
def get_trigram_probability(words):
if words not in trigram:
return 0
return trigram[words] 1 / bigram[words[:2]] V
для двухграммного прогнозирования следующего слова:
def find_next_word_bigram(words):
candidate_list = []
# Calculate probability for each word by looping through them
for word in vocabulary:
p2 = get_bigram_probability((words[-1], word))
candidate_list.append((word, p2))
# sort the list with words with often occurence in the beginning
candidate_list.sort(key=lambda x: x[1], reverse=True)
# print(candidate_list)
return candidate_list[0]
для триграммы:
def find_next_word_trigram(words):
candidate_list = []
# Calculate probability for each word by looping through them
for word in vocabulary:
p3 = get_trigram_probability((words[-2], words[-1], word)) if len(words) >= 3 else 0
candidate_list.append((word, p3))
# sort the list with words with often occurence in the beginning
candidate_list.sort(key=lambda x: x[1], reverse=True)
# print(candidate_list)
return candidate_list[0]
Я просто хочу знать, где в коде я должен внести изменения, чтобы триграмма предсказывала следующее слово с заданным размером ввода в 2 слова.
Комментарии:
1. ваш ввод и желаемый результат?
2. @UmairMubeen Я уже упоминал, что размер ввода составляет 2 слова, а желаемый результат — это модель, предсказывающая следующее слово на основе входных данных.
Ответ №1:
Когда вы строите свои триграммы, используйте специальный токен BOS (начало предложения), чтобы вы могли обрабатывать короткие последовательности. В основном перед каждым предложением добавляйте BOS дважды, вот так:
I like cheese
BOS BOS I like cheese
Таким образом, когда вы принимаете ввод от пользователя, вы можете добавить BOS BOS
к нему дополнение и иметь возможность выполнять даже короткие последовательности.