训练Transformer进行英法翻译
立即解锁
发布时间: 2025-09-05 01:44:22 阅读量: 4 订阅数: 19 AIGC 

### 训练Transformer进行英法翻译
在自然语言处理领域,Transformer模型在机器翻译任务中表现出色。本文将详细介绍如何训练一个Transformer模型来实现英语到法语的翻译,包括子词分词、词嵌入、位置编码以及模型训练和使用等关键步骤。
#### 1. 项目概述
我们的目标是使用收集到的超过47000对英法翻译对,训练一个编码器 - 解码器Transformer模型,实现英语到法语的准确翻译。具体步骤如下:
1. **子词分词**:将英语和法语短语分割成子词,并创建词汇表将子词映射为索引。
2. **词嵌入和位置编码**:将索引转换为紧凑的向量表示,并添加位置编码,让模型了解词的顺序。
3. **模型训练**:使用英法翻译对作为训练数据集,训练编码器 - 解码器Transformer模型。
4. **模型使用**:使用训练好的模型将常见英语短语翻译成法语。
#### 2. 子词分词
分词是自然语言处理中的重要步骤,常见的分词方法有字符级分词、词级分词和子词分词。我们选择子词分词,它能在保留常用词完整性的同时,将不常见或复杂的词拆分成子组件。
##### 2.1 英法短语分词
首先,我们需要下载包含英法翻译的数据集。
```python
import pandas as pd
# 下载并解压文件后,将en2fr.csv放在/files/文件夹下
df = pd.read_csv("files/en2fr.csv")
num_examples = len(df)
print(f"there are {num_examples} examples in the training data")
print(df.iloc[30856]["en"])
print(df.iloc[30856]["fr"])
```
输出结果:
```plaintext
there are 47173 examples in the training data
How are you?
Comment êtes-vous?
```
接下来,安装`transformers`库,并使用预训练的XLM模型作为分词器。
```python
# 在Jupyter Notebook的新单元格中运行以下代码安装库
!pip install transformers
from transformers import XLMTokenizer
tokenizer = XLMTokenizer.from_pretrained("xlm-clm-enfr-1024")
tokenized_en = tokenizer.tokenize("I don't speak French.")
print(tokenized_en)
tokenized_fr = tokenizer.tokenize("Je ne parle pas français.")
print(tokenized_fr)
print(tokenizer.tokenize("How are you?"))
print(tokenizer.tokenize("Comment êtes-vous?"))
```
输出结果:
```plaintext
['i</w>', 'don</w>', "'t</w>", 'speak</w>', 'fr', 'ench</w>', '.</w>']
['je</w>', 'ne</w>', 'parle</w>', 'pas</w>', 'franc', 'ais</w>', '.</w>']
['how</w>', 'are</w>', 'you</w>', '?</w>']
['comment</w>', 'et', 'es-vous</w>', '?</w>']
```
注意,XLM模型使用`'</w>'`作为词分隔符,但当两个子词属于同一个词时不插入。例如,“French”被拆分为“fr”和“ench”,模型不会在它们之间插入`</w>`。
为了将文本转换为数值表示,我们创建字典将英语和法语子词映射为整数。
```python
from collections import Counter
# 英语子词映射
en = df["en"].tolist()
en_tokens = [["BOS"] + tokenizer.tokenize(x) + ["EOS"] for x in en]
PAD = 0
UNK = 1
word_count = Counter()
for sentence in en_tokens:
for word in sentence:
word_count[word] += 1
frequency = word_count.most_common(50000)
total_en_words = len(frequency) + 2
en_word_dict = {w[0]: idx + 2 for idx, w in enumerate(frequency)}
en_word_dict["PAD"] = PAD
en_word_dict["UNK"] = UNK
en_idx_dict = {v: k for k, v in en_word_dict.items()}
# 法语子词映射
fr = df["fr"].tolist()
fr_tokens = [["BOS"] + tokenizer.tokenize(x) + ["EOS"] for x in fr]
word_count = Counter()
for sentence in fr_tokens:
for word in sentence:
word_count[word] += 1
frequency = word_count.most_common(50000)
total_fr_words = len(frequency) + 2
fr_word_dict = {w[0]: idx + 2 for idx, w in enumerate(frequency)}
fr_word_dict["PAD"] = PAD
fr_word_dict["UNK"] = UNK
fr_idx_dict = {v: k for k, v in fr_word_dict.items()}
```
使用这些字典,我们可以将英语和法语句子转换为数值表示,并将数值表示转换回句子。
```python
# 英语句子转换为数值表示
tokenized_en = tokenizer.tokenize("I don't speak French.")
enidx = [en_word_dict.get(i, UNK) for i in tokenized_en]
print(enidx)
# 数值表示转换回英语句子
entokens = [en_idx_dict.get(i, "UNK") for i in enidx]
print(entokens)
en_phrase = "".join(entokens)
en_phrase = en_phrase.replace("</w>", " ")
for x in '''?:;.,'("-!&)%''':
en_phrase = en_phrase.replace(f" {x}", f"{x}")
print(en_phrase)
# 法语句子转换为数值表示
tokenized_fr = tokenizer.tokenize("Je ne parle pas français.")
fridx = [fr_word_dict.get(i, UNK) for i in tokenized_fr]
print(fridx)
# 数值表示转换回法语句子
frtokens = [fr_idx_dict.get(i, "UNK") for i in fridx]
print(frtokens)
fr_phrase = "".join(frtokens)
fr_phrase = fr_phrase.replace("</w>", " ")
for x in '''?:;.,'("-!&)%''':
fr_phrase = fr_phrase.replace(f" {x}", f"{x}")
print(fr_phrase)
```
输出结果:
```plaintext
[15, 100, 38, 377, 476, 574, 5]
['i</w>', 'don</w>', "'t</w>", 'speak</w>', 'fr', 'ench</w>', '.</w>']
i don't speak french.
[28, 40, 231, 32, 726, 370, 4]
['je</w>', 'ne</w>', 'parle</w>', 'pas</w>', 'franc', 'ais</w>', '.</w>']
```
0
0
复制全文
相关推荐









