Datawhale AI夏令营 Task01笔记

avatar
作者
筋斗云
阅读量:0

此篇博客分为两部分,第一部分是对机器翻译的了解,第二部分则是对第一个打卡的解析。

机器翻译

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.翻译完成

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!