python 基于人脸管道填充模板的单词识别

jhdbpxl9  于 2023-05-05  发布在  Python
关注(0)|答案(2)|浏览(110)

我想使用hugging face的fill-mask管道来猜测一个掩码标记,然后将猜测的标记提取为一个单词。这段代码应该做到这一点:

!pip install -q transformers
model = pipeline('fill-mask')
outcome = model("Kubernetes is a container orchestration <mask>")[0]

#Prints: "Kubernetes is a container orchestration platform" 
print(outcome['sequence']) 

token = outcome['token'] 

#Prints: 1761
print(token)

#Prints: Ġplatform 
print(model.tokenizer.convert_ids_to_tokens(token))

但是我发现它给我的是"Ġplatform"而不是"platform"-有没有人知道为什么会这样或者这里会发生什么?

f87krz0w

f87krz0w1#

这只是底层模型的一个特性(请参阅此处以检查这是否为distilroberta-base)。
具体来说,蒸馏模型使用与其“教师模型”相同的标记器(在本例中为RoBERTa)。反过来,RoBERTa有一个令牌化器,它严格地工作,没有任何形式的空格,另请参阅OpenAI的GPT-2模型上的this thread,它使用相同的令牌化策略(见这里)。
具体来说,您可以注意到始终是相同的unicode字符\u0120表示新单词的开始。相比之下,由多个子字组成的单词将不具有用于后面的子字的这样的起始字符。
也就是说,complication将被分成两个虚构的子字Ġcomplication
因此,如果Ġ出现在单词中,您可以简单地删除它。

s8vozzvw

s8vozzvw2#

截至2021-08-14,管道的输出包含您请求的所有信息。请注意,token_str可能包含空格。

from transformers import pipeline

unmasker = pipeline("fill-mask")

s="Excuse me sir, <mask> you speak English?"

unmasker(s,top_k=5)

[{'score': 0.9028477668762207,
  'sequence': 'Excuse me sir, do you speak English?',
  'token': 109,
  'token_str': ' do'},
 {'score': 0.05048234760761261,
  'sequence': 'Excuse me sir, did you speak English?',
  'token': 222,
  'token_str': ' did'},
 {'score': 0.015572326257824898,
  'sequence': 'Excuse me sir, can you speak English?',
  'token': 64,
  'token_str': ' can'},
 {'score': 0.007022920995950699,
  'sequence': 'Excuse me sir, Do you speak English?',
  'token': 1832,
  'token_str': ' Do'},
 {'score': 0.005521782673895359,
  'sequence': 'Excuse me sir, if you speak English?',
  'token': 114,
  'token_str': ' if'}]

相关问题