本文为台湾大学李宏毅老师视频课程笔记。本课程介绍了 (2020年)NLP 领域常见的 17 种任务。本文只会从输入输出的角度概览多种 NLP 任务,并简介它们的常见做法,并不会细致地介绍每个任务模型的具体细节。
NLP 是一个很广阔的研究领域,有许多种任务。但是如果简单地按照它们的输入输出来看的话,无外乎以下两种模式:
以下我们分别介绍两种模式种的任务。
输入文本,输出类别这一大类又可以分为两类。第一种是输入一段文本(token 序列),然后模型输出一个类别,表示这段文本整体是某种类别。第二种是输入一段文本(token序列),模型对输入的每个 token 进行分类,输出多个类别。
如今,不管是第一种还是第二种,“输入文本,输出类别” 这一大类 NLP 任务,通常是用 BERT 模型及其变体来做。
对于输入文本,输出文本这一大类,最直觉的想法然就是用 seq2seq model 了。
这里有一个需要注意的点是 NLP 中有的 seq2seq 任务(如摘要等)可以在编解码器之间加一个 copy mechnaism,允许输出直接从输入中 copy 一些内容。
之前介绍的都是单输入的情况,但是在很多任务中,也会有需要输入多个文本的情况,这时该怎么做呢?常见的做法也是有两种。
第一种是分别用两个网络来处理两个文本,然后再用一个网络将他们的输出进行融合,这两个网络之前通常也会加一个注意力机制。
另一种更加直接的做法在近年来比较流行。即将两个文本直接输入同一个网络,但是在他们中间加一个特殊的 token (如图中的
),以示分隔。
综上集中分法,可以将 NLP 的任务分为以下 8(+1) 类。接下来,我们将分别介绍表格中的任务。
将输入的文本句子中的每个词语都标注上词性(动词/形容词/名词)。
输入:文本
输出:每个 token 的类别
为什么需要考虑句子中词语的词性呢?考虑下面这个句子,句子中出现了两个 saw,但是它们的词性明显是不一样的,前者是看见,动词;后者是锯子,名词。如果在进行其他下游任务(如翻译等)之前,就能识别出每个单词的词性,作为附加信息输入到下游任务网络,无疑会改善网络的性能。因此,POS 经常用作前处理。
Join saw the saw.
但是,在今天,下游任务模型越来越强大。因此,可能下游任务模型本身就可以自己隐式地进行 POS,作为显式的前处理的 POS 过程可能已经不再需要了。
分词是中文自然语言处理中很重要的一项任务,因为中文单字本身并不是词语,我们需要将单字组成的句子划分为多个词语。
输入:文本
输出:每个 token 的类别
从输入输出的角度来看,分词就是输入一个文本,输出每个 token 的类别。这里的类别通常就是一个简单的二分类,Y 表示当前 token 是一个词语的结尾,N 则表示不是。
与 POS 类似的,分词在以前也经常作为下游任务的预处理过程。但是在下游模型越来越强大的今天,分词预处理也通常不再需要了。
分词还存在一个问题,就是同一个句子可能有多种不同但是都合理的分词方法。
句法分析(Parsing)有两种形式,分别是成分分析(constituency parsing)和依存分析(dependency parsing)。它们在输入输出形式是一致的,都是输入一个句子,输出一个树。
Parsing 的输入输出形式比较特殊,不在我们提到的两种模式之中。
Parsing 与以上二者类似,经常作为前处理的步骤。但在表达能力更强的大模型时代,单独进行 Parsing 作为前处理似乎也没有必要性了。
指代消解是要找出文本中的哪些词汇指的是同一件东西,尤其是代词(如 he,she,it 等)所指代的实体。
举个例子,考虑以下文本:
Paul Allen was born ion January 21, 1953. He attended Lakeside School.
指代消解就是要识别出句中的 ‘Paul Allen’ 和 ‘He’ 指的是同一个人。当然,这是最基础的指代消解,还有更多更复杂的情况就不一一列举。
指代消解的输入输出形式也比较特殊,不在我们提到的两种模式之中。
指代消解也常被用作前处理。
语法错误纠正是指对于输入的含有语法错误的句子,模型输出修改后的正确的句子。
输入:(可能含有语法错误的)文本
输出:(正确的)文本或修改方式
语法错误纠正乍看起来好像任务的形式稍微有点麻烦,因为句子的长短、句子的错误类型、修正的方式都有很多种。但实际上,主流的做法是直接将它作为一个 seq2seq 的模型来训练就好了,输入有错误的句子,输出正确的句子。
当然,模型也可以输出对应的修改方式。只要设定一些类别,比如将某个词删除/替换,或者在其前后增加某个词,语法错误纠正就成了一个分类的任务。输入一段有语法错误的文本,输出每个 token(单词)对应的类别。
情感分类,是指输入文本,模型输出这段文本情感是正向的还是负向的。
输入:文本
输出:整个文本的类别
是典型的对整个文本进行分类的任务。常用语网络评论的分类。
立场检测,是指给定一个文本和另一个对该文本回复的文本,判断回复文本对原文本是什么态度。
输入:两个文本
输出:态度(立场)类别
常见的态度有 Support、Denying、Querying、Commenting(SDQC)。
例子:
原文本:李宏毅是个型男
回复文本:他只是个死臭酸宅
在这个例子中,回复文本对原文本的态度就是 Denying。
立场检测可以用于 Veracity Prediction。
真实性预测,是指给定一个文本,然后模型来判断这个文本描述的内容是否真实。
输入:文本(和其他相关文本)
输出:整个文本的二分类
当然,只看一个文本本身很多时候并不能对其真实性作出判断。我们通常需要给模型更多的相关信息。
比如下图中,我们要预测一个 post(网络po文)的真实性,我们可以提供给模型该 po 文的回复、与该 po 文相关的百科内容等。这里给的回复信息,就可以用上面的立场检测来判断其对原文的态度是支持还是否定。
自然语言推理,是指给定一个陈述,再给一个假设,然后基于陈述判断这个假设是否成立。
输入:两个文本(一个陈述和一个假设)
输出:分类结果
常见的类别有 contradiction(矛盾)、entailment(蕴含)、nertral(中性)。
在下面的例子中,给定的陈述是 “一个人骑在马上,跳过了一架断掉的飞机”
给出的假设有三个:
现代搜索引擎当然是很复杂的一个系统,但是如果只从 NLP 模型输入输出的角度来说,它基本的能力就是判断两个输入文本的语义是否是相近的。
输入:两个文本
输出:类别(是否相近)
NLP 中的摘要任务分为两种,分别是 Extractive 和 Abstractive。
抽取式摘要比较简单,从原文中选取一些句子作为摘要即可。
输入:文本序列
输出:每个 token(句子) 的类别
抽取式的文本摘要的输入输出形式很简单,输入一篇文章,输出其中每个句子是否要被抽取作为摘要的二分类结果即可。
很明显,抽取式摘要的任务比较简单,但是摘要的质量会也比较差。在中小学做语文摘要作业时老师就警告我们说不要照搬原文中的句子,而要自己总结。
生成式摘要是指模型不要从原文中照搬句子,而是要看过全文之后用自己的话来对文章进行总结。
输入:(长)文本
输出:(短)文本
这是更难但是更有意义的任务。从输入输出上来看,输入一篇文章(长文本),模型要输出一段摘要(短文章),是典型的 seq2seq 的任务。
需要注意,即使是生成式的摘要,大部分关键词也是来自原文文本的。因此,使得模型能够直接从输入文本中 copy 一些关键词,是合理的。
机器翻译已经是我们日常生活中非常常见的应用了。除了文字到文字的翻译,可能还有语音到文字的翻译,甚至是语音到语音的翻译。这是因为,很多语言是没有文字的。
输入:文本/声音序列(语言A)
输出:文本/声音序列(语言B)
从输入输出的形式上来看,机器翻译也是 seq2seq 的模型。
我们知道,传统的机器翻译的训练,需要两种或多种语言之间含义相同的成对的语句。这是有监督的学习。这样如果想做 N N N 种多语言的相互翻译,需要去标注 N 2 N^2 N2 这样的数据,但是世界上语言这么多,这实在是费时费力。那么,无监督的机器翻译是否是可能的呢?即只给定多种语言的大量语料,但是没有他们之间对应相同语义的成对标注,能否做这种无监督训练呢?实际上,已经有一些工作在做无监督机器翻译训练的研究了。这里也不展开讲了。
问答,是指给定一个问题和一些相关的资料,模型需要对问题做出回答。
输入:多个文本(一个问题和多个相关资料)
输出:一个文本(答案)
在前深度学习时代,人们会构建很复杂的 QA 系统,其中多个模块互相配合,最终完成 QA 的任务。
而在深度学习时代,可以用一个模型端到端地完成 QA 的任务,输入问题和相关资料,输出答案。也可以看做是一个 seq2seq 的任务。
当然,目前的 QA 任务大部分还是抽取式的,即问题的答案就在资料之中,因此,通常 QA 模型也需要允许 copy。
聊天机器人,是无目的地与用户闲聊(尬聊)。
输入:多个文本(当前聊天内容、之前聊天内容、其他相关资料)
输出:文本(聊天内容)
聊天机器人可以与人类进行对话闲聊。它需要根据当前对话和过往对话内容,再结合一些相关的资料(如知识库等),输出合理的对话内容。
从输入输出的形式上来看,聊天机器人也开始一个 seq2seq 的模型。
与聊天机器人闲聊不同,任务导向的对话系统并不是无目的地进行对话,而是要根据既定的任务(比如聊天获取客人的需求信息)进行对话。
输入:多个文本(当前聊天内容、之前聊天内容)
输出:文本(聊天内容)
从输入输出的形式上来看,任务导向的对话系统与聊天机器人类似。
虽然输入输出的形式看起来很简单,但是目前实际的任务导向的对话系统往往都是分为多个模块来进行的。比如下图中的:
任务导向的问答系统的整个流程的模块框图如下所示:
我们知道图(graph)由节点和边组成。知识图谱也是一种图,它的节点是实体(entity,可以是人名、地名、组织名等),而它的边则是实体之间的关系。下图就是一张知识图谱。
知识图谱相关的任务主要有两类:
在这里,我们将整个构建知识图谱的过程(过度)简化为两步:一是抽取实体,而是抽取关系。
抽取实体,我们的任务是命名实体识别(NER),就是要抽取出句子中的 ”命名实体“。任务的形式与 POS tagging、slot filling 类似。
输入:文本
输出:文本中每个 token(单词)的类别(实体)
至于什么是命名实体,并没有通用的定义,是取决于具体的应用。它通常命名实体包括人名、地名、组织名等。但实际上,在某个任务中,我们所关心的东西,才是我们要抽取的命名实体。比如我们想要通过让模型阅读大量医学文献,来判断什么药物能够治疗新冠肺炎,那么这里的药物名,就是我们的命名实体。
NER 任务看似简单,实际上还是有不少问题。比如同一个实体可能有不同的叫法,而同一个单词又可能代表了不同的实体。这就要考虑到 entity link 和 entity resolution,这里就不展开。
抽取关系,实际上也是有一定难度的任务。但是从输入输出的角度来看,就是一个分类问题。
输入:多个文本、两个命名实体
输出:类别(两个命名实体之间的关系)
在以前,对于上面这么多 NLP 的任务,都是对每一个任务,专门构建一个模型来处理。近年来,为了评估语言模型在多个 NLP 任务上的通用语言理解能力,出现了一些集成多个任务的 benchmark,如
这就存在一个问题,不同的 NLP 任务,输入输出形式并不完全一致,怎么能用一个模型来处理呢?实际上,所有的 NLP 的任务都可以当做 QA 的任务来处理。比如如果我们想做摘要任务,就给模型一段文本,然后问题是 ”这段文本的摘要是什么?“,模型会输出一段摘要作为答案;如果我们想做翻译任务,问题就是 ”这段中文的英文翻译是什么?“;如果我们想做情绪识别任务,问题就是 ”这段文本的情感是正向的还是负向的“。
在本文中,我们跟随李老师一起概览了常见的 NLP 任务的输入输出形式,并将他们划分为输入文本输出类别和输入文本输出文本两大类。并且了解到,如果想做通用的 NLP 任务,只要将模型训练为 QA 任务的形式,然后给定关于特定任务的问题就可以了。