此篇博客分为两部分,第一部分是对机器翻译的了解,第二部分则是对第一个打卡的解析。
机器翻译
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.翻译完成