前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AI技术讲座精选:用端到端训练模型进行语法智能纠错

AI技术讲座精选:用端到端训练模型进行语法智能纠错

作者头像
AI科技大本营
发布2018-04-26 10:31:41
1.9K0
发布2018-04-26 10:31:41
举报

现有的拼写检查系统可以识别拼写错误,但无法识别出语法错误,本文的亮点在于使用流行的 seq2seq + attention 模型,在大规模拼写检查数据集上进行训练,用以简单的语法错误识别任务。

对上下文敏感的拼写检查系统(例如 Autocorrect)虽然可以纠正大量的来自于即时消息、电子邮件和短消息中的输入错误,但却对即便是最最简单的语法错误无能为力。举个例子,信息“ I’m going to store ”将不会被自动纠错系统报错,但人们通常更倾向于说“ I’m going to the store ”。

最近自然语言处理(NLP),在深度学习的驱动下取得了一些进展(例如Bahdanau 等人2014年在 Neural Machine Translation 中的工作),受这些进展的启发,我决定训练神经网络来解决这个问题。确切来说,我将从构建序列到序列模型着手,这些模型能够处理书面用语对话样本,并能够生成样本正确的表达形式。

在这篇博客里,我将会描述如何构建这些“深度文本纠错器”系统,并展示一些鼓舞人心的初步结果。

用深度学习来纠正语法错误

这个项目背后的基本思想是我们可以从语法正确的样本入手,引入一些小错误来产生输入输出对,然后生成大的数据集用于执行语法纠正的任务。关于如何构建这些数据集,如何用它们训练模型以及如何预测这些任务等细节问题将在以下内容中描述。

  • 数据集

我从大量以语法正确的书面英语对话为主的语料入手,来创造用于训练深度文本纠错的数据集。这个项目首要考虑的数据集是“康奈尔电影对话库(Cornell Movie-Dialogs Corpus)”,这个对话集包含了超过30万条来自于电影剧本中的台词。这是我能找到的最大相关数据集了。

拿到类似这样的样本后,下一步就是生成输入输出对,用于训练。该过程按以下步骤完成:

  1. 从数据集中摘取一条样本句子。
  2. 给这个句子加入一些噪声,然后设定一个输入序列对应这个句子。
  3. 将输出序列设定为没有加入噪声的句子。

步骤2中的噪声是故意引入的语法错误,也是我们希望模型能够纠正的错误。目前这些噪声限定于以下范围:

  • 从文章中删去("a","an","the")。
  • 从动词缩略语中删去第二部分(如"ve","ll","s","m")。
  • 替换某些单词体为其同音的常用词。(如将"their"替换为"there",将"then"替换为"than")

举个例子,给定以下样本句子:

代码语言:javascript
复制
And who was the enemy?

与之对应生成的输入输出对为:

代码语言:javascript
复制
("And who was enemy?","And who was the enemy?")

引入这些噪声的依据是 CoNLL2014 语法错误纠错分享任务(“ CoNLL 2014 Shared Task on GrammaticalError Correction ”)的统计数字。在这个项目中,每一次噪声都以25%的概率随机施加在可能发生的情况中。

  • 训练

为了扩充训练序列到序列模型时需要的数据集。我对电影对话数据多次应用了上文描述的抽样方法,以获得原对话2-3倍的数据集。通过扩充后的数据集,训练按照“ TensorFlow 的序列到序列模型教学”(“TensorFlow’s sequence-to-sequence tutorial”)中提出的模型。换句话说,我训练包含了LSTM编码器和解码器的序列到序列模型,如同2014年 Bahdanau 等人用注意力模型将编码器和解码器关联起来。

解码

这个项目并非使用基于最大后验概率进行解码,而是利用本问题的独特结构,将所有已解码序列的符号(token)要么存在于输入序列中,要么属于“已纠错”的符号集合中。“已纠错”的符号集合通过训练构建,并且对应于训练集合中至少一个样本,包含所有在目标中而非来源中出现的符号。这样做的理由是训练中遇到的错误主要包含对少数常用词汇(如“the”,“an”,“their”)的误用,而本文提出的模型应当只允许在这一领域中纠正这些错误。

