使用Elmo模型预测句子中的被屏蔽单词

时间:2019-05-21 19:07:58

标签: python machine-learning nlp allennlp elmo

我有一个家庭作业,需要我建立一个可以从句子中猜出遗漏单词的算法。例如,当输入的句子是:“我今天早上带我的****去散步”时,我希望输出猜出丢失的单词(狗)。我的任务要求我从头开始训练自己的模型。我建立了大约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模型来预测被掩盖的单词?

谢谢。

0 个答案:

没有答案