У меня есть домашнее задание, которое требует, чтобы я построил алгоритм, который может угадать пропущенное слово из предложения. Например, когда входное предложение: «Сегодня утром я гулял с моей задницей», я хочу, чтобы на выходе угадывалось пропущенное слово (собака). Мое задание требует, чтобы я обучил свою собственную модель с нуля. Я построил свой корпус, который насчитывает около 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?
Спасибо.
[CLS]
и[MASK]
от Берта и узнайте, как создается elmo. jalammar.github.io/illustrated-bert - person alvas   schedule 22.05.2019