我读过一些关于预测句子中缺失单词的论文。我真正想要的是创建一个模型,从不完整的句子中建议单词。
Example:
Incomplete Sentence :
I bought an ___________ because its rainy.
Suggested Words:
umbrella
soup
jacket
Run Code Online (Sandbox Code Playgroud)
从我读过的期刊来看,他们利用 Microsoft Sentence Completion Dataset 来预测句子中缺失的单词。
Example :
Incomplete Sentence :
Im sad because you are __________
Missing Word Options:
a) crying
b) happy
c) pretty
d) sad
e) bad
Run Code Online (Sandbox Code Playgroud)
我不想从选项列表中预测丢失的单词。我想建议一个不完整句子中的单词列表。可行吗?请赐教,因为我真的很困惑。我可以使用什么最先进的模型来从不完整的句子中建议单词列表(语义上一致)?
作为输出的建议单词列表是否有必要包含在训练数据集中?
这正是BERT模型的训练方式:屏蔽句子中的一些随机单词,并让您的网络预测这些单词。所以是的,这是可行的。并非如此,没有必要将建议单词列表作为训练输入。然而,这些建议的单词应该是训练 BERT 的整体词汇的一部分。
我改编了这个答案来展示完成功能如何工作。
# install this package to obtain the pretrained model
# ! pip install -U pytorch-pretrained-bert
import torch
from pytorch_pretrained_bert import BertTokenizer, BertForMaskedLM
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
model.eval(); # turning off the dropout
def fill_the_gaps(text):
text = '[CLS] ' + text + ' [SEP]'
tokenized_text = tokenizer.tokenize(text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
segments_ids = [0] * len(tokenized_text)
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])
with torch.no_grad():
predictions = model(tokens_tensor, segments_tensors)
results = []
for i, t in enumerate(tokenized_text):
if t == '[MASK]':
predicted_index = torch.argmax(predictions[0, i]).item()
predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]
results.append(predicted_token)
return results
print(fill_the_gaps(text = 'I bought an [MASK] because its rainy .'))
print(fill_the_gaps(text = 'Im sad because you are [MASK] .'))
print(fill_the_gaps(text = 'Im worried because you are [MASK] .'))
print(fill_the_gaps(text = 'Im [MASK] because you are [MASK] .'))
Run Code Online (Sandbox Code Playgroud)
该[MASK]符号表示缺失的单词(可以有任意数量)。[CLS]和[SEP]是 BERT 特定的特殊标记。这些特定打印的输出是
['umbrella']
['here']
['worried']
['here', 'here']
Run Code Online (Sandbox Code Playgroud)
这种重复并不奇怪——变压器神经网络通常擅长复制单词。从语义的角度来看,这些对称延续看起来确实很有可能。
而且,如果丢失的不是随机单词,而是恰好是最后一个单词(或最后几个单词),则可以利用任何语言模型(例如另一个著名的SOTA语言模型,GPT-2)来完成句子。