以下是完整的 Jupyter Notebook 示例,包括使用 mBART-50 进行 中文 ↔ 高棉语互译,以及一个基本的微调流程框架,
Part 1:中 ↔ 高棉语互译(推理)
# 安装必要库(第一次使用时请运行)
!pip install transformers sentencepiece torch
from transformers import MBartForConditionalGeneration, MBart50TokenizerFast
# 加载预训练模型和分词器
model = MBartForConditionalGeneration. from_pretrained("facebook/ mbart-large-50-many-to-many- mmt")
tokenizer = MBart50TokenizerFast.from_ pretrained("facebook/mbart- large-50-many-to-many-mmt")
def translate(text, source_lang, target_lang):
tokenizer.src_lang = source_lang
encoded = tokenizer(text, return_tensors="pt")
forced_bos_token_id = tokenizer.lang_code_to_id[ target_lang]
generated_tokens = model.generate(**encoded, forced_bos_token_id=forced_ bos_token_id)
return tokenizer.batch_decode( generated_tokens, skip_special_tokens=True)[0]
中文 → 高棉语
zh_text = "你好,欢迎来到柬埔寨!"
km_result = translate(zh_text, source_lang="zh_CN", target_lang="km_KH")
print("翻译成高棉语:", km_result)
高棉语 → 中文
km_text = "សួស្តី! សូមស្វាគមន៍មកកាន់ប្រទេសកម្ពុជា ។"
zh_result = translate(km_text, source_lang="km_KH", target_lang="zh_CN")
print("翻译成中文:", zh_result)
Part 2:微调 mBART-50(中文 ↔ 高棉语)
1. 数据准备
准备格式如下的翻译语料(推荐 TSV/CSV 格式):
source_text target_text
你好,欢迎来到柬埔寨! សួស្តី! សូមស្វាគមន៍មកកាន់ប្រទេសកម្ពុជា ។
谢谢你的帮助! សូមអរគុណចំពោះជំនួយរបស់អ្នក!
保存为 zh_km.tsv
2. 微调代码(使用
Trainer)
from datasets import load_dataset
from transformers import Seq2SeqTrainingArguments, Seq2SeqTrainer
from transformers import DataCollatorForSeq2Seq
import torch
# 加载 TSV 数据集
dataset = load_dataset('csv', data_files='zh_km.tsv', delimiter='\t', split='train')
dataset = dataset.train_test_split(test_ size=0.1)
# 添加语言前缀(重要!)
def preprocess(example, src_lang, tgt_lang):
tokenizer.src_lang = src_lang
inputs = tokenizer(example['source_ text'], truncation=True, padding="max_length", max_length=128)
targets = tokenizer(example['target_ text'], truncation=True, padding="max_length", max_length=128)
inputs["labels"] = targets["input_ids"]
return inputs
tokenizer.src_lang = "zh_CN" # 源语言设置
dataset = dataset.map(lambda x: preprocess(x, "zh_CN", "km_KH"), batched=True)
# 微调参数
training_args = Seq2SeqTrainingArguments(
output_dir="./mbart50-zh-km- finetuned",
evaluation_strategy="epoch",
learning_rate=2e-5,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
num_train_epochs=5,
save_strategy="epoch",
predict_with_generate=True,
fp16=torch.cuda.is_available() , # 启用混合精度加速(如果有GPU)
)
data_collator = DataCollatorForSeq2Seq( tokenizer, model=model)
# 创建 Trainer
trainer = Seq2SeqTrainer(
model=model,
args=training_args,
train_dataset=dataset["train"] ,
eval_dataset=dataset["test"],
tokenizer=tokenizer,
data_collator=data_collator,
)
# 微调模型
trainer.train()
3. 微调完成后使用新模型翻译:
# 加载微调后的模型
from transformers import MBartForConditionalGeneration, MBart50TokenizerFast
finetuned_model = MBartForConditionalGeneration. from_pretrained("./mbart50-zh- km-finetuned")
finetuned_tokenizer = MBart50TokenizerFast.from_ pretrained("facebook/mbart- large-50-many-to-many-mmt")
# 同样使用 translate 函数,只是换成 finetuned_model 和 finetuned_tokenizer 即可
进阶建议
- 语料越多,微调效果越好(建议 >5000 对句子)。
- 可加入回译(back translation)生成额外训练数据。
- 可用 BLEU、chrF++ 进行评估。
需要我为你提供:
一个模板数据文件(zh_km.tsv)
封装成可复用函数或 API
微调后 BLEU 分数的评估脚本