机器翻译是使计算机能够将一种言语转化为另一种言语的技能领域。本文从简介、根据规矩、计算和神经网络的办法入手,深入解析了各种机器翻译策略。同时,详细探讨了点评机器翻译功能的多种规范和东西,包含BLEU、METEOR等,以保证翻译的精确性和质量。

重视TechLead,共享AI全维度知识。作者具有10+年互联网服务架构、AI产品研制经历、团队办理经历,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目办理专业人士,上亿营收AI产品研制负责人。

NLP机器翻译全景:从基本原理到技能实战全解析

一、机器翻译简介

机器翻译,作为天然言语处理的一个核心领域,一向都是研究者们重视的焦点。其方针是完成计算机主动将一种言语翻译成另一种言语,而不需求人类的参加。

1. 什么是机器翻译 (MT)?

NLP机器翻译全景:从基本原理到技能实战全解析
机器翻译(MT)是一种主动将源言语文本翻译成方针言语的技能。它使用特定的算法和模型,尝试在不同言语之间完成最佳的语义映射。

示例: 当你输入”Hello, world!”到Google翻译,并将其从英语翻译成法语,你会得到”Bonjour le monde!”。这便是机器翻译的一个简略示例。

2. 源言语和方针言语

  • 源言语: 你想要翻译的原始文本的言语。

示例: 在前面的比如中,”Hello, world!”的言语,即英语,便是源言语。

  • 方针言语: 你想要将源言语文本翻译成的言语。

示例: 在上述示例中,法语是方针言语。

3. 翻译模型

机器翻译的核心是翻译模型,它能够根据规矩、根据计算或根据神经网络。这些模型都试图找到最佳的翻译,但它们的作业原理和侧重点有所不同。

示例: 一个根据规矩的翻译模型或许会有一个词典来查找单词的直接对应联系。所以,它或许会将英文的”cat”直接翻译成法文的”chat”。而一个根据计算的模型或许会考虑语料库中的短语和语句的出现频率,来判断”cat”在某个上下文中是否应该翻译成”chat”。

4. 上下文的重要性

在机器翻译中,单独的单词翻译一般是不够的。上下文关于取得精确翻译至关重要。一些词在不同的上下文中或许有不同的意义和翻译。

示例: 英文单词”bank”能够指”河边”也能够指”银行”。假如上下文中提到了”money”,那么正确的翻译或许是”银行”。而假如上下文中提到了”river”,则”bank”应该被翻译为”河边”。

以上内容供给了机器翻译的一个扼要介绍。从界说到各种细节,每一部分都是为了协助读者更好地了解这一杂乱但令人兴奋的技能领域。


二、根据规矩的机器翻译 (RBMT)

NLP机器翻译全景:从基本原理到技能实战全解析
根据规矩的机器翻译(RBMT)是一种使用言语学规矩将源言语文本转换为方针言语文本的技能。这些规矩一般由言语学家手艺编写,覆盖了语法、词汇和其他言语相关的特性。

1. 规矩的制定

在RBMT中,言语学家需求为源言语和方针言语编写很多的转换规矩。这些规矩描绘了怎么根据源言语的语法结构将其转换为方针言语的语法结构。

示例: 在英法翻译中,英文的形容词一般坐落名词之前,而法语的形容词则一般坐落名词之后。因此,规矩或许会指示将”red apple”翻译为”pomme rouge”。

2. 词典和词汇挑选

除了语法转换规矩,RBMT还依靠于详细的双语词典。这些词典包含了源言语和方针言语之间的单词和短语的对应联系。

示例: 词典或许会指出英文单词”book”能够翻译为法文的”livre”。

3. 约束与应战

虽然RBMT在某些领域和应用中能够供给相对精确的翻译,但它也面临着一些约束。规矩的数量或许会变得十分庞大,难以维护;而且,关于某些杂乱和歧义的语句,规矩或许无法供给精确的翻译。

示例: “I read books on the bank.” 这句话中的”bank”是指”河边”仍是”银行”?没有上下文,根据规矩的翻译体系或许会难以做出精确的挑选。

