分词器模型的简单介绍

学习如何处理中文分词
2025-3-16
chromadbembeddingsvector-database
问题描述
在实际测试中,使用 all-MiniLM-L6-v2
模型处理中文文本时,发现许多中文字符被标记为 [UNK]
(Unknown Token)。例如,输入句子 "这是一个测试句子。"
的分词结果为: 'UNK', 'UNK', '一', 'UNK', 'UNK', 'UNK', 'UNK', '子', '。',这表明模型无法正确识别大部分中文字符,导致分词效果不理想。
问题分析
1. 词汇表限制
all-MiniLM-L6-v2
是基于 WordPiece 分词器 的模型,其词汇表主要针对英语优化,中文支持非常有限。许多中文字符未被包含在词汇表中,因此被标记为 [UNK]
。
2. 分词方式
- 该模型的分词器会将中文逐字拆分,但由于词汇表限制,许多字无法识别。
- 例如,只有少数常见字(如“一”、“子”、“。”)被识别,其余字符被标记为
[UNK]
。
3. 模型设计目标
all-MiniLM-L6-v2
主要用于英语任务,虽然理论上可以处理多语言文本,但对中文的支持非常有限。
解决方案
1. 使用专门的中文模型
bert-base-chinese
这是 Hugging Face 提供的专门针对中文训练的 BERT 模型,支持完整的中文字符集,分词效果更好。
from transformers import AutoTokenizer
model_name = "bert-base-chinese"
tokenizer = AutoTokenizer.from_pretrained(model_name)
text = "这是一个测试句子。"
tokens = tokenizer.tokenize(text)
token_ids = tokenizer.encode(text)
print("Tokens:", tokens) # 例如:['这', '是', '一', '个', '测', '试', '句', '子', '。']
print("Token IDs:", token_ids)
2. 使用多语言模型
paraphrase-multilingual-MiniLM-L12-v2
这是 Sentence Transformers 提供的多语言模型,支持包括中文在内的多种语言,分词效果更好。我们可以看到分词的效果不是单个字的进行分词,也是可以做到词语的分割
from transformers import AutoTokenizer
model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
text = "这是一个测试句子。"
tokens = tokenizer.tokenize(text)
token_ids = tokenizer.encode(text)
print("Tokens:", tokens) # 例如:['这', '是', '一个', '测试', '句子', '。']
print("Token IDs:", token_ids)
xlm-roberta-base
这是一个强大的多语言模型,支持 100 多种语言,包括中文。