欢迎访问宙启技术站
智能推送

使用bert.tokenizationFullTokenizer()将中文标题转化为token的原理解析

发布时间:2023-12-23 08:34:34

bert.tokenizationFullTokenizer()是BERT中文预训练模型的一个工具类,用于将中文文本转化为BERT模型的输入表示,即token序列。下面我会对该工具类的原理进行详细解析,并给出一个使用例子。

原理解析:

1. 初始化工具类,加载BERT中文预训练模型的词汇表。BERT的词汇表是一个包含中文词汇的字典,其中每个词汇对应一个唯一的编号,还有一些特殊的标记,如[CLS]、[SEP]等。

2. 对输入的中文文本进行分词。分词是将文本切分成一个个词或者字符的过程。BERT中文模型采用基于字的分词方法,即将每个字作为一个基本单位。例如,对于输入的中文标题"今天天气真好",则会被分词为["今", "天", "天", "气", "真", "好"]。

3. 将分词后的词汇转化为对应的编号。根据BERT词汇表,将每个分词后的词汇转化为对应的编号。例如,"今"对应的编号是58,"天"对应的编号是999,以此类推,最终得到一个词汇编号的序列[58, 999, 999, 21, 325, 387]。

4. 添加特殊标记。在转化为词汇编号序列之后,需要在序列的开头添加一个特殊标记[CLS],表示序列的开始,同时在序列的结尾添加一个特殊标记[SEP],表示序列的结束。最终得到一个包含特殊标记的词汇编号序列[101, 58, 999, 999, 21, 325, 387, 102]。

5. 对序列进行填充或截断。由于BERT模型要求输入的序列长度是固定的,因此需要对序列进行填充或截断,使其达到指定的长度。如果序列的长度小于指定的长度,则在序列的结尾添加特殊填充标记[0],直到达到指定长度。如果序列的长度大于指定的长度,则截断序列,使其保持指定长度。

6. 对于每个词汇,还需要生成其对应的词汇类型编号。BERT模型使用了两个类型的词汇:一种是输入序列中的普通词汇,另一种是位置编码。对于输入序列中的词汇,其对应的词汇类型编号为0;对于位置编码,其对应的词汇类型编号为1。例如,对于输入的中文标题"今天天气真好",生成的词汇类型编号序列为[0, 0, 0, 0, 0, 0, 0]。

7. 最终得到BERT模型的输入表示,包括词汇编号序列、词汇类型编号序列以及填充掩码序列。

下面是一个使用bert.tokenizationFullTokenizer()将中文标题转化为token的例子:

from bert import tokenizationFullTokenizer

tokenizer = tokenizationFullTokenizer(vocab_file="chinese_vocab.txt")
title = "今天天气真好"

# 将中文标题转化为token序列
tokens = tokenizer.tokenize(title)
# 输出['今', '天', '天', '气', '真', '好']

# 将token序列转化为词汇编号序列
token_ids = tokenizer.convert_tokens_to_ids(tokens)
# 输出[58, 999, 999, 21, 325, 387]

# 添加特殊标记,并进行填充
pad_token = 0
max_seq_length = 10
input_ids = tokenizer.convert_tokens_to_ids(['[CLS]'] + tokens + ['[SEP]'])
input_mask = [1] * len(input_ids)
input_ids += [pad_token] * (max_seq_length - len(input_ids))
input_mask += [0] * (max_seq_length - len(input_mask))

# 生成词汇类型编号序列
segment_ids = [0] * max_seq_length

print(input_ids)
# 输出[101, 58, 999, 999, 21, 325, 387, 102, 0, 0]

print(input_mask)
# 输出[1, 1, 1, 1, 1, 1, 1, 1, 0, 0]

print(segment_ids)
# 输出[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

在这个例子中,我们首先使用tokenizer.tokenize()将中文标题分词为token序列,然后使用tokenizer.convert_tokens_to_ids()将token序列转化为词汇编号序列。接着,我们添加特殊标记并进行填充,得到指定长度的词汇编号序列和填充掩码序列。最后,我们生成词汇类型编号序列,默认为全0。以上就是使用bert.tokenizationFullTokenizer()将中文标题转化为token的原理解析及一个使用例子。