4. PyTorch完成

虽然现代的机器翻译体系很少彻底依靠于RBMT,但咱们能够简略地使用PyTorch来模仿一个简化版的RBMT体系。

import torch
# 假定咱们已经有了一个英法词典
dictionary = {
    "red": "rouge",
    "apple": "pomme"
}
def rule_based_translation(sentence: str) -> str:
    translated_words = []
    for word in sentence.split():
        translated_words.append(dictionary.get(word, word))
    return ' '.join(translated_words)
# 输入输出示例
sentence = "red apple"
print(rule_based_translation(sentence))  # 输出: rouge pomme

在这个简略的比如中,咱们界说了一个基本的英法词典,并创建了一个函数来执行根据规矩的翻译。这仅仅一个十分简化的示例,实在的RBMT体系将触及更杂乱的语法和结构转换规矩。


三、根据计算的机器翻译 (SMT)

NLP机器翻译全景:从基本原理到技能实战全解析
根据计算的机器翻译 (SMT) 使用计算模型从很多双语文本数据中学习怎么将源言语翻译为方针言语。与依靠言语学家手艺编写规矩的RBMT不同,SMT主动从数据中学习翻译规矩和模式。

1. 数据驱动

SMT体系一般从双语语料库(包含源言语文本和其对应的方针言语翻译)中学习。经过分析成千上万的语句对,体系学会了词语、短语和语句的最有或许的翻译。

示例: 假如在许多不同的语句对中,“cat”经常被翻译为“chat”,体系将学习到这种对应联系。

2. 短语对齐

SMT一般使用所谓的“短语表”,这是从双语语料库中主动提取的短语对齐的列表。

示例: 体系或许会从语句对中学习到”take a break”对应于法文中的”prendre une pause”。

3. 评分和挑选

SMT使用多个计算模型来点评和挑选最佳的翻译。这包含言语模型(点评方针言语翻译的流畅性)和翻译模型(点评翻译的精确性)。

示例: 在翻译”apple pie”时,体系或许会生成多个候选翻译,然后挑选评分最高的那个。

4. PyTorch完成

完好的SMT体系十分杂乱,触及多个组件和杂乱的模型。但为了阐明,咱们能够使用PyTorch创建一个简化的根据计算的词对齐模型:

import torch
import torch.nn as nn
import torch.optim as optim
# 假定咱们有一些双语语句对数据
source_sentences = ["apple", "red fruit"]
target_sentences = ["pomme", "fruit rouge"]
# 将语句转换为单词索引
source_vocab = {"apple": 0, "red": 1, "fruit": 2}
target_vocab = {"pomme": 0, "fruit": 1, "rouge": 2}
source_indices = [[source_vocab[word] for word in sentence.split()] for sentence in source_sentences]
target_indices = [[target_vocab[word] for word in sentence.split()] for sentence in target_sentences]
# 简略的对齐模型
class AlignmentModel(nn.Module):
    def __init__(self, source_vocab_size, target_vocab_size, embedding_dim=8):
        super(AlignmentModel, self).__init__()
        self.source_embedding = nn.Embedding(source_vocab_size, embedding_dim)
        self.target_embedding = nn.Embedding(target_vocab_size, embedding_dim)
        self.alignment = nn.Linear(embedding_dim, embedding_dim, bias=False)
    def forward(self, source, target):
        source_embed = self.source_embedding(source)
        target_embed = self.target_embedding(target)
        scores = torch.matmul(source_embed, self.alignment(target_embed).transpose(1, 2))
        return scores
model = AlignmentModel(len(source_vocab), len(target_vocab))
criterion = nn.CosineEmbeddingLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练模型
for epoch in range(1000):
    total_loss = 0
    for src, tgt in zip(source_indices, target_indices):
        src = torch.LongTensor(src)
        tgt = torch.LongTensor(tgt)
        scores = model(src.unsqueeze(0), tgt.unsqueeze(0))
        loss = criterion(scores, torch.ones_like(scores), torch.tensor(1.0))
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        total_loss += loss.item()
    if epoch % 100 == 0:
        print(f"Epoch {epoch}, Loss: {total_loss}")
