Использование моделей Elmo для прогнозирования замаскированного слова в предложении - PullRequest
2 голосов
/ 21 мая 2019

У меня есть домашнее задание, которое требует от меня построения алгоритма, который может угадать пропущенное слово из предложения.Например, когда входное предложение звучит так: «Я взял свое **** на прогулку этим утром», я хочу, чтобы вывод угадал пропущенное слово (собака).Мое задание требует от меня тренировать свою собственную модель с нуля.Я построил мой корпус, который имеет около 500 000 предложений.Я очистил корпус.Это все строчные буквы, и каждое предложение отделяется символом новой строки (\ 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)

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

Спасибо.

...