大语言模型中常用的tokenizer算法

大语言模型中常用的tokenizer算法对于自然语言处理(NLP)任务至关重要。它们将文本分解为更小的单元(token),这些单元可以是单词、子词或字符,进而用于模型训练和推理。以下是几种常用的tokenizer算法及其详细介绍。

常用的Tokenizer算法

1. 基于规则的Tokenizer

1.1 空格分词

空格分词是最简单的tokenization方法之一,通过空格将文本分割成单词。尽管简单,但在处理复杂文本时效果不佳,尤其是在多语言环境中。

text = "Hello, world! This is a test."
tokens = text.split()
print(tokens)
# 输出: ['Hello,', 'world!', 'This', 'is', 'a', 'test.']
​
 
 

1.2 正则表达式分词

使用正则表达式来定义更复杂的分词规则,可以处理标点符号、特殊字符等。比如:

import re
text = "Hello, world! This is a test."
tokens = re.findall(r'\b\w+\b', text)
print(tokens)
# 输出: ['Hello', 'world', 'This', 'is', 'a', 'test']
​
 
 

2. 基于统计的Tokenizer

2.1 词汇表分词(WordPiece)

WordPiece是用于BERT模型的tokenizer,通过数据驱动的方法生成词汇表。它将文本分解为最小的子词单元,处理未见过的词汇时表现出色。

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
tokens = tokenizer.tokenize("unaffable")
print(tokens)
# 输出: ['un', '##aff', '##able']
​
 
 

2.2 Byte-Pair Encoding (BPE)

BPE是一种基于频率统计的分词算法,常用于GPT系列模型。它从字符级别开始,通过合并频率最高的字符对,逐步构建子词单元。

from tokenizers import Tokenizer, models, pre_tokenizers, decoders, trainers
tokenizer = Tokenizer(models.BPE())
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel()
trainer = trainers.BpeTrainer(special_tokens=["<pad>", "<s>", "</s>", "<unk>", "<mask>"])
tokenizer.train(files=["my_dataset.txt"], trainer=trainer)
tokens = tokenizer.encode("unaffable").tokens
print(tokens)
# 输出: ['un', 'aff', 'able']
​
 
 

2.3 SentencePiece

SentencePiece是一种无需预先分词的分词算法,广泛应用于多语言模型如T5。它采用BPE或Unigram模型进行子词分解。

import sentencepiece as spm
spm.SentencePieceTrainer.train('--input=my_dataset.txt --model_prefix=m --vocab_size=8000')
sp = spm.SentencePieceProcessor()
sp.load('m.model')
tokens = sp.encode_as_pieces("unaffable")
print(tokens)
# 输出: ['▁un', 'aff', 'able']
​
 
 

3. 神经网络Tokenizer

3.1 神经网络分词(Neural Tokenizer)

神经网络分词器使用深度学习模型进行分词,能够捕捉更复杂的语言现象。这些模型通常通过端到端的训练过程,直接从数据中学习分词规则。

import tensorflow as tf
import tensorflow_text as tf_text

tokenizer = tf_text.BertTokenizer('vocab.txt', lower_case=True)
tokens = tokenizer.tokenize(["Hello, world! This is a test."])
print(tokens)
# 输出: <tf.RaggedTensor [[[7592, 1010, 2088, 999], [2023, 2003, 1037, 3231, 1012]]]>
posted @ 2025-08-22 11:46  令小飞  阅读(48)  评论(0)    收藏  举报