自然语言处理:基于预训练模型的方法
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 基本问题

上面介绍了两大类常见的自然语言处理任务,虽然这些任务从表面上看各不相同,但是都可以归为文本分类问题、结构预测问题或序列到序列问题,下面就这三个基本问题分别加以介绍。

2.3.1 文本分类问题

文本分类(Text Classification或Text Categorization)是最简单也是最基础的自然语言处理问题。即针对一段文本输入,输出该文本所属的类别,其中,类别是事先定义好的一个封闭的集合。文本分类具有众多的应用场景,如垃圾邮件过滤(将邮件分为垃圾和非垃圾两类)、新闻分类(将新闻分为政治、经济和体育等类别)等。2.2.3节介绍的文本情感分类任务就是典型的文本分类问题,类别既可以是褒、贬两类,也可以是喜、怒、哀和惧等多类。

在使用机器学习,尤其是深度学习方法解决文本分类问题时,首先,需要使用2.1节介绍的文本表示技术,将输入的文本转化为特征向量;然后,使用第4章将要介绍的机器学习模型(也叫分类器),将输入的特征向量映射为一个具体的类别。

除了直接使用文本分类技术解决实际问题,还有很多自然语言处理问题可以转换为文本分类问题,如文本匹配(Text Matching),即判断两段输入文本之间的匹配关系,包括复述关系(Paraphrasing:判断两个表述不同的文本语义是否相同)、蕴含关系(Entailment:根据一个前提文本,推断与假设文本之间的蕴含或矛盾关系)等。一种转换的方法是将两段文本直接拼接起来,然后按复述或非复述、蕴含或矛盾等关系分类。

2.3.2 结构预测问题

与文本分类问题不同,在结构预测问题中,输出类别之间具有较强的相互关联性。例如,在词性标注任务中,一句话中不同词的词性之间往往相互影响,如副词之后往往出现动词或形容词,形容词之后往往跟着名词等。结构预测任务通常是自然语言处理独有的。下面介绍三种典型的结构预测问题——序列标注、序列分割和图结构生成。

1.序列标注

所谓序列标注(Sequence Labeling),指的是为输入文本序列中的每个词标注相应的标签,如词性标注是为每个词标注一个词性标签,包括名词、动词和形容词等。其中,输入词和输出标签数目相同且一一对应。表2-7展示了一个序列标注(词性标注)示例。序列标注问题可以简单地看成多个独立的文本分类问题,即针对每个词提取特征,然后进行标签分类,并不考虑输出标签之间的关系。条件随机场(Conditional Random Field,CRF)模型是一种被广泛应用的序列标注模型,其不但考虑了每个词属于某一标签的概率(发射概率),还考虑了标签之间的相互关系(转移概率)。4.3节将要介绍的循环神经网络模型也隐含地建模了标签之间的相互关系,为了进一步提高准确率,也可以在循环神经网络之上再使用条件随机场模型。

表2-7 序列标注(词性标注)示例

2.序列分割

除了序列标注问题,还有很多自然语言处理问题可以被建模为序列分割问题,如分词问题,就是将字符序列切分成若干连续的子序列;命名实体识别问题,也是在文本序列中切分出子序列,并为每个子序列赋予一个实体的类别,如人名、地名和机构名等。可以使用专门的序列分割模型对这些问题进行建模,不过为了简化,往往将它们转换为序列标注任务统一加以解决。如命名实体识别,序列标注的输出标签可以为一个实体的开始(B-XXX)、中间(I-XXX)或者非实体(O)等,其中B代表开始(Begin)、I代表中间(Inside),O代表其他(Other),XXX代表实体的类型,如人名(PER)、地名(LOC)和机构名(ORG)等。分词问题也可以转换为序列标注问题,即为每个字符标注一个标签,指明该字符是一个词的开始(B)或者中间(I)等。表2-8展示了使用序列标注方法解决序列分割(分词和命名实体识别)问题示例。其中,对于输入:“我爱北京天安门。”分词输出结果是:“我爱北京天安门。”命名实体识别输出结果是:“北京天安门=LOC”。

3.图结构生成

图结构生成也是自然语言处理特有的一类结构预测问题,顾名思义,其输入是自然语言,输出结果是一个以图表示的结构。图中的节点既可以来自原始输入,也可以是新生成的;边连接了两个节点,并可以赋予相应的类型。2.2.2节介绍的句法分析就是典型的图结构生成问题,其中,在依存分析中,节点皆为原始输入的词,而边则连接了有句法关系的两个词,然后在其上标注句法关系类别。此外,还可以对输出的图结构进行一定的约束,如需要为树结构(一种特殊的图结构,要求每个节点有且只有一个父节点)等。在短语结构句法分析中,除了原始输入词作为终结节点,还需要新生成词性以及短语类型节点作为非终结节点,然后,使用边将这些节点相连,并最终形成树结构。不过,树结构也不是必要的限制,如在2.2.2节介绍的语义依存图分析中,结果就不必是一棵树,而可以是更灵活的图结构。

