无dict.txt时,如何用Fairseq Transformer结合Hugging Face预处理数据完成翻译
问题解答
仅适配输入输出数据可行吗?
不行。Fairseq的Transformer模型在加载、训练和推理过程中,必须依赖dict.txt文件完成token与索引的双向映射——它需要通过dict.txt知道每个输入token对应的索引值,也需要用它把模型输出的索引转回可读的token。没有这个文件,模型根本无法正确解析你的输入数据,也没法生成有效的翻译结果。
如何生成dict.txt?
有两种实用方法,根据你的场景选择:
方法1:从Hugging Face分词器词汇表直接转换
既然已经用了HF的分词器,直接把它的词汇表转成Fairseq要求的格式就行。Fairseq的dict.txt每行格式是token 出现次数,如果没有统计实际频次,填个非零数字(比如1)就够用(Fairseq主要用的是token-索引映射关系,频次仅在词汇剪枝等场景有用)。
示例代码:
from transformers import AutoTokenizer # 加载你之前用的HF分词器 tokenizer = AutoTokenizer.from_pretrained("你的分词器名称,比如bert-base-chinese或facebook/bart-base") # 生成源语言和目标语言的dict.txt(双语翻译需分别生成) with open("src.dict.txt", "w", encoding="utf-8") as f: # 按分词器的索引顺序写入,保证映射关系正确 for token, idx in tokenizer.vocab.items(): f.write(f"{token} 1\n")
方法2:用Fairseq工具从预处理数据生成
如果你已经有了分好词的训练数据文件(比如train.src和train.tgt,每行是一个分好词的句子),可以用Fairseq自带的fairseq-preprocess命令自动统计token频次并生成dict:
fairseq-preprocess \ --source-lang src \ --target-lang tgt \ --trainpref train \ --destdir data-bin \ --workers 4
执行完后,data-bin目录下会生成src.dict.txt和tgt.dict.txt,就是你需要的文件。
注意事项
如果是加载预训练的Fairseq模型,必须保证你生成的dict和预训练模型的dict完全一致,否则模型无法正常加载;如果是自己训练模型,上面两种方法都可以,只要保证训练数据的token和dict的映射对应就行。
内容的提问来源于stack exchange,提问作者rgy k
相关产品推荐
相关产品推荐

