江东的笔记

Be overcome difficulties is victory

0%

HuggingFace的安装和编码

模型的加载和编码以及基本的使用功能

安装

使用以下命令安装:

1
pip install transformers

模型的加载

导入包:

1
from transformers import BertTokenizer

加载预训练模型bert-base-chinese,初次加载可能需要较长的时间。

1
2
3
4
5
6
#加载预训练字典和分词方法
tokenizer = BertTokenizer.from_pretrained(
# 下载或者从本地加载模型
pretrained_model_name_or_path='bert-base-chinese',
force_download=False,
)

接下来就可以看到tokenizer的内容:

1
2
3
tokenizer

#print:(name_or_path='bert-base-chinese', vocab_size=21128, model_max_len=512, is_fast=False, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'})

进行编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sents = [
'我在一所学院上大三。',
'今天天气好,我来图书馆学习。',
]

res= tokenizer.encode(
# 可以一次编码两个句子,即text和text_pair
text = sents[0],
text_pair=sents[1],

# 当句子长度大于max_length是选择截断
truncation=True,

# 一律补pad到max_length长度
padding='max_length',
add_special_tokens = True,
max_length=30,
return_tensors=None,
)

可以打印出res的结果:

1
2
# 101为CLS    102为SEP    0为PAD
#print(res):[101, 2769, 1762, 671, 2792, 2110, 7368, 677, 1920, 676, 511, 102, 791, 1921, 1921, 3698, 1962, 8024, 2769, 3341, 1745, 741, 7667, 2110, 739, 511, 102, 0, 0, 0]

也可以查看编码之后的结果:

1
2
tokenizer.decode(res)
# [CLS] 我 在 一 所 学 院 上 大 三 。 [SEP] 今 天 天 气 好 , 我 来 图 书 馆 学 习 。 [SEP] [PAD] [PAD] [PAD]

多功能编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
res = tokenizer.encode_plus(
# 可以一次编码两个句子
text = sents[0],
text_pair=sents[1],

# 当句子长度大于max_length是选择截断
truncation=True,

# 一律补pad到max_length长度
padding='max_length',
add_special_tokens = True,
max_length=30,

# 返回值的类型:tf pt np
return_tensors=None,

# 返回token_type_ids
return_token_type_ids=True,

# 返回attention_mask
return_attention_mask = True,


# 返回length标识长度
return_length = True,
)

查看编码的结果:

1
2
3
4
5
6
7
8
9
for k,v in res.items():
print(k,':',v)

tokenizer.decode(res['input_ids'])

# input_ids:编码后的句子
# token_type_ids:第一个句子和特殊符号的位置是0,第二个句子的位置是1
# attention_mask:pad的位置是0,其它位置是1
# length:返回句子的长度

将句子批量进行编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
out = tokenizer.batch_encode_plus(
batch_text_or_text_pairs=[sents[0],sents[1]],

# 当句子长度大于max_length是选择截断
truncation=True,

# 一律补pad到max_length长度
padding='max_length',
add_special_tokens = True,
max_length=30,

# 返回值的类型:tf pt np
return_tensors=None,

# 返回token_type_ids
return_token_type_ids=True,

# 返回attention_mask
return_attention_mask = True,

# 返回length标识长度
return_length = True,
)