预测句子中的遗漏单词-自然语言处理模型

Aly*_*ono 2 nlp machine-learning predict neural-network

我的句子如下:

I want to ____ the car because it is cheap.
Run Code Online (Sandbox Code Playgroud)

我想使用NLP模型来预测丢失的单词。我应该使用哪种NLP模型?谢谢。

alv*_*vas 6

TL; DR

试试看:https : //github.com/huggingface/pytorch-pretrained-BERT

首先,您必须正确设置

pip install -U pytorch-pretrained-bert
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用BERT算法中的“屏蔽语言模型”,例如

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)
Run Code Online (Sandbox Code Playgroud)

[出]:

buy
Run Code Online (Sandbox Code Playgroud)

在长

要真正理解为什么你需要的[CLS][MASK]和段张量,请仔细阅读本文,https://arxiv.org/abs/1810.04805

如果您很懒惰,可以阅读来自Lilian Weng的这篇不错的博文,https: //lilianweng.github.io/lil-log/2019/01/31/generalized-language-models.html

除BERT以外,还有许多其他模型可以执行填补空白的任务。请查看pytorch-pretrained-BERT存储库中的其他模型,但更重要的是,应更深入地研究“语言建模”的任务,即根据历史预测下一个单词的任务。

  • 直截了当的答案,但是您忘了创建`masked_index`导致结尾附近出现错误。我假设“ masked_index”只是“ [MASK]”的索引? (3认同)
  • 请添加以下代码 ``` masked_index = tokenized_text.index('[MASK]') ``` (3认同)
  • 另一个更正:既然你有一个 3d 张量,你实际上应该这样做: "predicted_index = torch.argmax(predictions[0][0][masked_index]).item()" 另外,考虑@Biranchi 评论。一切工作都是这样的! (2认同)

ali*_*ift 3

您可以使用多种模型。但我认为最近用于此类序列学习问题的模型是双向 RNN(如双向 LSTM),您可以从这里得到提示

但请注意,双向 RNN 的训练成本非常昂贵。根据您要解决的问题,我强烈建议使用一些预先训练的模型。祝你好运!