表2-8 使用序列标注方法解决序列分割(分词和命名实体识别)问题示例

图结构生成算法主要包括两大类:基于图的算法和基于转移的算法。

基于图(Graph-based)的算法首先为图中任意两个节点(输入的词)构成的边赋予一定的分数,算法的目标是求解出一个满足约束的分数最大的子图,其中,子图的分数可以简单看作所有边的分数和,如果要求输出结果满足树结构的约束,则需要使用最大生成树(Maximum Spanning Tree,MST)算法进行解码。除了解码算法,基于图的算法还需要解决如何为边打分以及参数如何优化等问题,本书不进行详细的阐述,感兴趣的读者可以查阅相关参考资料。

基于转移(Transition-based)的算法将图结构的构建过程转化为一个状态转移序列,通过转移动作,从一个旧的状态转移到新的状态,也就是说转移动作是状态向前前进一步的方式,体现了状态变化的策略,转移动作的选择本质上就是一个分类问题,其分类器的特征从当前的状态中加以提取。

首先,来看如何使用基于转移的算法解决依存句法分析问题。在此,以一种非常简单的标准弧(Arc-standard)转移算法为例,转移状态由一个栈(Stack)和一个队列(Queue)构成,栈中存储的是依存结构子树序列 Sm··· S1S0,队列中存储的是未处理的词Q0Q1··· Qn。在初始转移状态中,栈为空,句子当中的所有词有序地填入队列中;在结束转移状态中,栈中存储着一棵完整的依存结构句法分析树,队列为空。

另外,算法定义了以下三种转移动作,分别为移进(Shift,SH)、左弧归约(Reduce-Left,RL)和右弧归约(Reduce-Right,RR),具体含义如下:

• SH,将队列中的第一个元素移入栈顶,形成一个仅包含一个节点的依存子树;

• RL,将栈顶的两棵依存子树采用一个左弧S1S0进行合并,然后S1下栈;

• RR,将栈顶的两棵依存子树采用一个右弧S1S0进行合并,然后S0下栈。

图2-4展示了面向依存句法分析的标准弧转移算法中的三种动作。除了以上三个动作,还定义了一个特殊的完成动作(Finish,FIN)。根据上述的定义,可以使用表2-9中的动作序列逐步生成图2-2(b)所示的依存结构句法树。弧上的句法关系可以在生成弧的时候(采用RL或RR动作),使用额外的句法关系分类器加以预测。

图2-4 面向依存句法分析的标准弧转移算法中的三种动作

基于转移算法的短语结构句法分析方法过程也类似,只不过栈中存储的是短语结构句法子树序列,队列中同样存储的是未被处理的词。在此不再赘述。

2.3.3 序列到序列问题

除了文本分类和结构预测问题,还有很多自然语言处理问题可以归为序列到序列(Sequence-to-Sequence,Seq2seq)问题。机器翻译问题就是典型的代表,其中,输入为源语言句子,输出为目标语言句子。将其推广到序列到序列问题,输入就是一个由若干词组成的序列,输出则是一个新的序列,其中,输入和输出的序列不要求等长,同时也不要求词表一致。

使用传统的机器学习技术解决序列到序列问题是比较困难的,而基于深度学习模型,可以直接将输入序列表示为一个向量,然后,通过该向量生成输出序列。其中,对输入序列进行表示的过程又叫作编码,相应的模型则被称为编码器(En-coder);生成输出序列的过程又叫作解码,相应的模型则被称为解码器(Decoder)。因此,序列到序列模型也被称为编码器--解码器(Encoder-Decoder)模型。图2-5以机器翻译问题为例,展示了一个编码器--解码器模型的示例。本书将在第4章详细介绍序列到序列模型的具体实现。

除了机器翻译,还有很多自然语言处理问题可以被建模为序列到序列问题,如对话系统中,用户话语可被视为输入序列,机器的回复则可被视为输出序列,甚至文本分类问题也可以被建模为序列到序列问题。首先,使用编码器对输入文本进行表示,然后,解码器只输出一个“词”,即文本所属的类别。结构预测问题也类似,首先,也需要使用编码器对输入文本进行表示,然后,在处理序列标注问题时,使用解码器生成输出标签序列(需要保证输出序列与输入序列长度相同);在处理序列分割问题时,直接输出结果序列;在处理图结构生成问题时,需要将图表示的结果进行序列化,即通过一定的遍历顺序,将图中的节点和边转换为一个序列,然后再执行解码操作。不过,由于输入和输出有较强的对应关系,而序列到序列模型很难保证这种对应关系,所以结构预测问题较少直接使用序列到序列模型加以解决。但是无论如何,由于序列到序列模型具备强大的建模能力,其已成为自然语言处理的大一统框架,越来越多的问题都可以尝试使用该模型加以解决。也就是说,可以将复杂的自然语言处理问题转化为编码、解码两个子问题,然后就可以分别使用独立的模型建模了。

表2-9 基于标准弧转移算法的依存句法树生成动作序列示例

图2-5 编码器--解码器模型示例