嘿嘿今天准备打卡Datawhale夏令营的第二期。根据他们给的Baseline任务进行了一些拓展学习。下面参考Datawhale的任务书和《动手学深度学习》一书以及一些优秀CSDN博客文介绍机器翻译相关知识!
数据预处理
对自然语言文本的数据预处理,通常包括以下几个方面:
数据清洗和规范化
- 数据清洗主要针对文本中存在的特殊符号进行消除:删除HTML标签、特殊字符、非文本内容等,确保文本的纯净性
- 根据需求可以对文本进行分词处理。同时对于过长的文本,可以按照句号划分或者按照段落划分,方便训练,防止训练时被程序截断导致一些关键信息的丢失。
- 数据清洗的时候可以进行统一格式,比如字母全部转换成小写字母,日期时间等转换成统一格式。
NLP任务数据增强
EDA
借鉴了这位大佬的博客
(1) 同义词替换(SR:
Synonyms Replace):不考虑stopwords,在句子中随机抽取n个词,然后从同义词词典中随机抽取同义词,并进行替换。
Eg: “我非常喜欢这部电影” —> “我非常喜欢这个影片”,句子仍具有相同的含义,很有可能具有相同的标签。
(2) 随机插入(RI: Randomly Insert):不考虑stopwords,随机抽取一个词,然后在该词的同义词集合中随机选择一个,插入原句子中的随机位置。该过程可以重复n次。
Eg : “我非常喜欢这部电影” —> “爱我非常喜欢这部影片”。
(3) 随机交换(RS: Randomly Swap):句子中,随机选择两个词,位置交换。该过程可以重复n次。
Eg: “如何评价 2017 知乎看山杯机器学习比赛?” —> “2017 机器学习?如何比赛知乎评价看山杯”。
(4) 随机删除(RD: Randomly Delete):句子中的每个词,以概率p随机删除。
Eg: “如何评价 2017 知乎看山杯机器学习比赛?" —> “如何 2017 看山杯机器学习 ”。
但是这些方法也存在这一定的问题
同义词替换SR有一个小问题,同义词具有非常相似的词向量,而训练模型时这两个句子会被当作几乎相同的句子,但在实际上并没有对数据集进行有效的扩充。
随机插入RI很直观的可以看到原本的训练数据丧失了语义结构和语义顺序,而不考虑停用词的做法使得扩充出来的数据并没有包含太多有价值的信息,同义词的加入并没有侧重句子中的关键词,在数据扩充的多样性上实际会受限较多。
随机交换RS实质上并没有改变原句的词素,对新句式、句型、相似词的泛化能力实质上提升很有限。
随机删除RD不仅有随机插入的关键词没有侧重的缺点,也有随机交换句式句型泛化效果差的问题。随机的方法固然能够照顾到每一个词,但是没有关键词的侧重,若随机删除的词刚好是分类时特征最强的词,那么不仅语义信息可能被改变,标签的正确性也会存在问题。
回译法
我们知道论文常见的"五常”降重法,大概就是这么个思路。通过翻译成别的语言再换回来,就能获得一些新的训练文本。
循环神经网络
循环神经网络的必要性
我们在完成大多数机器学习任务的时候,都会假定数据集是处于一种独立同分布的状态。但是,现实中存在相当一部分数据并不满足这种分布。比如文章是按顺序写的,任意调换词语的顺序就会造成理解上的困难。因此,我们需要一种专门的模型来处理序列问题。于是,人们便设计出了循环神经网络。循环神经⽹络(recurrent neural network, RNN)这种设计可以更好地处理序列信息。循环神经⽹络通过引⼊状态变量存储过去的信息和当前的输⼊,从而可以确定 当前的输出。
序列模型
现实中常见的序列模型是时间序列。相当一部分事件都与时间有关。比如,人们对电影的评分会随着时间的推移而改变。
- 季节性(seasonality)。少有观众喜欢在⼋⽉看圣诞⽼⼈的电影。
- 有时候,电影会由于导演或演员在制作中的不当⾏为变得不受欢迎。
- •锚定(anchoring),基于其他⼈的意⻅。例如,奥斯卡颁奖后,受到关注的电影的评分会上升,尽管它 还是原来那部电影。这种影响将持续⼏个⽉,直到⼈们忘记了这部电影曾经获得的奖项。结果表明,这 种效应会使评分提⾼半个百分点以上
- 享乐适应(hedonic adaption),即⼈类迅速接受并且适应⼀种更好或者更坏的情况作为新的常态。例 如,在看了很多好电影之后,⼈们会强烈期望下部电影会⼀样好或者更好。因此,在许多精彩的电影被 看过之后,即使是⼀部普通的也可能被认为是糟糕的。
文本预处理
词元化
词元可以理解为单词,词元化的过程主要是对文本进行分词处理,当然有些情况也会保留成单个字母。对英文文本来说,词元化很简单,通常只需要按空格分割即可。简单代码如下:
def tokenize(text, token):
if token == "word":
return [line.split() for line in text]
elif token == "char":
return [list(line) for line in text]
else:
print("未知词元类型")
而对于中文文本,我们可以采用jieba库或spacy库帮助我们进行分词处理。
词汇表
词元的类型是字符串,而模型需要的输⼊是数字,因此这种类型不⽅便模型使⽤。现在,让我们构建⼀个字典,通常也叫做词汇表(vocabulary),⽤来将字符串类型的词元映射到从0开始的数字索引中。我们先将训 练集中的所有⽂档合并在⼀起,对它们的唯⼀词元进⾏统计,得到的统计结果称之为语料(corpus)。然后根 据每个唯⼀词元的出现频率,为其分配⼀个数字索引。很少出现的词元通常被移除,这可以降低复杂性。
词汇表就可以理解成字典,我们日常用的字典是用汉字对词语进行解释,但是机器只能理解数字,我们就用数字索引和词语进行匹配,解释给机器,对于机器输出的数字,我们通过查表又能够转换会自然语言。由于词汇表通常不能包含所有词汇,我们需要设置一些特殊标记来表示未知。比如遇到词汇表中没有的词汇,我们统一用编号0来代替编码。
循环神经网络
n元语法模型
我们假设序列满足马尔可夫条件(即能够通过部分之前的数据精确预测当前的值。比如我们能通过第10个字预测第十一个字的概率,那我们认为这个是一个满足一阶马尔可夫的序列,如果需要根据第9,10两个字预测第11个字出现的概率,我们说这是一个二阶马尔可夫)。通常涉及n个变量的概率公式称为n元语法模型。常见的有一元,二元和三元语法模型。
其他网络的细节就放一篇博客 ,讲的很详细,我就不再讲啦!
机器翻译任务
编码器-解码器模型
我们可以把机器翻译理解成这样一个过程:先把输入文本和翻译的目标文本构成两张词汇表,其中相同或相近意思的词汇采用相同的索引。然后编码器把输入文本编码成向量,中间层基于训练的参数对向量进行处理(比如可能需要对语序进行调整,用常用词汇同义替换等)转换成目标语言的向量,最后再用解码器解码产生翻译结果。
给定一个中文句子“我/对/你/感到/满意”,编码器会将这句话编码成一个实数向量(0.2, −1, 6, 5, 0.7, −2),这个向量就是源语言句子的“表示”结果。虽然有些不可思议,但是神经机器翻译模型把这个向量等同于输入序列。向量中的数字并没有实际的意义,然而解码器却能从中提取到源语言句子中所包含的信息。也有研究人员把向量的每一个维度看作是一个“特征”,这样源语言句子就被表示成多个“特征”的联合,而且这些特征可以被自动学习。有了这样的源语言句子的“表示”,解码器可以把这个实数向量作为输入,然后逐词生成目标语言句子“I am satisfied with you”。
翻译质量评价
人工评价。当需要对系统进行准确的评估时,往往采用人工评价。比如,对于机器翻译的一些互联网应用,在系统上线前都会采用人工评价对机器翻译系统性能进行测试。当然,这种方法的时间和人力成本是最高的。
有参考答案的自动评价。由于机器翻译系统研发过程中需要频繁地对系统性能进行评价,这时可以让人标注一些正确的译文,之后把这些译文作为参考答案与机器翻译系统输出的结果进行比对。这种自动评价的结果获取成本低,可以多次重复,而且可以用于对系统结果的快速反馈,指导系统优化的方向。
无参考答案的自动评价。在很多应用场景中,在系统输出译文时,使用者希望提前知道译文的质量,即使这时并没有可比对的参考答案。这样,系统使用者可以根据这个对质量的“估计”结果有选择地使用机器翻译译文。严格意义上说,这并不是一个传统的译文质量评价方法,而是一种对译文置信度和可能性的估计。