请提供完整的 Jupyter Notebook 示例、翻译微调方法

以下是完整的 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++ 进行评估。

 

 


 

需要我为你提供:

 

  1. 📁 一个模板数据文件(zh_km.tsv)
  2. 📦 封装成可复用函数或 API
  3. 🧪 微调后 BLEU 分数的评估脚本