文章目录
- 1 Introduction
- 2 Part-of-Speech(POS) Tagging
- 3 Word Segmentation
- 4 Parsing
- 5 Coreference Resolution
- 6 Summarization
- 7 Machine Translation
- 8 Grammar Error Correction
- 9 Sentiment classification
- 10 Stance Detection
- 11 Natural Language Inference(NLI)
- 12 Search Engine
- 13 Question Answering(QA)
- 14 Dialogue
- 14.1 Chatting
- 14.2 Task-oriented
- 15 Knowledge Extraction
- 15.1 Name Entity Recognition (NER)
- 15.2 Relation Extraction
- 16 Benchmarks
本文为李弘毅老师【Overview of NLP Tasks】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
上篇 - 6 Vocoder
下篇 - 7-2 BERT and its family - Introduction and Fine-tune
总目录
1 Introduction
接下来的课程讲述的内容就基本和语音无关了,都是讲本文方面的东西了,这也是被大家称作NLP(Natural Language Processing)的部分。讲的泛一点,接下来的任务都可以概括为“输入文本,输出文本”和“输入文本,输出类别”这两大类。
根据输入和输出序列不同的对应关系,又可以细分为下表所示的这些类别。当然,这么一看,如果没有事先了解的话,根本不知道是在说啥,不急,接下来会一一介绍。因为这篇是Overview,所以只会讲个大概,不会细讲。
2 Part-of-Speech(POS) Tagging
首先来介绍以下POS Tagging,顾名思义就是给句子中的每个word做词性的判断,是动词,还是形容词,还是名词之类的等等。
为什么要搞这个东西?这个其实一般会作为其他NLP任务的上游。比如,今天有一个句子输进来了,叫做"John saw the saw”。这个句子里有两个一模一样的"saw",对下游的模型来说,也许"saw"就是"saw",它会把这两个"saw"当作一个"saw"。但是,学过英文的都知道,这里的前一个"saw"是动词"see"的过去式,后一个"saw"是一个名词,表示锯子。这个时候,如果在直接输入下游模型之前,有一个POS Tagging模型告诉下游模型,等一等,这两个“saw”的词性是不一样的,一个是动词,一个是名词,是两个完全不同的东西。这样一来,下游模型就懂了。
POS Tagging的前处理并不是必要的,因为现在一些比较厉害的模型,比如Bert,可能在训练的时候,就自己已经学到这个东西了。
POS Tagging的输入就是文本序列,输出就是序列中每个token对应的词性类别。
3 Word Segmentation
Word Segmentation就是分词,也是一个前处理。在英文当中,我们有空格可以作为分词的依据,但是在中文当中,我们就不知道怎么样的算作一个词,或者说怎么的叫做一个token。这个时候,就需要有一个分词的前处理。分词模型会输出每个文字对应的是否一个词的结尾。
Word Segmentation的输入是文本序列,输出是每个文字对应的类别(是否是词的结尾)。
这个技术在如今也并不是必须的,厉害的模型也是可以自己学到这个的。
4 Parsing
Parsing又分为Constituency Parsing和Dependency Parsing,也是一种前处理。它有点特殊,它并不像之前讲的那样是“输入文本,输出文本”或“输入文本,输出类别”这两大类中的一种。它输入的是文本,输出的是一个树状结构。这种在接下来的课程中会单独拿出来讨论。
5 Coreference Resolution
Coreference Resolution的中文叫做指代消解。不管是中文还是英文,都是比较少听到的词汇,如果没学过的话,就不知道在说什么东西。它也是前处理的一种,其目的是,找出一个段落中,属于同一个东西的短语或者词汇。
比如,下面这段话中,指代消解需要知道下文中浅蓝色部分的"Paul Allen",“He”,"he"和“Paul”都是指的同一个东西。它也需要知道黄色部分的"Lakeside School"和"their high school, Lakeside"是同一个东西。甚至,它需要知道,浅粉色部分的"Paul and Bill"和两个"their"是同一个东西。
这个也不在之前讲的两种情况当中,会单独拿出来讲。
6 Summarization
Summarization就是摘要。这个任务是希望输入一篇文章,然后输出一段这段文章的摘要。摘要有两种做法,一种叫做Extractive summarization,另一种叫做Abstractive summarization。
Extractive summarization就是像我们小学的时候做摘要一样,从原文中抄几句话下来,就是摘要了。输入是一篇文章,模型要做的事情就是,输出文章中的每个句子是不是摘要。这是很久以前的一种做法了,那个时候认为模型只能做到这样,所以就这么做了。当然,大家心里都清楚,这怎么可能生成好的摘要。
简而言之,Extractive summarization就是之前说的输入文本序列,输出每个token类别的模型,这里的token就是句子。
Abstractive summarization则是要高杰一些,有点像初高中考试时的概括全文主要内容的意思,要我们动脑子去自己组织句子了。不过,有一些成分还是会从原文中摘下来,只不过不适整句整句地抄了。这里抄一些内容是被鼓励的,Pointer Network就是干这个的。
简而言之,Extractive summarization就是之前说的输入文本序列,输出摘要序列的模型。
7 Machine Translation
Machine Translation(机器翻译)是一个典型的seq2seq的模型,这里值得一提的就是,Machine Translation不光光是文本转文本这样,它也可以语音转文本,甚至语音转语音。为什么要搞这个?因为世界上其实有很多语言是连文字都没有的。
另一点值得一提的就是,无监督的机器翻译是目前一个主要的研究方向。因为世界上的语言太多了,我们很难收集到成对的翻译资料。如果我们可以让模型只看英文学一会,再接着只看中文学一会儿,然后模型自己就会自己找到对应关系,把英文转成中文了,那就太好了。
8 Grammar Error Correction
Grammar Error Correction也是一个seq2seq的模型,它就是输入一个错误语法的句子,输出一个正确语法的句子的模型。我们可以很简单地,就拿一些正确与错误配对的数据,硬train一发。但是这样做,模型的任务是很难的。其实我们完全可以给模型一个更简单的任务。比如下图中的右半边有两个例子,我们可以看出,如果句子不是面目全非的那种,我们只需要把错误的单词替换掉,或者在某个单词后面加一个单词即可,这样模型就可以变成去给每个单词做分类,分为“正确”,“替换”,“追加”这三类,然后再去修改。
9 Sentiment classification
情感分类是典型的序列分类任务,它要做的事情就是评价一段话是好评还是差评,常常被用来分析用户的评论。输入是一段文本序列,输出是一个类别。
10 Stance Detection
Stance Detection就是立场检测,它要做的事情就是检测两个句子的立场是否是相同的。比如下面有人发了“李弘毅是个型男”这样一条推文,如果回复中有人说“他只是个死丑酸宅”的话,那么这两句话的立场就不一样了。立场可以分为四种,分别是“Support”,“Denying”,"Querying"以及“Commenting”,简称为(SDQC)。
这个技术常被用在Veracity Prediction(真实性预测)当中。比如今天有一条推文,我们不能马上知道这条推文的真实性,但是,如果推文小面的很多回复都是在“Denying”它的,那么这就很有可能是一条假消息。我们在预测时,也可以加入Wikipedia的内容,用来辅助模型判断。
总的来说,都逃不过输入是多个文本序列,输出是一个类别。
11 Natural Language Inference(NLI)
NLI就是自然语言推理,它要做的一件事情就是,给一个前提,再给一个假设,模型要判断在这个前提下,输入的假设是否成立。这看似是一个很难的问题,但是从一个宏观的角度来说,就是给模型输入一个前提和一个假设,然后模型做一个分类,判断是"矛盾",“蕴涵"还是"中立”。
12 Search Engine
搜索引擎现在也慢慢把深度学习的技术融入进去了。之前的搜索引擎都是基于的关键词匹配,对于英文中一词多义的情况就处理的不是很好。但有了深度学习模型之后,就可以了解到语义了。从宏观上来讲,也就是输入搜索的句子和文章,输出句子和文章的相似度,然后按相似度排序。
13 Question Answering(QA)
QA在没有深度学习之前就有了,比较有名了就是IBM的Watson,它们都是基于一些传统的机器学习模型去做的。Waston在做QA时的步骤是,先对输入的问题进行前处理,把问题分到一个很小的类别当中,然后根据类别和问题从数据库中去找备选答案,找到备选答案之后,对答案进行相关性的评分,最后把这些备选答案合并和排序,得到最终答案。整个过程是相当复杂的。
但有了深度学习之后,我们要做的其实就是输入问题和知识库,然后输出一个答案。这里的知识库是我们把问题输入搜索引擎之后得到的,就像程序员编程的时候一样。模型会过滤调一些无关的内容,然后整合得到最终的答案。不过,这个其实在今天还是有很多路要走的一个问题,并没有事先到这么智能。
今天我们能做的,也许就只能是输入一个问题和一篇文档,答案是在文档中可以找到的,最后输出的是答案在这个文档中的位置。这么一看,一下子可以看出我们距离QA的设想还有多远的路要走。
14 Dialogue
对话可以分为聊天型和任务导向型的。
14.1 Chatting
聊天机器人很善于尬聊,李老师在课堂上展示了以下他和cleverbot的聊天纪录,可以看出,聊天机器人还是可以知道之前聊了些什么的。聊天的模型就是把当前说的话和历史聊天纪录一起丢给模型,然后模型会吐出一个回复。我们希望模型可能还要有一些个性,针对不同的人,说话时不一样的;有一些同理心,可以安慰安慰人;有知识,可以回答我们的一些疑惑。
14.2 Task-oriented
任务导向型的对话,其实就是我们日常生活中越来越普遍的服务型聊天机器人。我们会限制机器人回复的内容,这个回复的内容统称为Action。比如如果时酒店的订房机器人,它的Action可能就是"问好",“询问入住日”,“询问退房日”等等。我们会把历史的聊天纪录喂给模型,然后这个模型会输出对应的Action应该是哪个。得到Action之后,还会把Action丢给NLG模型,让它生成对应的回答。如果时比较简单的场景,我们完全可以用规则写死,但是场景复杂的话,我们是希望用深度模型来解决这个问题的。
这里用来输出Action的Model,往往用到的是Policy & State Tracker。State就是一个来记录当前状态的东西,比如下图中的订房示例的话,我们会有一些信息要模型去填出来,模型会根据当前的聊天进度来更新这个state的表格,然后Policy的模型会根据当前的state来决定接下来的action是什么。
输入State Tracker的内容往往要经过Natural language understanding(NLU)。NLU要做的有意图分类和填槽。意图分类就是判断当前说的话是提供信息,还是询问之类的。填槽就和我们之前说到的POS Tagging很像了,就是输出输入句子的每个token对应的slot是什么。然后再把这些信息交给State Tracker去处理。
整个任务导向型的对话系统可以用下图来概括。整个过程,可以看到,用了很多模型,不过在今天,也是有end-to-end去做的可能性。
15 Knowledge Extraction
Knowledge Extraction要做的一件事情就是构建知识图谱(Knowledge Graph)。比如我们今天有一大堆的资料,我们要先从这堆资料当中抽取一些entities,entity可以理解为东西,然后再根据资料给有关联的entities之间画上relation。
当然,这么说其实把整个过程说成Extract Entity和Extract Relation这两步是简化了很多很多的,这个再之后的课程中会细讲。
15.1 Name Entity Recognition (NER)
NER要做的事情就是和POS Tagging和Slot Filling差不多的事情,给一段文本,然后给文本中每个token打标签,比如Harry Potter就是People,Hogwarts就是organizations等等。这里的entity的种类是可以根据我们关心的内容去改变的。
当然,实际情况下,某个同样的东西可能有多个名字,同样的名字也可能指向不同的东西。要解决这个问题就要用到一个叫做entity linking的技术了。这个在之后的课程再讲。
15.2 Relation Extraction
Relation Extraction就是一个分类的问题。我们会事先定义好有哪些relations,然后输入我们两个entities和与这两个entities相关的句子,得到最终的relation。类别中还要有一个叫做"none"的,因为有些entities虽然在同一段句子中出现,但是它们是没有关系的,这个就要看模型的能力了。
16 Benchmarks
为了指导机器到底理解到人类的语言到了怎样的程度,就有了很多的Benchmarks。比较权威知名的有Glue,Super Glue和Decanlp。这里只是提一下,不细讲。