一、概述
近些时间以来,工作内容总围绕着自然语言生成(NLG)方向展开。近些时间,在NLP(自然语言处理)大热的当下,NLG这个方向也渐渐受到关注与发展。其实,自然语言生成(NLG)和自然语言理解(NLU)都是自然语言处理的分支,我们通常所说的自然语言处理主要是关注自然语言理解这块儿,从表面看NLG和NLU是一对逆过程,NLU主要关注点在于以人类语言(自然语言)作为输入,处理后输出机器可读的语义表示;而NLG则是将语义信息以人类可读的自然语言形式进行表达,选择并执行一定的语法和语义规则生成自然语言文本。但实际上,二者的侧重点不同,NLU实际上是使文本的结构和语义逐步清晰的过程,而NLG的研究重点是确定哪些内容是满足用户需要必须生成的,哪些内容是冗余的。【1】虽然侧重点不同,但是二者在NLP这一领域内存在着诸多共同点:1、二者均以语言模型研究为基础;2、二者需要使用语法规则;3、二者都需要解决指代、省略等语用问题等。二者在实际使用中,很多时候相互依赖、相互依存,存在于同一系统的不同阶段,发挥着不同的作用。
就像我们研究NLU(我们期望机器能够理解我们人类的语言)一样,我们也期望机器能像人类一样,能够生成高质量的人类可读的文本(语音)信息,NLG是实现这一目的的关键技术。根据文本的长短,NLG可分为句子生成和篇章生成。比如,在聊天机器人、Image caption中,我们多根据上下文生成句子;而写稿机器人、文案创作等场景中,我们就以篇幅形式的段落文本生成为主要形式。
根据输入信息的不同,NLG又可分为:数据到文本的生成、文本到文本的生成、意义到文本的生成、图像到文本的生成等。如果了解encoder-decoder框架,其实这里也可以这样理解,我们把不同形式的输入编码成某种意义,这样就把不同的输入的编码过程作为上游任务,或者称为语义信息的提取;而后续就作为下游任务,统一为意义到文本的生成。在实际应用中,诸如翻译、摘要等都属于文本到文本的生成,而这一方面的研究又最为突出;图像到文本的生成主要应用于图片描述;数据到文本的生成应用也颇广,比如新闻生成、文案生成等等。每项技术都极具应用价值并充满挑战,近些年在NLP以及AI领域均有相当多的前沿研究,而且部分研究已经应用到工业应用之中。
二、NLG架构及方法
NLG技术在系统的研究及使用中积累了诸多经验,经验证及总结,下面对其架构及方法作一概括。
2.1 NLG系统架构
NLG 系统的主要架构可分为流线型(pipeline)和一体化型(integrated)两种,流线型的NLG系统由几个不同的模块组成,各个模块之间不透明、相互独立,交互仅限于输入输出;而一体化的NLG系统各模块之间是相互作用、共同工作的,更符合人脑的思维过程,但是实现较为困难。所以,在实际应用中较为常用的是流线型NLG系统。
如上图所示,典型的三阶段式的NLG系统被划分为文本规划、句子规划、句法实现3个模块。其中,文本规划决定文本要说什么(what);句法实现决定怎么说(how);句子规划则负责让句子更加连贯。
2.2 NLG方法
虽然NLG已应用于许多实践当中,但目前对NLG的研究进展远不如NLU。所以,在NLG技术发展的历史过程中,主要包括基于模板的NLG和基于深度学习的NLG方法。
1、基于模板的NLG
NLG模板由句子模板和词汇模板组成。句子模板包括若干个含有变量的句子,词汇模板则是句子模板中变量对应的所有可能的值。为方便理解,下面引用文献【1】中的一个例子:
topic->weather
act->query
Content: weather_state
->3 对不起,请[]您需要[]{}的[]。
->2 请[]您需要[]的[|具体内容]。
->1 抱歉,请[]您需要{}{(day)|今天|[when]}{(location)||}的[]。
符号说明:
|:或者
[]:内部元素出现次数>=1
{}:内部元素出现次数<=1
():对话管理模块中的变量
<>:自定义语料中的变量
句子前的数字:该句子的权重,权重越大句子出现的可能性越大。
-> [告诉我|补充|说明|输入]
-> [查询|知道|获取|收到|了解|咨询]
-> [哪里|何处|什么位置|什么地方|什么城市|哪个位置|哪个区域]
-> [天气|哪方面信息|什么信息|哪方面情况|哪方面内容|何种内容]
-> [哪天|什么时间|哪个时辰|什么时候]
实际工作中,基于模板的NLG技术在项目初期使用较多,由于其可控性,对于语言较为严谨的很多领域中使用极为普遍。
2、基于深度学习的NLG
伴随深度学习的热潮,以及机器翻译相关研究的快速发展,基于深度学习的NLG技术也有了较为突出的进展。尤其是encoder-decoder框架的流行,使得该框架下的seq2seq技术也得到了快速发展,尤其是18年末Bert的提出,将NLP研究推上了一个新的高度。基于深度学习的NLG任务也是使用seq2seq体系结构,我们这里主要聊一下data2text这种生成任务,根据输入信息的区别,其过程分为训练阶段和生成阶段。
(1) Training阶段。在训练阶段,encoder和decoder都需要输入信息。encoder端的输入为结构化或者半结构化的数据信息,decoder端的输入为encoder端输入信息所对应的文本信息,也可简单的理解为序列标签信息,直观地可以看出,training阶段是有监督的学习。encoder负责将输入编码成一条语义向量C,然后语义向量C作为decoder的初始状态参与decoder进行解码预估。
(2)Generation阶段。在生成阶段,decoder端不再需要外部输入信息,其网络结构需稍作改造,后一位的输入为前一时间步的输出,也就是构建RNNLM(RNN语言模型)。
基于上述的描述,这里对基于深度学习的data2text生成做一个简要的总结。
- 构建语料数据及预处理阶段主要工作是数据的获取及加工处理。也是最终结果的基础,其中设计到各种技术,如:数据爬虫、数据清洗、数据选择、命名实体识别、依存关系分析、分词、word2vec、槽位设置等等,这里是一个综合性的NLU任务。
- 模型构建阶段目标较为明确,使用较多的为biLSTM+attention结构。在encoder-decoder框架中,decoder更为核心,所以,诸多优化也都在decoder侧进行,如beam search。
- 模型的训练阶段是一个损失函数最优化及模型参数调优的过程,处处问题处处坑,而且对于NLG来说,生成结果不能很直观地反映模型的状态,比如说曾经遇到的两个问题,一个是生成序列中间断性的出现重复字串;另一个是模型后半部分出现重复字串。咋一看两个现象很相似,尤其是在短文本预测时。但是,事实经验总结结果是前一种是欠拟合现象,模型不收敛,需加大训练轮数;而后一种是过拟合现象,可通过dropout优化。
这里只是要对NLG任务做一概括性的总结,更深入的一些东西后续可以继续讨论。对比基于模板和基于深度学习的NLG方法,基于模板的更可控,但是结果较为生硬、死板,而且后期扩展对初期规划依赖较大;而基于深度学习的方法可以更好的生成创意性、个性化、娱乐性等文本,但是效果不可控或者难以控制。看到这里,大家或许就会想到,我们可以权衡这两种方法的优点,结合起来嘛。的确,哈佛大学的牛人已经开始了相关研究并取得了一定的成绩(https://arxiv.org/abs/1808.10122) 【3】,。
三、NLG任务
了解了上一部分的NLG体系结构,下面对NLG相关任务进行探讨。通常,通过将输入数据分解成若干个子问题来解决将输入数据转换成输出文本的NLG问题。通过对多数NLG系统总结,我们可以大致把NLG的任务分为:
(1)确定内容:决定即将构建的文本中应该包含哪些信息;作为生成过程的第一步,NLG系统需要决定哪些信息应该包含在正在构建的文本中,哪些不应该包含在其中。该部分最大的进步应该算是对齐机制的提出,解决了如何自动学习数据和文本之间的对齐关系的问题。
(2)文本结构:确定文本中呈现信息的顺序;在确定了要传递什么消息之后,NLG系统需要决定它们向读者呈现的顺序。
(3)句子聚合:决定在单个句子中呈现哪些信息;并非文本计划中的每一信息都需要用一个单独的句子来表达;通过将多条消息组合成一个句子,使得生成的文本变得更流畅、更具可读性。尽管也有一些情况认为应避免聚合,总的来说,聚合很难定义,也很难实现,我们可以用各种方式解释,比如从冗余消除到语言结构组合。这里对上述语言进行“聚合”一下,就是如何用言简意赅的话语准确表达想要表达的语言信息。
(4)词汇化:找到正确单词或短语来表达信息;即用什么词或短语来表达消息的构建块。通常情况下,上下文约束在这里也扮演着重要的角色,所以这一点在中文NLG任务中尤为突出。
(5)引用表达式生成:选择单词和短语以标识域对象;这种特征表明与词汇化有着密切的相似性,但本质上的区别在于,引用表达式生成是一项“识别任务,系统需要传递足够的信息来区分一个域实体和其他域实体”。这一个task好抽象,白话解释一下,词汇化阶段主要是选用合适的词或短语表达上下文相关的语义信息,而引用表达式生成阶段的任务首先是识别要表达的对象,然后用合适的词或短语表示它。
(6)语言实现:将所有单词和短语组合成格式良好的句子。这项任务涉及到对句子的成分进行排序,以及生成正确的形态形式,通常还需要插入功能词(如助动词和介词)和标点符号等。上部分提到的NLG方法准确的说应该就是这里的语言实现方法。再来个模板表达的例子,
模板:由于受到冷空气影响,${city}${date}将出现${weather}天气。
例子:1、由于受到冷空气影响,北京明后两天将出现降雨天气。
2、由于受到冷空气影响,上海市明天将出现大风降雨天气。
下面引用一段话来总结一下上述几个任务之间的逻辑关系。这些任务可以从“早期”决策过程(向读者传达哪些信息?)到“后期”(在特定句子中使用哪些单词,以及如何将它们按正确的顺序排列?)的决策过程的角度来考虑。在这里,我们通过区分更倾向于数据的选择(例如说什么)和具有越来越语言性的选择(例如,词汇化或实现)来指代“早期”和“后期”任务【3】。
四 NLG结果评价
对于最终生成结果的评价细分为线下评价和线上评价。
线下评价是为了对文本本身的质量作出量化。如何对生成的文本进行评价也是文本生成研究中重要的一环。Gkatzia[5]总结2005年到2014年间的常用的针对文本生成的评价方法,将其分为内在评价和外在评价方法。其中内在评价关注文本的正确性、流畅度和易理解性。常见的内在评价方法又可分为两类:第一种是借鉴翻译、摘要中基于数据的方式,采用BLEU、NIST和ROUGE等方法从数据角度进行自动化评价,通过计算生成文本和训练文本间的相似度来衡量生成质量;第二中是专家模式。通过人工评价,从有用性等对文本进行打分。外在评价则关注生成文本在实际应用中的可用性,这方面我们主要是在前面内在评价方式中设定相应阈值,以获取较好效果的文本,必要时再做人工review。
线上评价则是业务导向,我们的直接指标便是点击率或者APP进入率,根据对这些指标判断是否达到预期点击率的提升或者实际的营销效果。
小结
本文对自然语言生成作了概要性的描述,由于该领域在实际应用中并不成熟,相关研究及实现与自然语言理解方向相差甚远,但是近些时候随着NLP整体发展的进步,以及诸多工业界的现实需求,NLG的相关研究及工程实现也受到了诸多关注。
由于理解及知识的偏差,文中或多或少存在不当之处,欢迎批评指正,也希望能与更多在此方向研究或有实践经验的牛人共同探讨学习。
参考文献
【1】自然语言处理实践:聊天机器人技术原理与应用
【2】Survey of the state of the art in nature language generation——core tasks, applications and evaluation
【3】Learning Neural Templates for Text Generation,Wiseman, Shieber, Rush; EMNLP 2018
【4】万小军,冯岩松,孙薇薇. 文本自动生成研究进展与趋势. CCF 中文信息技术专业委员会
【5】 Gkatzia D, Mahamood S. A Snapshot of NLG Evaluation Practices 2005-2014[C]//Proceedings of ENLG. 2015.
【6】 Reiter E. An architecture for data-to-text systems[C]//Proceedings of the Eleventh European Workshop on Natural Language Generation. Association for Computational Linguistics, 2007: 97-104.