1.背景
transformers框架学习
2.代码
2.1.加载编码工具
# 第2章/加载编码工具
from transformers import BertTokenizer# 加载编码工具
tokenizer = BertTokenizer.from_pretrained(pretrained_model_name_or_path='bert-base-chinese',cache_dir=None,force_download=False,
)#print(tokenizer)# 第2章/准备实验数据
sents = ['你站在桥上看风景','看风景的人在楼上看你','明月装饰了你的窗子','你装饰了别人的梦',
]# 第2章/基本的编码函数
out = tokenizer.encode(text=sents[2],text_pair=sents[3],# 当句子长度大于max_length时截断truncation=True,# 一律补PAD,直到max_length长度padding='max_length',add_special_tokens=True,max_length=25,return_tensors=None,
)
# 编码
print(out)
# 解码
print(tokenizer.decode(out))
'''
[101, 3209, 3299, 6163, 7652, 749, 872, 4638, 4970, 2094, 102, 872, 6163, 7652, 749, 1166, 782, 4638, 3457, 102, 0, 0, 0, 0, 0]
[CLS] 明 月 装 饰 了 你 的 窗 子 [SEP] 你 装 饰 了 别 人 的 梦 [SEP] [PAD] [PAD] [PAD] [PAD] [PAD]'''
2.2.进阶编码函数
# 第2章/加载编码工具
from transformers import BertTokenizer# 加载编码工具
tokenizer = BertTokenizer.from_pretrained(pretrained_model_name_or_path='bert-base-chinese',cache_dir=None,force_download=False,
)# print(tokenizer)# 第2章/准备实验数据
sents = ['你站在桥上看风景','看风景的人在楼上看你','明月装饰了你的窗子','你装饰了别人的梦',
]# 第2章/进阶的编码函数
out = tokenizer.encode_plus(text=sents[0],text_pair=sents[1],# 当句子长度大于max_length时截断truncation=True,# 一律补零,直到max_length长度padding='max_length',max_length=25,add_special_tokens=True,# 可取值tf、pt、np,默认为返回listreturn_tensors=None,# 返回token_type_idsreturn_token_type_ids=True,# 返回attention_maskreturn_attention_mask=True,# 返回special_tokens_mask 特殊符号标识return_special_tokens_mask=True,# 返回length 标识长度return_length=True,
)
# input_ids 编码后的词
# token_type_ids 第1个句子和特殊符号的位置是0,第2个句子的位置是1
# special_tokens_mask 特殊符号的位置是1,其他位置是0
# attention_mask PAD的位置是0,其他位置是1
# length 返回句子长度
'''
input_ids : [101, 872, 4991, 1762, 3441, 677, 4692, 7599, 3250, 102, 4692, 7599, 3250, 4638, 782, 1762, 3517, 677, 4692, 872, 102, 0, 0, 0, 0]
token_type_ids : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
special_tokens_mask : [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
attention_mask : [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
length : 25
'''
for k, v in out.items():print(k, ':', v)str = tokenizer.decode(out['input_ids'])
# [CLS] 你 站 在 桥 上 看 风 景 [SEP] 看 风 景 的 人 在 楼 上 看 你 [SEP] [PAD] [PAD] [PAD] [PAD]
print(str)
2.3.批量编码
# 第2章/加载编码工具
from transformers import BertTokenizer# 加载编码工具
tokenizer = BertTokenizer.from_pretrained(pretrained_model_name_or_path='bert-base-chinese',cache_dir=None,force_download=False,
)# print(tokenizer)# 第2章/准备实验数据
sents = ['你站在桥上看风景','看风景的人在楼上看你','明月装饰了你的窗子','你装饰了别人的梦',
]# 第2章/批量编码成对的句子
out = tokenizer.batch_encode_plus(# 编码成对的句子batch_text_or_text_pairs=[(sents[0], sents[1]), (sents[2], sents[3])],add_special_tokens=True,# 当句子长度大于max_length时截断truncation=True,# 一律补零,直到max_length长度padding='max_length',max_length=25,# 可取值tf、pt、np,默认为返回listreturn_tensors=None,# 返回token_type_idsreturn_token_type_ids=True,# 返回attention_maskreturn_attention_mask=True,# 返回special_tokens_mask 特殊符号标识return_special_tokens_mask=True,# 返回offsets_mapping 标识每个词的起止位置,这个参数只能BertTokenizerFast使用# return_offsets_mapping=True,# 返回length 标识长度return_length=True,
)
# input_ids 编码后的词
# token_type_ids 第1个句子和特殊符号的位置是0,第2个句子的位置是1
# special_tokens_mask 特殊符号的位置是1,其他位置是0
# attention_mask PAD的位置是0,其他位置是1
# length 返回句子长度
for k, v in out.items():print(k, ':', v)str = tokenizer.decode(out['input_ids'][0])
print(str)
'''
input_ids : [[101, 872, 4991, 1762, 3441, 677, 4692, 7599, 3250, 102, 4692, 7599, 3250, 4638, 782, 1762, 3517, 677, 4692, 872, 102, 0, 0, 0, 0], [101, 3209, 3299, 6163, 7652, 749, 872, 4638, 4970, 2094, 102, 872, 6163, 7652, 749, 1166, 782, 4638, 3457, 102, 0, 0, 0, 0, 0]]
token_type_ids : [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]]
special_tokens_mask : [[1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]]
length : [21, 20]
attention_mask : [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]]
[CLS] 你 站 在 桥 上 看 风 景 [SEP] 看 风 景 的 人 在 楼 上 看 你 [SEP] [PAD] [PAD] [PAD] [PAD]
'''
3.4.自定义字典
# 第2章/加载编码工具
from transformers import BertTokenizer# 加载编码工具
tokenizer = BertTokenizer.from_pretrained(pretrained_model_name_or_path='bert-base-chinese',cache_dir=None,force_download=False,
)# print(tokenizer)
print('使用默认字典时...........')
# 第2章/编码新添加的词
out = tokenizer.encode(text='明月装饰了你的窗子[EOS]',text_pair=None,# 当句子长度大于max_length时截断truncation=True,# 一律补PAD,直到max_length长度padding='max_length',add_special_tokens=True,max_length=10,return_tensors=None,
)
print('默认字典:', out)
print('默认字典:', tokenizer.decode(out))# 第2章/获取字典
vocab = tokenizer.get_vocab()
print('默认:', type(vocab), len(vocab), '明月' in vocab)# 第2章/添加新词
tokenizer.add_tokens(new_tokens=['明月', '装饰', '窗子'])# 第2章/添加新符号
tokenizer.add_special_tokens({'eos_token': '[EOS]'})vocab = tokenizer.get_vocab()
print('自定义:', type(vocab), len(vocab), '明月' in vocab)print('使用自定义字典...........')
# 第2章/编码新添加的词
out = tokenizer.encode(text='明月装饰了你的窗子[EOS]',text_pair=None,# 当句子长度大于max_length时截断truncation=True,# 一律补PAD,直到max_length长度padding='max_length',add_special_tokens=True,max_length=10,return_tensors=None,
)
print('自定义字典:', out)
print('自定义字典:', tokenizer.decode(out))
'''
使用默认字典时...........
默认字典: [101, 3209, 3299, 6163, 7652, 749, 872, 4638, 4970, 102]
默认字典: [CLS] 明 月 装 饰 了 你 的 窗 [SEP]
默认: <class 'dict'> 21128 False
自定义: <class 'dict'> 21132 True
使用自定义字典...........
自定义字典: [101, 21128, 21129, 749, 872, 4638, 21130, 21131, 102, 0]
自定义字典: [CLS] 明月 装饰 了 你 的 窗子 [EOS] [SEP] [PAD]
'''
完美