机器翻译Machine Translation及其Tensorflow代码实现(含注意力attention)

机器翻译

翻译句子 x x x从一种语言(源语言)到句子 y y y另一种语言(目标语言)。下面这个例子就是从法语转换成为英文。

统计机器翻译

英文是Statistical Machine Translation (SMT)。核心思想是从数据中学习概率模型。
a r g m a x y P ( y ∣ x ) = a r g m a x y P ( x ∣ y ) P ( y ) argmax_y P(y|x) \\\\ = argmax_y P(x|y) P(y) argmaxyP(yx)=argmaxyP(xy)P(y)
公式前一部分 P ( x ∣ y ) P(x|y) P(xy)是翻译模型,负责翻译词和词组。后一部分 P ( y ) P(y) P(y)是语言模型,负责使译文更加流畅。

优点

  1. 思路容易理解,有可解释性

缺点

  1. 需要大量的特征工程,耗费人力
  2. 空间复杂度较高,需要存储额外资源,例如平行语句

对齐

为了训练出一个性能优秀的翻译模型,我们首先需要有很多的平行数据(从原文到译文)。这就需要引出对齐的概念。找到原文中的哪个短语对应到译文中的哪个短语。我们用 a a a代表对齐。因此,我们的翻译模型从最大化 P ( x ∣ y ) P(x|y) P(xy)变成了最大化 P ( x , a ∣ y ) P(x,a|y) P(x,ay)。对齐的难点就在于原文中可能存在词语没有对应的译文(counterpart)。我们还需要考虑单词在句子中不同位置导致对句意产生的不同的影响。

即便能够进行对应,对齐本身也十分复杂,有可能出现以下3种情况。

多对一

多个译文词组对应一个原文词组。

一对多

一个译文词组对应多个原文词组。类似的词被称为多产词(fertile word)。

多对多

多个译文词组对应多个原文词组。无法进行更细致的拆分。

解码

在对齐之后,我们需要进行翻译。如果使用暴力方法,即枚举所有可能的译文并计算其概率,显然不太现实,因为复杂度太高。更有效的方法是进行启发式搜索算法(heuristic search algorithm),放弃探索所有可能性较小的译文。

神经机器翻译

英文是Neural Machine Translation (NMT)。模型架构是序列到序列模型(sequence-to-sequence, seq2seq),详情请参见我的另一篇博客

在NMT中,我们直接计算 P ( y ∣ x ) P(y|x) P(yx)而不是像SMT拆开计算。
P ( y ∣ x ) = P ( y 1 ∣ x ) P ( y 2 ∣ y 1 , x ) . . . P ( y T ∣ y 1 , . . . , y T − 1 , x ) P(y|x) = P(y_1|x) P(y_2|y_1,x) ... P(y_T|y_1,...,y_{T-1},x) P(yx)=P(y1x)P(y2y1,x)...P(yTy1,...,yT1

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
机器翻译中的翻译方法有很多种,其中一种比较经典的方法是基于统计机器翻译(Statistical Machine Translation,SMT)的模型,该模型包括两个部分:语言模型和翻译模型。 下面是一个简单的SMT翻译模型的代码实现: ```python # 导入必要的库 import collections import numpy as np # 定义翻译模型类 class TranslationModel: def __init__(self, source_corpus, target_corpus): self.source_corpus = source_corpus self.target_corpus = target_corpus self.source_vocab_size = len(self.source_corpus) self.target_vocab_size = len(self.target_corpus) # 计算翻译概率 self.translation_probs = self.get_translation_probs() # 计算翻译概率 def get_translation_probs(self): translation_probs = np.zeros((self.source_vocab_size, self.target_vocab_size)) for source_sentence, target_sentence in zip(self.source_corpus, self.target_corpus): for source_word in source_sentence: for target_word in target_sentence: translation_probs[source_word][target_word] += 1 for i in range(self.source_vocab_size): total_count = sum(translation_probs[i]) if total_count > 0: translation_probs[i] /= total_count return translation_probs # 翻译 def translate(self, source_sentence): target_sentence = [] for source_word in source_sentence: best_target_word = np.argmax(self.translation_probs[source_word]) target_sentence.append(best_target_word) return target_sentence ``` 其中,`source_corpus`和`target_corpus`分别表示源语言语料库和目标语言语料库,`source_vocab_size`和`target_vocab_size`分别表示源语言词汇表大小和目标语言词汇表大小。`get_translation_probs()`方法用于计算翻译概率,`translate()`方法用于进行翻译。 需要注意的是,这只是一个简单的SMT翻译模型的实现,实际应用中会使用更加复杂的模型和技术进行机器翻译

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值