使用bert.tokenizationFullTokenizer()将中文标题转化为token的原理解析
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的原理解析及一个使用例子。