# 输入: apple
# 输出: pomme (根据得分挑选最佳匹配的词)

此代码为一个简略的词对齐模型,它试图学习源词和方针词之间的对齐联系。这仅仅SMT的冰山一角,完好的体系会触及语句等级的对齐、短语提取、多个计算模型等。


四、根据神经网络的机器翻译

NLP机器翻译全景:从基本原理到技能实战全解析
根据神经网络的机器翻译(NMT)使用深度学习技能,特别是递归神经网络(RNN)、长短时记忆网络(LSTM)或Transformer结构,以端到端的方式进行翻译。它直接从源言语到方针言语的语句或序列进行映射,不需求杂乱的特性工程或中间步骤。

1. Encoder-Decoder结构

NMT的核心是Encoder-Decoder结构。Encoder将源语句编码为一个固定大小的向量,而Decoder将这个向量解码为方针语句。

示例: 在将英文语句 “I am learning” 翻译成法文 “Je suis en train d’apprendre” 时,Encoder首先将英文语句转换为一个向量,然后Decoder使用这个向量来生成法文语句。

2. Attention机制

Attention机制答应模型在解码时“重视”源语句中的不同部分。这使得翻译愈加精确,尤其是关于长语句。

示例: 在翻译 “I am learning to translate with neural networks” 时,当模型生成 “rseaux”(网络)这个词时,它或许会特别重视源句中的 “networks”。

3. 词嵌入

词嵌入是将单词转换为向量的技能,这些向量捕捉单词的语义信息。NMT模型一般使用预训练的词嵌入,如Word2Vec或GloVe,但也能够在训练过程中学习词嵌入。

示例: “king” 和 “queen” 的向量或许会在向量空间中很挨近,由于它们都是关于皇室的。

4. PyTorch完成

以下是一个简略的根据LSTM和Attention的NMT模型完成示例:

