若一个单词被拆分成多少token, word_ids得到的序号是相同的?还是序号累加的?

目录

问题描述:

问题实现:

方法一:

方法二:


问题描述:

在使用tokenizer进行编码的时候,经常会存在word被拆分成多个token的情况,不同的参数设置,会得到不同的结果。总的来说,得到的word_ids会有两种,一种是每一个子token是相同的序号;

[0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13]

另一种是不区分子token,序号依次累加。

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

根据自己的需求,使用不同的方法,下面是两种具体的方法

问题实现:

方法一:

单词拆分,序号依次累加

from transformers import AutoTokenizer
file = "/home/qtxu/PLM/bert-base-uncased" # 模型地址
tokenizer = AutoTokenizer.from_pretrained(file)
text = "this is a test sentence X-T X-U ."
max_len = 20
token_output  = tokenizer(text, max_length=max_len - 1, pad_to_max_length=True) # 默认add_special_tokens=True,即加CLS和SEP
print(token_output.word_ids())

运行结果

 可以看出,tokenizer对text进行了分词处理,但word_ids()的序号是依次累加的,单纯的从word_ids()结果来看,并不能知道哪个单词被拆分了。

注意:
如果原始单词,被拆分成若干个子token,没一个token不是独立的单词,则也不会累加,保持同样的数字序号。累加仅限于拆分成的若干子token也是独立的单词。

方法二:

单词拆分,序号不累加,同一个word的子token保持相同的序号

from transformers import AutoTokenizer
file = "/home/qtxu/PLM/bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(file)
text = "this is a test sentence X-T X-U ."
max_len = 20
token_output  = tokenizer(text.split(" "), max_length=max_len - 1, pad_to_max_length=True, is_split_into_words=True)
print(token_output.word_ids())

运行结果

 从

运行结果可以看出,tokenizer对text进行了分词处理。同一个word的序号是相同的,通过word_ids()序号,就可以定位到被拆分的单词。

!!!

仔细看,区别仅仅是一行代码的区别。倒数第二行,具体的,

方法一传入的是str型的text

方法二传入的是list型的text
 

猜你喜欢

转载自blog.csdn.net/weixin_41862755/article/details/130037066
今日推荐