Использование моделей Elmo для предсказания замаскированного слова в предложении

У меня есть домашнее задание, которое требует, чтобы я построил алгоритм, который может угадать пропущенное слово из предложения. Например, когда входное предложение: «Сегодня утром я гулял с моей задницей», я хочу, чтобы на выходе угадывалось пропущенное слово (собака). Мое задание требует, чтобы я обучил свою собственную модель с нуля. Я построил свой корпус, который насчитывает около 500 000 предложений. Я почистил корпус. Это все строчные буквы, и каждое предложение отделяется символом новой строки (\n). У меня также есть файл wordicon.txt, в котором перечислены все уникальные слова в порядке убывания частоты. Файл словаря начинается с первых трех строк «S», «/ S» и «UNK» (эти 3 токена окружены ‹> в файле word.txt, но использование ‹> на этом веб-сайте по какой-то причине скрывает символы между ними) . У меня также есть небольшой набор предложений с одним пропущенным словом в каждом предложении, которое обозначается [MASK], по одному предложению в строке.

Я следовал инструкциям в https://github.com/allenai/bilm-tf , который предоставляет шаги для обучения вашей собственной модели с нуля с помощью Elmo.

Собрав файл data.txt и словарь, я использовал

python bin/train_elmo.py --train_prefix= <path to training folder> --vocab_file <path to vocab file> --save_dir <path where models will be checkpointed>`

и обучил свой корпус с помощью tensorflow и графического процессора с поддержкой CUDA.

После завершения обучения я использовал следующую команду:

python bin/dump_weights.py --save_dir /output_path/to/checkpoint --outfile/output_path/to/weights.hdf5

Что дало мне файлы weights.hdf5 и options.json. Единственное предупреждение, которое я получил во время обучения моей модели:

WARNING : Error encountered when serializing lstm_output_embeddings.Type is unsupported, or the types of the items don't match field type in CollectionDef. 'list' object has no attribute 'name'

который был упомянут в репозитории AllenAI как безвредный. Таким образом, можно с уверенностью предположить, что этап обучения модели завершен правильно. Моя проблема в том, что я понятия не имею, что делать после этого момента. В этой ссылке stackOverflow Прогнозирование отсутствующих слов в предложении - Natural Модель обработки языка, в ответе говорится, что для предсказания пропущенного слова можно использовать следующий код:

import torch
from pytorch_pretrained_bert import BertTokenizer, BertModel,BertForMaskedLM

# OPTIONAL: if you want to have more information on what's happening,activate the logger as follows
import logging
logging.basicConfig(level=logging.INFO)

# Load pre-trained model tokenizer (vocabulary)
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

text = '[CLS] I want to [MASK] the car because it is cheap . [SEP]'
tokenized_text = tokenizer.tokenize(text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)

# Create the segments tensors.
segments_ids = [0] * len(tokenized_text)

# Convert inputs to PyTorch tensors
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])

# Load pre-trained model (weights)
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
model.eval()

# Predict all tokens
with torch.no_grad():
predictions = model(tokens_tensor, segments_tensors)

predicted_index = torch.argmax(predictions[0, masked_index]).item()
predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]

print(predicted_token)

К сожалению, приведенный выше код предназначен для моделей Bert. Мое задание требует, чтобы я использовал модели Elmo. Я пытался найти библиотеку, похожую на pytorch_pretrained_bert для Elmo, но ничего не нашел. Что я могу сделать, чтобы предсказать замаскированные слова, используя мою модель Elmo?

Спасибо.


person ihatepointers    schedule 21.05.2019    source источник
comment
Хотя они оба с улицы Сезам, Элмо работает не так, как Берт. Поймите модель и почему существуют [CLS] и [MASK] от Берта и узнайте, как создается elmo. jalammar.github.io/illustrated-bert   -  person alvas    schedule 22.05.2019
comment
Я в курсе, что они разные. Я упомянул код о Берте только для того, чтобы лучше объяснить, что я пытался сделать с моей моделью Elmo. Поскольку Elmo также обращает внимание на контекст, он должен хорошо подходить для моего задания.   -  person ihatepointers    schedule 22.05.2019