这部分工作是通过对TensorFlow的序列到序列模型进行修改后执行的,是用来解决未登录词(OOV)问题的预处理过程。

有偏解码

为了将解码限制在仅从输入序列或已纠错符号集中选取符号,该项目对模型的逻辑回归先验概率用二值掩码(binary mask)表示,并将掩码输入下一阶段的预测模块。

这个步骤通过构建掩码完成:

代码语言:javascript
复制
mask[i] == 1.0 if i in (input or corrective_tokens) else 0.0 

然后通过以下方式在解码过程使用:

代码语言:javascript
复制
token_probs = tf.softmax(logits)
biased_token_probs = tf.mul(token_probs, mask)
decoded_token = math_ops.argmax(biased_token_probs, 1)

因为该掩码用于结果的softmax变换(其保证了所有的输出为正),我们能够确保只有输入和已纠错的符号能被选出。

注意在训练中没有使用这里的逻辑回归先验概率,因为它只能用来隐藏模型中可能有用的信号。

处理未登录词(out of vocabulary)符号

由于上述的有偏解码出现在该模型使用的删减词汇中,我们仍然会见到未知的符号出现在任意集外词汇符号的模型输出中。解决更为普遍的集外词汇符号问题十分重要,但在这个项目中我们可以再次利用该问题的独特结构,创造一个非常直接的集外词汇符号解决方案。

尤其是,如果我们假设输入序列中的集外词汇符号集合等同于输出序列的集外词汇符号集合,则可以简单地为解码过程中遇到的每个未知的符号分配一个合适的符号。

例如,在下面这个场景中:

代码语言:javascript
复制
Input sequence: "Alex went to store"
Target sequence: "Alex went to the store"
Decoding from model: "UNK went to the store"

根据上述逻辑,UNK将被替换为Alex。

从经验和直觉上讲,这是一个很合理的假设,因为训练这个模型处理的错误都相对简单,绝不会插入或移走某个特殊符号。

实验和结果

以下是使用深度文本纠错器模型和康奈尔电影对话数据集来试验的的一些有趣的和整体的结果。该数据集包含304713条来自于电影对白中的台词。其中243758条用于训练模型,30474条用于验证和测试。对于训练集,对话库中的每一条台词都如之前描述的那样,抽取两个样本。集合都按以下原则选取:不允许有同一部电影的台词同时出现在训练集和测试集中。

下面用于评价的模型是一个序列到序列模型,其编码器和解码器以注意力机制连接,都是2层,512个隐藏单元的 LSTMs。该模型在训练时,词表包含出现在训练集中的2000个常用词词汇(需注意由于我们的集外词汇解决方案,可以用更少的词汇来训练)。该模型使用了与2014年 Bahdanau 等人类似的成组(bucketing)方案,产生了输入输出对容量分别低于10,15,20和40的四个模型。

  • 整体表现

下面是从测试数据集上计算得到的 BLEU(由NLTK计算)和精确度,用于评测训练模型和基准模型。这里使用的基准模型仅仅是一个分辨函数,假设输入端不存在错误。其动机是测试引入训练模型是否有助于提高当前没有语法纠错系统的模型的分数。

振奋人心的是,在所有组别中,本文提出的训练模型在精确度上都战胜了这个基准模型,而在BLEU分数上只有一项未能战胜基准模型。

这告诉我们,平均来看,在针对可能出现错误的书写样本使用深度文字纠错模型能够生成语法更为正确的书写样本。该模型针对性地训练了几种错误,任何倾向于犯类似错误人都可以让用该模型检测他们的信息。

Bucket (seq length)

Baseline BLEU

Model BLEU

Baseline Accuracy

Model Accuracy

Bucket 1 (10)

0.8341

0.8516

0.9083

0.9384

Bucket 2 (15)

0.8850

0.8860

0.8156

0.8491

Bucket 3 (20)

0.8876

0.8880

0.7291

0.7817

Bucket 4 (40)

0.9099

0.9045

0.6073

0.6425

  • 例子

除了模型的整体结果令人振奋,我们还能预见可以将其拓展到超出电影对话数据集的特定语言形式之外,只要用一小段编造的,有语法问题的句子来测试一下就行。下面给了一些例子,你也可以用样本来验证你的例子。