import torch
import torch.nn as nn
import torch.optim as optim
# 为简化,界说一个小的词汇表和数据
source_vocab = {"<PAD>": 0, "<SOS>": 1, "<EOS>": 2, "I": 3, "am": 4, "learning": 5}
target_vocab = {"<PAD>": 0, "<SOS>": 1, "<EOS>": 2, "Je": 3, "suis": 4, "apprenant": 5}
source_sentences = [["<SOS>", "I", "am", "learning", "<EOS>"]]
target_sentences = [["<SOS>", "Je", "suis", "apprenant", "<EOS>"]]
# 参数
embedding_dim = 256
hidden_dim = 512
vocab_size = len(source_vocab)
target_vocab_size = len(target_vocab)
# Encoder
class Encoder(nn.Module):
    def __init__(self):
        super(Encoder, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
    def forward(self, x):
        x = self.embedding(x)
        outputs, (hidden, cell) = self.lstm(x)
        return outputs, (hidden, cell)
# Attention and Decoder
class DecoderWithAttention(nn.Module):
    def __init__(self):
        super(DecoderWithAttention, self).__init__()
        self.embedding = nn.Embedding(target_vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim + hidden_dim, hidden_dim, batch_first=True)
        self.attention = nn.Linear(hidden_dim + hidden_dim, 1)
        self.fc = nn.Linear(hidden_dim, target_vocab_size)
    def forward(self, x, encoder_outputs, hidden, cell):
        x = self.embedding(x)
        seq_length = encoder_outputs.shape[1]
        hidden_repeat = hidden.repeat(seq_length, 1, 1).permute(1, 0, 2)
        attention_weights = torch.tanh(self.attention(torch.cat((encoder_outputs, hidden_repeat), dim=2)))
        attention_weights = torch.softmax(attention_weights, dim=1)
        context = torch.sum(attention_weights * encoder_outputs, dim=1).unsqueeze(1)
        x = torch.cat((x, context), dim=2)
        outputs, (hidden, cell) = self.lstm(x, (hidden, cell))
        x = self.fc(outputs)
        return x, hidden, cell
# Training loop
encoder = Encoder()
decoder = DecoderWithAttention()
optimizer = optim.Adam(list(encoder.parameters()) + list(decoder.parameters()), lr=0.001)
criterion = nn.CrossEntropyLoss(ignore_index=0
)
for epoch in range(1000):
    for src, tgt in zip(source_sentences, target_sentences):
        src = torch.tensor([source_vocab[word] for word in src]).unsqueeze(0)
        tgt = torch.tensor([target_vocab[word] for word in tgt]).unsqueeze(0)
        optimizer.zero_grad()
        encoder_outputs, (hidden, cell) = encoder(src)
        decoder_input = tgt[:, :-1]
        decoder_output, _, _ = decoder(decoder_input, encoder_outputs, hidden, cell)
        loss = criterion(decoder_output.squeeze(1), tgt[:, 1:].squeeze(1))
        loss.backward()
        optimizer.step()
    if epoch % 100 == 0:
        print(f"Epoch {epoch}, Loss: {loss.item()}")
# 输入: <SOS> I am learning <EOS>
# 输出: <SOS> Je suis apprenant <EOS>

此代码展现了一个根据注意力的NMT模型,从源语句到方针语句的映射。这仅仅NMT的基础,更高档的模型如Transformer会有更多的细节和技能要害。


五、点评和点评办法

机器翻译的点评是衡量模型功能的要害部分。精确、流畅和天然的翻译输出是咱们的方针,但怎么量化这些方针并确认模型的质量呢?

1. BLEU Score

BLEU(Bilingual Evaluation Understudy)分数是机器翻译中最常用的主动点评办法。它经过比较机器翻译输出和多个参阅翻译之间的n-gram重叠来作业。

示例: 假定机器的输出是 “the cat is on the mat”,而参阅输出是 “the cat is sitting on the mat”。1-gram精度是5/6,2-gram精度是4/5,以此类推。BLEU分数会考虑到这些各级的精度。

2. METEOR

METEOR(Metric for Evaluation of Translation with Explicit ORdering)是另一个点评机器翻译的办法,它考虑了同义词匹配、词干匹配以及词序。

示例: 假如机器输出是 “the pet is on the rug”,而参阅翻译是 “the cat is on the mat”,虽然有些词不彻底匹配,但METEOR会以为”pet”和”cat”、”rug”和”mat”之间有某种相似性。

3. ROUGE

ROUGE (Recall-Oriented Understudy for Gisting Evaluation) 一般用于点评主动文摘,但也能够用于机器翻译。它考虑了机器翻译输出和参阅翻译之间的n-gram的召回率。

示例: 关于同样的语句 “the cat is on the mat” 和 “the cat is sitting on the mat”,ROUGE-1召回率为6/7。

4. TER

TER (Translation Edit Rate) 衡量了将机器翻译输出转换为参阅翻译所需的最少编辑次数(如插入、删除、替换等)。

示例: 关于 “the cat sat on the mat” 和 “the cat is sitting on the mat”,TER是1/7,由于需求添加一个”is”。

5. 人工点评

虽然主动点评办法供给了快速的反应,但人工点评仍然是保证翻译质量的金规范。点评者一般会根据精确性、流畅性和是否忠诚于源文本来评分。

示例: 一个语句或许取得满分的BLEU分数,但假如其翻译内容与源内容的目的不符,或者读起来不天然,那么人类点评者或许会给予较低的评分。

总的来说,点评机器翻译的功能是一个多方面的任务,触及到多种东西和办法。抱负情况下,研究者和开发者会结合多种点评办法,以取得对模型功能的全面了解。

重视TechLead,共享AI全维度知识。作者具有10+年互联网服务架构、AI产品研制经历、团队办理经历,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目办理专业人士,上亿营收AI产品研制负责人。

如有协助,请多重视 TeahLead KrisChang,10+年的互联网和人工智能从业经历,10年+技能和业务团队办理经历,同济软件工程本科,复旦工程办理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。