Модель НЛП, предлагающая список слов в неполном предложении - PullRequest
0 голосов
/ 30 июня 2019

Я несколько прочитал несколько статей, в которых говорится о предсказании пропущенных слов в предложении. Что я действительно хочу, это создать модель, которая предлагает слово из неполного предложения.

  Example:

  Incomplete Sentence :
  I bought an ___________  because its rainy.

  Suggested Words:
      umbrella
      soup
      jacket

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

  Example :

  Incomplete Sentence :

  Im sad because you are __________

  Missing Word Options:
  a) crying
  b) happy
  c) pretty
  d) sad
  e) bad

Я не хочу предсказать пропущенное слово из списка вариантов. Я хочу предложить список слов из неполного предложения. Это возможно? Пожалуйста, просветите меня, потому что я действительно смущен. Какую современную модель я могу использовать для предложения списка слов (семантически связных) из неполного предложения?

Необходимо ли, чтобы список предлагаемых слов в качестве выходных данных был включен в набор обучающих данных?

1 Ответ

2 голосов
/ 01 июля 2019

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

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

# install this package to obtain the pretrained model
# ! pip install -U pytorch-pretrained-bert

import torch
from pytorch_pretrained_bert import BertTokenizer, BertForMaskedLM

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
model.eval(); # turning off the dropout

def fill_the_gaps(text):
    text = '[CLS] ' + text + ' [SEP]'
    tokenized_text = tokenizer.tokenize(text)
    indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
    segments_ids = [0] * len(tokenized_text)
    tokens_tensor = torch.tensor([indexed_tokens])
    segments_tensors = torch.tensor([segments_ids])
    with torch.no_grad():
        predictions = model(tokens_tensor, segments_tensors)
    results = []
    for i, t in enumerate(tokenized_text):
        if t == '[MASK]':
            predicted_index = torch.argmax(predictions[0, i]).item()
            predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]
            results.append(predicted_token)
    return results

print(fill_the_gaps(text = 'I bought an [MASK] because its rainy .'))
print(fill_the_gaps(text = 'Im sad because you are [MASK] .'))
print(fill_the_gaps(text = 'Im worried because you are [MASK] .'))
print(fill_the_gaps(text = 'Im [MASK] because you are [MASK] .'))

Символ [MASK] обозначает пропущенные слова (их может быть любое количество).[CLS] и [SEP] являются специальными токенами BERT.Выходные данные для этих конкретных отпечатков:

['umbrella']
['here']
['worried']
['here', 'here']

Дублирование не удивительно - NN трансформатора, как правило, хороши при копировании слов.И с семантической точки зрения эти симметричные продолжения выглядят действительно очень вероятными.

Более того, если пропущено не случайное слово, а именно последнее слово (или последние несколько слов), вы можете использовать любую языковую модель (например, другую известную языковую модель SOTA, GPT-2 ), чтобы завершить предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...