【中文编码】利用bert-base-chinese中的Tokenizer实现中文编码嵌入

最近接触文本处理,查询了一些资料,记录一下中文文本编码的处理方法吧。

先下载模型和词表:bert-base-chinese镜像下载

如下图示,下载好的以下文件均存放在 bert-base-chinese 文件夹下


1. 词编码嵌入简介

按我通俗的理解,就是文本要进入模型,得编码成数字的形式,那么,怎么给定数字的形式呢,不能随便给一个数字吧,此时就需要一个词表,该表中有很多很多的字,每个字都有在该表中唯一的位置,每个字编码时,采用其在词表中的位置。

下载文件中的 vocab.txt 就是已经设定好的词表,打开看看:

2. 词编码嵌入实现

利用transformers库中的BertTokenizer实现分词编码,实例化一个tokenizer,载入预先下载好的词表,调用encode函数进行编码,encode函数有5个常用参数:

①text: 需要编码的文本;

②add_special_tokens: 是否添加特殊token,即CLS分类token和SEP分隔token;

③max_length: 文本的最大长度,根据需要处理的最长文本长度设置;

④pad_to_max_length: 是否填充到最大长度,以0补位;

⑤return_tensors: 返回的tensor类型,有4种为 ['pt', 'tf', 'np', 'jax'] 分别代表 pytorch tensor、tensorflow tensor、int32数组形式和 jax tensor;

python 复制代码
from transformers import BertTokenizer

bert_name = './bert-base-chinese'
tokenizer = BertTokenizer.from_pretrained(bert_name)
text = '一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。'
input_ids = tokenizer.encode(
    text,
    add_special_tokens=True,
    max_length=128,
    pad_to_max_length=True,
    return_tensors='pt'
    )
print('text:\n', text)
print('text字符数:', len(text))
print('input_ids:\n', input_ids)  
print('input_ids大小:', input_ids.size())

输出为:

python 复制代码
text:
 一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。
text字符数: 31
input_ids:
 tensor([[ 101,  671, 2573, 3299, 5862, 8024,  671, 2573, 6716, 7231, 8024,  671,
         2573, 1068, 2255, 7410, 3868, 6814,  511, 3470, 6864, 6814, 2145, 8024,
         2809, 2094, 5442,  679, 7309, 1728, 3362,  511,  102,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0]])
input_ids大小: torch.Size([1, 128])

查看一下tokenizer的信息:

可以看到整个词表的大小为21128个字,共有5种特殊token标记:

[PAD]: 填充标记,编码为0;

[UNK]: 未知字符标记,即该字不在所定义的词表中,编码为100;

[CLS]: 分类标记,蕴含整个文本的含义,编码为101;

[SEP]: 分隔字符标记,用于断开两句话,编码为102;

[MASK]: 掩码标记,该字被遮挡,编码为103;

测试一下这些特殊token:

python 复制代码
from transformers import BertTokenizer

bert_name = './bert-base-chinese'
tokenizer = BertTokenizer.from_pretrained(bert_name)
text = '[CLS]一念月落,一念身错,[SEP]一念关山难涉过。[MASK]逢过客,执子者不问因果。[PAD][PAD][PAD],檒檒'
input_ids = tokenizer.encode(
    text,
    add_special_tokens=False,
    max_length=128,
    pad_to_max_length=False,
    return_tensors='pt'
    )
print('text:\n', text)
print('text字符数:', len(text))
print('input_ids:\n', input_ids)  
print('input_ids大小:', input_ids.size())

输出为:

python 复制代码
text:
 [CLS]一念月落,一念身错,[SEP]一念关山难涉过。[MASK]逢过客,执子者不问因果。[PAD][PAD][PAD],檒檒
text字符数: 64
input_ids:
 tensor([[ 101,  671, 2573, 3299, 5862, 8024,  671, 2573, 6716, 7231, 8024,  102,
          671, 2573, 1068, 2255, 7410, 3868, 6814,  511,  103, 6864, 6814, 2145,
         8024, 2809, 2094, 5442,  679, 7309, 1728, 3362,  511,    0,    0,    0,
          117,  100,  100]])
input_ids大小: torch.Size([1, 39])

也可以利用tokenize函数直接实现分词,并采用convert_tokens_to_ids函数和convert_ids_to_tokens函数实现词与编码的相互转换:

python 复制代码
from transformers import BertTokenizer

bert_name = './bert-base-chinese'
tokenizer = BertTokenizer.from_pretrained(bert_name)
text = '一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。'
tokens = tokenizer.tokenize(text)
input_ids = tokenizer.convert_tokens_to_ids(tokens)
tokenxx = tokenizer.convert_ids_to_tokens(input_ids)

print('中文分词:\n', tokens)
print('分词-->编码:\n', input_ids)
print('编码-->分词:\n', tokenxx)

输出为:

python 复制代码
中文分词:
 ['一', '念', '月', '落', ',', '一', '念', '身', '错', ',', '一', '念', '关', '山', '难', '涉', '过', '。', '棋', '逢', '过', '客', ',', '执', '子', '者', '不', '问', '因', '果', '。']
分词-->编码:
 [671, 2573, 3299, 5862, 8024, 671, 2573, 6716, 7231, 8024, 671, 2573, 1068, 2255, 7410, 3868, 6814, 511, 3470, 6864, 6814, 2145, 8024, 2809, 2094, 5442, 679, 7309, 1728, 3362, 511]
编码-->分词:
 ['一', '念', '月', '落', ',', '一', '念', '身', '错', ',', '一', '念', '关', '山', '难', '涉', '过', '。', '棋', '逢', '过', '客', ',', '执', '子', '者', '不', '问', '因', '果', '。']

除了BertTokenizer,还有AutoTokenizer也是常用的分词类,使用方法与BertTokenizer类似,可以参考这篇文章了解不同的Tokenizer。

相关推荐
boooo_hhh27 分钟前
深度学习笔记16-VGG-16算法-Pytorch实现人脸识别
pytorch·深度学习·机器学习
AnnyYoung31 分钟前
华为云deepseek大模型平台:deepseek满血版
人工智能·ai·华为云
INDEMIND1 小时前
INDEMIND:AI视觉赋能服务机器人,“零”碰撞避障技术实现全天候安全
人工智能·视觉导航·服务机器人·商用机器人
慕容木木1 小时前
【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体的替代品,可本地部署+知识库,注册即可有750w的token使用
人工智能·火山引擎·deepseek·deepseek r1
南 阳2 小时前
百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合
人工智能·chatgpt
企鹅侠客2 小时前
开源免费文档翻译工具 可支持pdf、word、excel、ppt
人工智能·pdf·word·excel·自动翻译
冰淇淋百宝箱2 小时前
AI 安全时代:SDL与大模型结合的“王炸组合”——技术落地与实战指南
人工智能·安全
Elastic 中国社区官方博客3 小时前
Elasticsearch Open Inference API 增加了对 Jina AI 嵌入和 Rerank 模型的支持
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·jina
美狐美颜sdk3 小时前
直播美颜工具架构设计与性能优化实战:美颜SDK集成与实时处理
深度学习·美颜sdk·第三方美颜sdk·视频美颜sdk·美颜api
AWS官方合作商3 小时前
Amazon Lex:AI对话引擎重构企业服务新范式
人工智能·ai·机器人·aws