Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nlp 如何使用Transformers库从XLNet输出中获取单词_Nlp_Masking_Transformer_Language Model_Huggingface Transformers - Fatal编程技术网

Nlp 如何使用Transformers库从XLNet输出中获取单词

Nlp 如何使用Transformers库从XLNet输出中获取单词,nlp,masking,transformer,language-model,huggingface-transformers,Nlp,Masking,Transformer,Language Model,Huggingface Transformers,我正在使用Hugging Face的Transformer库处理不同的NLP模型。下面的代码使用XLNet进行屏蔽。它输出一个带有数字的张量。如何再次将输出转换为单词 import torch from transformers import XLNetModel, XLNetTokenizer, XLNetLMHeadModel tokenizer = XLNetTokenizer.from_pretrained('xlnet-base-cased') model = XLNetLMHea

我正在使用Hugging Face的Transformer库处理不同的NLP模型。下面的代码使用XLNet进行屏蔽。它输出一个带有数字的张量。如何再次将输出转换为单词

import torch
from transformers import XLNetModel,  XLNetTokenizer, XLNetLMHeadModel

tokenizer = XLNetTokenizer.from_pretrained('xlnet-base-cased')
model = XLNetLMHeadModel.from_pretrained('xlnet-base-cased')

# We show how to setup inputs to predict a next token using a bi-directional context.
input_ids = torch.tensor(tokenizer.encode("I went to <mask> York and saw the <mask> <mask> building.")).unsqueeze(0)  # We will predict the masked token
print(input_ids)

perm_mask = torch.zeros((1, input_ids.shape[1], input_ids.shape[1]), dtype=torch.float)
perm_mask[:, :, -1] = 1.0  # Previous tokens don't see last token

target_mapping = torch.zeros((1, 1, input_ids.shape[1]), dtype=torch.float)  # Shape [1, 1, seq_length] => let's predict one token
target_mapping[0, 0, -1] = 1.0  # Our first (and only) prediction will be the last token of the sequence (the masked token)

outputs = model(input_ids, perm_mask=perm_mask, target_mapping=target_mapping)
next_token_logits = outputs[0]  # Output has shape [target_mapping.size(0), target_mapping.size(1), config.vocab_size]
导入火炬
从变压器导入XLNetModel、XLNetTokenizer、XLNetLMHeadModel
标记器=XLNetTokenizer.from_pretrained('xlnet-base-cased'))
模型=XLNetLMHeadModel.from_pretrained('xlnet-base-cased'))
#我们将展示如何使用双向上下文设置输入以预测下一个令牌。
input_ids=torch.tensor(tokenizer.encode(“我去了约克,看到了这座建筑”)).unsqueze(0)#我们将预测蒙面令牌
打印(输入标识)
perm_mask=torch.zero((1,input_id.shape[1],input_id.shape[1]),dtype=torch.float)
perm_mask[:,:,-1]=1.0#以前的标记看不到最后一个标记
target_mapping=torch.zeros((1,1,input_id.shape[1]),dtype=torch.float)#shape[1,1,seq_length]=>让我们预测一个标记
目标映射[0,0,-1]=1.0 35;我们的第一个(也是唯一一个)预测将是序列的最后一个标记(屏蔽标记)
输出=模型(输入\u ID,perm\u掩码=perm\u掩码,目标\u映射=目标\u映射)
next_token_logits=outputs[0]#输出具有形状[target_mapping.size(0)、target_mapping.size(1)、config.vocab_size]
我得到的电流输出是:

张量([-5.1466、-17.3758、-17.3392、-12.2839、-12.6421、-12.4505]],
grad_fn=addbackard0)

您的输出是一个大小为1乘以1的张量。这个张量中第n个数字的含义是对第n个词汇项的估计。因此,如果你想找出模型预测最有可能出现在最终位置的单词(你用
目标映射指定的位置)
,你所需要做的就是在词汇表中找到具有最大预测对数几率的单词

只需在现有代码中添加以下内容:

predicted_index = torch.argmax(next_token_logits[0][0]).item()
predicted_token = tokenizer.convert_ids_to_tokens(predicted_index)
因此,
predicted_token
是模型预测的最有可能处于该位置的标记


注意,在默认情况下,XLNetTokenizer.encoder()的行为会在编码时向令牌字符串的末尾添加特殊的令牌。您给出的代码屏蔽并预测最后一个单词,在通过tokenizer.encoder()运行后,它是特殊字符
'
,这可能不是您想要的

也就是说,当你跑步的时候

tokenizer.encode(“我去了约克,看到了那栋建筑。”)

结果是一个令牌ID列表

[35388,22,6313,21685,18,6,6540,9,4,3]

如果您将其转换回令牌(通过调用上述id列表上的
tokenizer.convert_ids_to_tokens()
),您将看到在末尾添加了两个额外的令牌

['▁我','▁走了",▁到','','▁约克▁和‘,’▁锯','▁“,”,“,”▁建筑“,”和“,”]

因此,如果您要预测的单词是“building”,那么应该使用
perm_mask[:,:,-4]=1.0
target_mapping[0,0,-4]=1.0