分词器模型的简单介绍

怎么解决中文分词问题?

学习如何处理中文分词

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 多种语言,包括中文。