此篇博客分为两部分,第一部分是对机器翻译的了解,第二部分则是对第一个打卡的解析。
机器翻译
1.基于规则的机器翻译
该方法依赖于语言学家制定的语法规则和词典进行翻译,基于“语义在不同语言中有对应符号”的假设,将翻译简化为词替换过程。然而,这种方法灵活性差,难以应对复杂语言结构和多义词,且需深入理解两种语言的语法和词汇。尽管理论清晰,但实践中因句法规则选择低效、规则规模庞大且难以有效组织(甚至相互矛盾)、缺乏上下文建模,导致性能不佳和鲁棒性低。
由于代码方面的不足,这里使用一篇由AI生成的代码
java代码:
import java.util.HashMap;
import java.util.Map;
public class SimpleRuleBasedMachineTranslation {
// 假设我们有一个简单的英文到法文的单词映射
private static final Map<String, String> wordTranslations = new HashMap<>();
static {
wordTranslations.put("hello", "bonjour");
wordTranslations.put("world", "monde");
wordTranslations.put("goodbye", "au revoir");
// 这里可以添加更多的单词映射
}
// 简单的翻译方法,只处理单词级别的替换
public static String translateSentence(String sentence) {
// 分割句子为单词数组
String[] words = sentence.split(" ");
StringBuilder translatedSentence = new StringBuilder();
for (String word : words) {
// 查找并替换单词,如果找不到则保留原单词
String translation = wordTranslations.getOrDefault(word.toLowerCase(), word);
translatedSentence.append(translation).append(" ");
}
// 移除末尾的空格(如果有的话)
if (translatedSentence.length() > 0 && translatedSentence.charAt(translatedSentence.length() - 1) == ' ') {
translatedSentence.deleteCharAt(translatedSentence.length() - 1);
}
return translatedSentence.toString();
}
public static void main(String[] args) {
String originalSentence = "Hello world goodbye";
String translatedSentence = translateSentence(originalSentence);
System.out.println("Original: " + originalSentence);
System.out.println("Translated: " + translatedSentence);
}
}
2.基于统计的机器翻译
随着计算机性能的提升和大规模平行语料库的可用性增加,统计机器翻译得以发展。它通过分析大量双语文本,自动学习两种语言间的对应关系,进行翻译。在处理多义词和语言变异方面,统计机器翻译表现出色。然而,该方法高度依赖大量训练数据,导致对资源匮乏语言的支持有限。
与基于规则的翻译方法不同,统计机器翻译完全基于数据驱动,通过统计双语语料库中的单词或短语对应关系来实现翻译。在处理翻译任务时,它首先分割源语言句子为多个部分,然后为每个部分寻找目标语言中的对应项进行替换。
统计机器翻译的主流方法包括基于词的翻译和基于短语的翻译,这些方法通常涉及多个处理步骤,如预处理、句子和词对齐、短语抽取、短语特征准备以及语言模型训练等,以确保翻译过程的准确性和效率。
代码:
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
public class SimplePhraseBasedSMT {
// 假设的短语对(源语言到目标语言)
private static final Map<String, List<String>> phrasePairs = new HashMap<>();
static {
// 初始化短语对,实际应用中这些对会从语料库中提取
List<String> translations = new ArrayList<>();
translations.add("bonjour le monde");
phrasePairs.put("hello world", translations);
translations = new ArrayList<>();
translations.add("au revoir");
phrasePairs.put("goodbye", translations);
// 可以添加更多的短语对
}
// 简单的翻译函数,查找并返回匹配的翻译,如果没有找到则返回null
public static List<String> translatePhrase(String sourcePhrase) {
return phrasePairs.getOrDefault(sourcePhrase, null);
}
// 简单的句子翻译函数,将句子分割为短语并翻译(这里只处理简单的空格分割)
public static List<String> translateSentence(String sourceSentence) {
List<String> translatedSentence = new ArrayList<>();
String[] phrases = sourceSentence.split(" ");
for (String phrase : phrases) {
List<String> translations = translatePhrase(phrase);
if (translations != null) {
translatedSentence.addAll(translations);
} else {
// 如果短语没有翻译,可以保留原文或做其他处理
translatedSentence.add(phrase);
}
}
return translatedSentence;
}
public static void main(String[] args) {
String originalSentence = "hello world goodbye";
List<String> translatedSentence = translateSentence(originalSentence);
System.out.println("Original: " + originalSentence);
System.out.println("Translated: " + String.join(" ", translatedSentence));
}
}
3.基于神经网络的机器翻译
神经网络在机器翻译领域的应用历史可追溯至上世纪八九十年代,但当时由于计算资源有限且数据规模较小,其性能未能达到令人满意的程度,导致发展陷入停滞。
然而,近年来随着深度学习技术的飞跃式发展,神经网络机器翻译(NMT)迎来了新的春天。NMT利用深度神经网络模型,特别是长短期记忆网络(LSTM)和Transformer等先进架构,实现了对源语言和目标语言之间复杂映射关系的自动学习,摆脱了传统方法对人工设计特征和规则的依赖。这一转变在翻译质量、处理速度和系统适应性等方面带来了显著提升,使得NMT迅速成为机器翻译领域的主流技术,推动了整个行业的进步与发展。
这里我们简要说一下Transfoemer:Transformer的核心思想是完全基于自注意力机制(self-attention mechanism)来处理输入序列。传统的序列模型如循环神经网络(RNN)在处理长距离依赖时容易面临梯度消失或梯度爆炸的问题,而Transformer通过自注意力机制解决了这一问题。自注意力机制允许模型在处理序列时,能够同时关注到序列中的所有位置,并根据序列内部不同位置的相关性自动学习每个位置的权重。
Task01
首先跑了一下baseline,其实一开始只是跟着教程做,不知道其中的原理,后面知道各个文件的作用。dataset的包中包含着训练集、开发集、测试集的数据。
然后运行程序,不是特别看的懂程序,这里我们按照运行的先后顺序来讲解
1.定义数据集类
2.生成Encoder类、Seq2seq类、Decider类
3.新增术语词典加载部分
4.新增def train
5.可以对模型进行训练
6.在开发集上进行模型评价
7.新增def evaluate_bleu
8.一个主函数,可进行赋值
9.在测试集上进行推理
10.翻译完成