如何让英文大语言模型支持中文:构建自定义 Tokenization
Part1 前言
目前,大语言模型(LLM)呈爆发式增长,其中基于 LLaMA 家族的模型占据了半壁江山。然而,原始的 LLaMA 模型主要基于英文语料训练,对中文的支持并不友好,直接处理中文文本时往往会出现分词破碎、语义理解偏差等问题。为了解决这一问题,我们需要扩充原始词表(Vocabulary),使其包含中文字符或词汇,从而实现对中文的有效 Tokenization。
本文将详细讲解如何扩充词表以支持中文 Token 化,涵盖数据预处理、SentencePiece 训练、Transformers 库加载、中英文词表合并以及模型 Embedding 层适配等完整流程。
Part2 数据预处理
高质量的语料是训练高质量词表的基础。我们通常选择具有代表性的中文文本进行预处理。这里我们以《斗破苍穹》小说语料为例,每一行代表一句或多句话。
在预处理阶段,主要目标是清洗噪声数据,确保输入给训练器的文本干净且格式规范。具体步骤包括去除特殊标记、空行以及无关的元数据信息。
import os
def preprocess_corpus(input_path, output_path):
"""
预处理中文语料文件
:param input_path: 输入文件路径
:param output_path: 输出文件路径
"""
if not os.path.exists(input_path):
raise FileNotFoundError(f"Input file {input_path} not found")
with open(input_path, "r", encoding="utf-8") as fp:
data = fp.read().strip().split("\n")
sentences = []
for d in data:
d = d.strip()
# 过滤掉特定标记、空行或来源说明
if "===" in d or len(d) == 0 or d.startswith("《斗破苍穹》来自:"):
continue
sentences.append(d)
with open(output_path, "w", encoding="utf-8") as fp:
fp.write("\n".join(sentences))
preprocess_corpus(, )


