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

#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 к нему дополнение и иметь возможность выполнять даже короткие последовательности.