有没有办法知道从标记到tokenizer.decode()
函数中原始单词的Map?
举例来说:
from transformers.tokenization_roberta import RobertaTokenizer
tokenizer = RobertaTokenizer.from_pretrained('roberta-large', do_lower_case=True)
str = "This is a tokenization example"
tokenized = tokenizer.tokenize(str)
## ['this', 'Ġis', 'Ġa', 'Ġtoken', 'ization', 'Ġexample']
encoded = tokenizer.encode_plus(str)
## encoded['input_ids']=[0, 42, 16, 10, 19233, 1938, 1246, 2]
decoded = tokenizer.decode(encoded['input_ids'])
## '<s> this is a tokenization example</s>'
字符串
目标是有一个函数,将decode
过程中的每个标记Map到正确的输入单词,因为它将是:desired_output = [[1],[2],[3],[4,5],[6]]
个
因为this
对应于id 42
,而token
和ization
对应于id [19244,1938]
,它们位于input_ids
数组的索引4,5
处。
2条答案
按热度按时间bakd9h0s1#
transformers version>=2.9.0:
FastTokenizers返回一个BatchEnconding对象,您可以使用:
字符串
输出量:
型
transformers version<2.9.0:
据我所知,没有内置的方法,但你可以自己创建一个:
型
输出量:
型
为了得到你想要的输出,你必须使用一个列表解析:
型
输出量:
型
ctehm74n2#
如果您使用快速分词器,即来自
tokenizers
库的rust backed版本,则编码包含一个word_ids
方法,可用于将子单词Map回其原始单词。什么构成word
vssubword
取决于分词器,单词是由预分词阶段生成的,即通过空格分割,子字由实际模型(例如BPE
或Unigram
)生成。下面的代码应该在一般情况下工作,即使预标记化执行额外的拆分。例如,我创建了自己的自定义步骤,基于PascalCase进行拆分-这里的
words
是Pascal
和Case
,接受的答案在这种情况下不起作用,因为它假设单词是空格分隔的。字符串