Использование моделей Elmo для прогнозирования замаскированного слова в предложении
У меня есть домашнее задание, которое требует от меня построения алгоритма, который может угадать пропущенное слово из предложения. Например, когда входное предложение звучит так: "Я взял свое **** на прогулку этим утром", я хочу, чтобы вывод угадал пропущенное слово (собака). Мое задание требует от меня тренировать свою собственную модель с нуля. Я построил мой корпус, который имеет около 500000 предложений. Я очистил корпус. Это все строчные буквы, и каждое предложение отделяется символом новой строки (\n). У меня также есть файл vocabulary.txt, в котором перечислены все уникальные слова в порядке убывания по частоте. Файл словаря начинается с первых трех строк 'S', '/S' и 'UNK' (эти 3 токена окружены <> в vocabulary.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>`
и обучил мой корпус с помощью tenorflow и cUDA с поддержкой gpu.
После окончания обучения я использовал следующую команду:
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 Прогнозирование пропущенных слов в предложении - Модель обработки естественного языка в ответе говорится, что для прогнозирования пропущенного слова можно использовать следующий код:
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?
Благодарю.