解码丢失成分的句子:

代码语言:javascript
复制
In [31]: decode("Kvothe went to market")
Out[31]: 'Kvothe went to the market'

解码混淆then/than的句子:

代码语言:javascript
复制
In [30]: decode("the Cardinals did better then the Cubs in the offseason")
Out[30]: 'the Cardinals did better than the Cubs in the offseason'

注意除了纠正语法错误外,这个系统还能顺利地处理未登录词符号。

未来的工作

虽然当前的结果很鼓舞人心,但仍有很大的提升空间。阻碍这个项目发展的最大问题是缺少一个大的数据集-康奈尔电影对话数据集的30万样本相对于现代深度学习标准来说还是太少了。不幸的是,我并不知道任何一个公开的(大部分)语法正确的英文数据集。近似的数据集可以是“高质量”在线论坛中的评论,比如黑客新闻或 Reddit 的某个子板块。我之后会去试试。

有了更大的数据集,我还会考虑在训练样本中引入许多不同的错误。目前可用的噪声局限于相当常见的语法错误;如果这个模型能够学会纠正更为细微的错误如主谓一致等,那将是十分有趣的。

在应用前沿,我可以预见,这个系统将会作为“纠错” API 的一部分,应用于多种消息应用的程序界面中。

本文代码:

https://github.com/atpaino/deep-text-correcter

本文 Demo:

http://atpaino.com/dtc.html


相关数据集

https://archive.org/details/stackexchange

http://trec.nist.gov/data/qamain.html

http://opus.lingfil.uu.se/OpenSubtitles2016.php

http://corpus.byu.edu/full-text/wikipedia.asp

https://en.wikipedia.org/wiki/Wikipedia:Database_download#English-language_Wikipedia

http://opus.lingfil.uu.se/

Hacker News 上的评论

Jmiserez:

从互联网收集一个大型的,高质量的数据集可能不是那么容易。HN 、Reddit 以及论坛上的许多内容在语法上是低质量的,而且通常是由母语不是英语的读者写的(比如我自己)。电影中的对话也不像我们写信一样,可能会有语法不正确的句子。或许有一些公共领域(不受限制)的当代文学可以用来替代或者辅助对话。

与这次的项目无关,我对这种针对低质量的评论或者电子邮件进行训练的语言推荐工具是有些担心的。简单的词典和语法检查足以帮助人们在写作时找到正确的词。但是,一个工具如果可以理解我的意图,然后提出重组或者找到相似的句子或词语来传达相同的意思,那么它会是一个真正的杀手级应用程序。

Brandonb:

有趣的观点!我认为这跟在计算机视觉中的降噪自动编码器的想法类似。这篇文章不是在像素级引入高斯噪声或者使用CNN,而是在世界水平上引入语法“噪声”,并且使用LSTM。

我认为一般框架是适用于许多不同领域的。比如,我们在HealthKit数据(步数和心率测量的序列)的基础上训练降噪序列自动编码器,以便在这些身体指标的基础上,预测某人是否可能患有糖尿病,高血压或心律失常。我也看到类似的想法应用于EMR数据(类似于word2vec文本深度表示模型)。值得阅读的是"Semi-Supervised Sequence Learning"(“半监督序列学习”),其中他们使用非去噪序列自编码器作为预训练步骤,并比较两种不同的技术:https://papers.nips.cc/paper/5949-semi-supervised-sequence-learning.pdf

最后,你开始考虑引入不同类型的语法错误,如主语-动词分歧。我认为这是一种很好的思考方式。在极限情况下,你甚至可能有一个神经网络生成越来越难的错误语法,目的是“愚弄”校正神经网络,当你的产生错误的神经网络与校正神经网络相互竞争时,你就可能会产生生成式对抗网络:https://arxiv.org/abs/1701.00160

本文作者 Alex Paino 毕业于密苏里大学,目前在Sift Science研究机器学习领域,专注于建立精准的模型用于协助各种防滥用现象的产品。


编译: AI100

原文地址:http://atpaino.com/2017/01/03/deep-text-correcter.html


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解码
  • 未来的工作
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档