我有一个家庭作业,需要我建立一个可以从句子中猜出遗漏单词的算法。例如,当输入的句子是:“我今天早上带我的****去散步”时,我希望输出猜出丢失的单词(狗)。我的任务要求我从头开始训练自己的模型。我建立了大约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>`
并使用tensorflow和启用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链接Predicting Missing Words in a sentence - Natural Language Processing Model中,答案指出可以使用以下代码来预测缺少的单词:
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模型。我试图找到与Elmo类似的 pytorch_pretrained_bert 图书馆,但找不到任何东西。我该如何使用Elmo模型来预测被掩盖的单词?
谢谢。