中文文本向量化

更新于 2026年10月10日 版权声明
(一)中文文本向量化

在自然语言处理领域,对文本的编码也就是使文本向量化,将其转化为序列模型,这是进行数据挖掘的基本预处理操作。文本的向量化方法有很多,从最早的基于统计模型的文本向量化方法,到后来的基于机器学习的文本向量化方法,再到目前应用广泛的基于深度学习的文本向量化方法(尤其是基于大规模预训练模型的向量化方法),文本向量化的技术路径按照一条有规律的主线向前推进。本节我们简要梳理文本向量化的技术难点和发展路径,介绍几种非常经典的模型,并介绍文本向量化技术在本书中的应用。

1.基于统计模型的文本向量化

一个非常简单纯粹的想法是使用词袋模型(bag of words)[1]。不同于英文文本,词袋模型首先会进行中文文本的分词,在分词之后,通过统计每个词在文本中出现的次数,将各个文本样本的词与对应的词频放在一起,构建起一个词袋。词袋模型并非一个模型而是一类模型,包括独热编码法、词频统计法、TF-IDF法等。

最原始的文本向量化方法即为独热编码法(one-hot encoding)。独热编码法将所有文本中的单词进行统计,将每个单词转化为1个用0和1表示的向量。例如,在一系列文本中,统计得到N个单词,那么每个单词被向量化后维数为N,且只有1位为1,其余位全部为0,每个单词对应的非0位不同。很显然,独热编码法仅适合处理单个词或短语等极短文本,不适合对长文本进行建模,因为当单词数量过多、文本数量过多时会造成严重的维数灾难,得到的矩阵过于稀疏反而不利于处理。除此之外,全部使用0和1表示单词难以描述不同词汇的重要性。

基于统计模型的TF-IDF算法则很好地改进了这一问题。TF-IDF(term frequency-inverse document frequency)是一种用于文本信息处理的常用方法,其中TF的意思是词频(term frequency),IDF的意思是逆文本频率指数(inverse document frequency),它基于这样一个事实:某个单词在某一篇文章中出现的频次越高,同时在其他文章中出现的频次越低,则这个单词就越可能是该文章的一个关键词。[2]TF-IDF的基本表达式形如:

图示

其中,TF(t,d)是词语t在文档d中出现的频率,IDF(t)是单词t的逆文本频率指数,它可以衡量单词t用于区分这篇文档和其他文档的重要性。IDF的公式如式3.2所示,其中Ntext表示文章总数,Ntext(t)表示含单词t的文章数,分母加1是为了避免分母为0。

图示

IDF的主要思想是:如果包含词条t的文档越少,IDF越大,则说明词条t具有很好的文本类别区分能力。计算出TF和IDF值以后,将它们取乘积即可得到文档中每个词的TF-IDF值,从而得到TF-IDF向量。

TF-IDF的优点是简单快速,而且容易理解。缺点是有时候用词频来衡量文章中的一个词的重要性不够全面,有时候重要的词出现的可能性不高,而且这种计算与独热编码法一样,无法体现位置信息,无法体现词在上下文中的重要性。为了解决这一问题,我们从序列的角度进行思考。

N-Gram模型是一种基于统计语言模型的方法,它从序列的角度对文本进行建模,更充分地考虑词与词之间的关联性与推理。[3]N-Gram将若干个词作为一个窗口(gram)进行滑动,对所有词组合的出现频数进行统计并过滤掉低频次的gram,形成关键窗口列表,其中每一种gram就可以代表向量的一个维度,代表前后词之间的推理规则。很显然,由于词组的组合数比单一词汇可变性更强,N-Gram模型的维数也往往比单一词频统计更高。这一模型遵循马尔可夫性的基本假设,即假定第N个词的出现只与前面N-1个词相关,而与其他任何词都不相关,并且词与词之间是独立事件,可以进行概率累乘。为了使得模型更简洁,我们通常使用二元模型Bi-Gram或者三元模型Tri-Gram进行建模。如果不考虑关联性将每个词视作独立词出现,那么模型则退化为一元模型Di-Gram。

马尔可夫性的基本公式如3.3所示:

图示

那么由这样一个基本假设,我们可以很容易得到三种基本模型的数学表达分别为:

图示

在式3.4中,①为Di-Gram的定义;②为Bi-Gram的定义;③为Tri-Gram的定义。而N-Gram模型用于文本向量化时维数往往更高,因为考虑的是文本中词出现的组合,尽管考虑到了语序关系,但当N-Gram的N增长时,根据统计规律,参数的增长速度越来越快,容易发生词表膨胀问题(尽管基于贝叶斯统计原理,当N超过5时,模型效果会取得明显提升),参数的数量呈几何增长[4],对过于庞大的维数进行处理是非常耗费内存与计算力的,这也是N-Gram模型最大的劣势。

同样基于统计规律考虑语序,共现模型利用共现矩阵对文本进行建模。共现矩阵顾名思义就是共同出现的意思,词文档的共现矩阵主要用于发现主题(topic),用于主题模型,如LSA[5]。我们在后面仍然要使用到共现矩阵的有关理论。局域窗中的word-word共现矩阵可以挖掘语法和语义信息,我们以简单的一个只有三句话的例子为例,“I like deep learning.”“I like NLP.”“I enjoy flying.”考虑词汇间的两两配对(不考虑多词匹配)可以列出如图3-1所示的共现矩阵。

图示

图3-1 共现矩阵示例

矩阵的每一项表示行和列组成的词组在词典中共同出现的次数。相对于二元的Bi-Gram模型,它更具备泛化性,并且参数增长速率是线性增长,较Bi-Gram更缓慢,对计算量的负担更小。但即便如此,这种相对意义上的优化并不代表绝对意义上的参数减少。事实上,存储整个词典的空间消耗非常大,同样会面临稀疏性问题。并且相较于之前的模型,共现矩阵的稳定性稍差一些,每新增一份语料,稳定性就会变化,无法做到保持数据的相对独立性。

可以看到,无论是共现矩阵,还是TF-IDF生成矩阵,都会面临矩阵稀疏的问题。那么为了压缩稀疏矩阵,一个常用的方法就是降维。在自然语言处理领域,SVD(奇异值分解)方法被广泛应用于稀疏矩阵降维,但矩阵越稀疏,SVD的计算时间复杂度与空间复杂度也更高。

将高维稀疏的词向量映射到低维空间进行表示的学习方法是表示学习(representative learning)中一个非常典型的问题。词嵌入(word embedding)方法是将词映射到低维的向量空间中,相类似的词汇被映射到向量空间中相近的位置,此时我们的词向量不再是高维稀疏的,而是低维稠密的[6]。下面提及的分布式表示就是词嵌入的一个典型方法。

2.基于机器学习的文本向量化

为了突破以往关联规则推理的局限,有人发明了文本信息的分布式表示方法:用一个词附近的其他词来表示该词,这是现代统计自然语言处理中较有创见的想法之一。[7]分布式表示先不考虑词在文档中的位置,不考虑其关联,也不考虑语法结构。先确定每个词对应的固定向量维数,不是根据自身的向量表示去推断词,而是根据上下文中的临近词来推断词的本义。它将所有词向量统一到一个空间中,形成一个庞大的语义场来从整体推断局部,每一个词在向量空间中有自己的位置,从而可以根据词向量之间的距离描述词与词之间的关系。

在机器学习方法得到极大发展以后,本吉奥等人基于神经网络这一创造性工具提出了NNLM模型。[8]NNLM模型的思路较为简单,我们认为句子中某个单词的出现与其上文存在很大的相关性,其中N元语言模型即表示这个单词与其前面的N-1个单词有关。即输入是目标单词上文的单词,学习任务是要求准确预测这个目标单词。模型在拟合过程中,优化目标是使得预测概率最大似然化。在NNLM模型中,词嵌入映射矩阵是作为参数而存在的,训练这个语言模型时,词嵌入表示也在不断地被训练。即模型不仅可以根据上文预测后面的单词,还可以得到单词的词嵌入这个副产品。NNLM模型使用稠密向量作为单词的词嵌入表示,解决了简单词嵌入表示,如TF-IDF的向量稀疏等问题。TF-IDF不具备在不同语境下表示不同语义的功能,而NNLM模型可以在相似的语境下预测相似的单词,具备了一定的表示语义的功能。

相比于NNLM模型,word2vec模型被广泛应用于文本向量化处理。word2vec同样是基于神经网络的模型,引入了机器学习因素,它有两类典型的模型,即用一个词语作为输入,来预测它的上下文的Skip-Gram模型,和拿一个词语的上下文作为输入,来预测这个词语本身的CBOW模型。[9]CBOW模型对小型语料比较合适,而Skip-Gram模型则在大型语料中表现得更好。

图3-2是word2vec模型的结构,可以很明显地看到,word2vec是一个单隐层的神经网络。神经网络的输入是稀疏的独热编码形式,而隐层没有激活函数,是线性单元。网络输出维度跟输入维度一样,用的是softmax回归。下面我们分别对CBOW模型和Skip-Gram模型进行解读。

图示

图3-2 word2vec模型结构示意图[10]

图3-3①是CBOW模型结构的示意图。CBOW模型输入的是文本中词汇的独热编码,单词个数为C,词向量空间维数为V,将所有的词向量乘以输入层与隐层间的第一个权重矩阵W后取平均值,得到一个N维向量作为压缩表示的隐层向量。隐层向量乘隐层与输出层之间的第二个权重矩阵W后得到V维空间的词向量分布,每个维度表示一个词。概率最大的index所指示的单词为预测出的中间词(target word),其与true label的one-hot做比较,误差越小越好(根据误差更新权重矩阵计算)。所以,需要定义损失函数(一般为交叉熵代价函数),采用梯度下降算法更新权重。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量就是我们想要的词向量。当权重被全部训练完毕后,任何一个单词的one-hot乘以这个矩阵都将得到自己的词向量。

图3-3②是Skip-Gram模型结构的示意图。Skip-Gram模型与N-Gram模型有共通的地方,它同样会选择一个滑动窗口在文本上进行滑动。但不同于N-Gram模型的是,窗口滑动的过程中Skip-Gram模型会同时考虑上下文,并且使用神经网络将其归约到固定维度上,从而避免了N-Gram导致的参数爆炸问题。窗口在滑动的过程中,窗口中心的词汇会与前后词汇形成配对,作为网络的输入输出。神经网络基于这些训练数据将会输出一个概率分布,代表着基于文本得到的词典中每个词作为output word的可能性。模型的输出概率代表着我们词典中每个词有多大可能性跟input word同时出现。

图示

图3-3 两种典型的word2vec模型结构[11]

图3-4中是一个利用Skip-Gram生成训练数据的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。(https://www.daowen.com)

图示

图3-4 Skip-Gram生成训练数据示例[12]

word2vec的思路与自编码器(auto-encoder)的思路比较相似,都是先基于训练数据构建一个神经网络。当这个网络训练好以后,我们并不会利用这个训练好的网络处理新任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵——后面我们将会看到这些权重在word2vec中实际上就是我们试图去学习的词向量。

Word2vec探索的是局部的语义信息,而针对全局语义信息的一个典型方法则是基于奇异值分解的LSA算法。潜在语义分析(latent semantic analysis,LSA)是一种常用的简单的主题模型,基于SVD的方法得到文本主题。这种基于稀疏矩阵的SVD虽然能够从全局角度分析语义,但计算量较大,且无法体现语序的先后关系。

融合了全局分析与局部分析的优点的glove方法也常常被用于文本的向量化,是一种基于全局词频统计的回归算法。[13]它不是基于神经网络的,而是基于最小二乘原理的回归方法。glove方法需要先构建语料库的词共现矩阵,随后基于这样一个优化过程训练得到模型。优化的目标函数形式如公式3.5所示。

图示

global vector融合了LSA的全局统计信息和local context window的优势。融入全局的先验统计信息即可以加快模型的训练速度,又可以控制词的相对权重。

上面提及的都是词汇级别(word level)的文本向量化方法,若对语句级别(sentence level)甚至文档级别(document level)进行文本向量化表示,则需要对模型做进一步改进与扩展。由此,doc2vec应运而生。

在word2vec崭露头角的时候,Google工程师Quoc Le和Tomoas Mikolov在word2vec的基础上进行拓展,提出了doc2vec的技术。[14]doc2vec技术存在两种模型——Distributed Memory(DM)和分布式词袋(DBOW),分别对应着word2vec技术里的CBOW模型和Skip-gram模型。

由于doc2vec完全是从word2vec技术拓展来的,DM模型与CBOW模型相对应,故可根据上下文词向量和段向量预测目标词的概率分布;DBOW模型与Skip-Gram模型相对应,可只输入段向量,预测从段落中随机抽取的词组概率分布。总体而言,doc2vec是word2vec的升级版,doc2vec不仅提取了文本的语义信息,而且提取了文本的语序信息。在一般的文本处理任务中,doc2vec会将词向量和段向量相结合使用,以期获得更好的效果。

3.基于深度学习的文本向量化

随着深度学习技术的发展,动态的词嵌入方法,尤其是基于大规模预训练模型的文本向量化方法发展得如火如荼。首先要介绍的是ELMo(embedding from language models),ELMo首先通过学习来获得文本对应的词嵌入表示,利用双层双向LSTM网络对词的上文语义和下文语义进行建模,充分考虑上下文语境关系。[15]它的优化目标不局限于某一个方向(上文或者下文),而是二者对数似然之和,如式3.6所示:

图示

其中参数图示对应前向双层LSTM,参数图示对应后向双层LSTM,输入的分别是单词的上文和下文。将一个句子输入训练好的网络中,最终将得到每个单词三个不同的嵌入表示:双向LSTM中的两层词嵌入表示以及单词的词嵌入表示。其中双向LSTM中的两层词嵌入表示分别编码了单词的句法信息和语义信息。Jozefowicz等人设计了预训练好的ELMo模型,其映射层使用了CNN-BIG-LSTM[16],并在该模型基础上增加了L=2的BiLSTM模型。与之前的静态词嵌入表示方法相比,ELMo可以依据不同的上下文来动态地生成相关的词嵌入表示,但ELMo训练时间长,采取双向拼接的融合特征略显复杂。

ELMo模型架构如图3-5所示,可以看到它由两层方向相反的LSTM组成。而图3-6描述了ELMo如何被应用于整个文本向量化的整体架构,对于不同级别(词汇级、字符级等)有着不同的效果。

图示

图3-5 ELMo的框架结构[17]

图示

图3-6 ELMo预训练结构[18]

由Open AI提出的GPT(gererate pre-training model)系列架构采用了transformer[19]而非LSTM作为基本架构,相比RNN等时序类模型有更多的优点,如更快的并行处理速度,以及能学习更长距离的依赖关系等。[20]GPT架构主要分为两个部分:无监督的pre-training模型和有监督的fine-tuning模型,其中在预训练模型部分,使用transformer的decoder结构,并对transformer decoder进行了一些改动,原本的decoder包含了两个multi-head attention结构,GPT只保留了mask multi-head attention。这一选择无疑比RNN更明智。

GPT的结构图如图3-7所示。GPT通过在不同的未标注文本语料库上生成预训练的语言模型,然后对每个特定任务进行有区别的微调来实现多种自然语言任务,并且对不同的任务模型调整并不大,比较方便简洁。它的输入是任务驱动式的,能够根据不同的任务进行调整,在几项具体任务中的效果也比ELMo有所提升,但GPT的不足之处在于,其采取的语言模型是单向的,未考虑下文。

图示

图3-7 transformer在GPT中的应用[21]

2018年底微软提出的BERT(bidirectional encoder representation from transformers)相较于ELMo和GPT-2取得了更好的表现,目前也是应用较广泛的文本向量化方法之一,因为在BERT中,特征提取器也是使用的transformer,且BERT模型是真正具有在双向上深度融合特征的语言模型。[22]

BERT架构如图3-8所示,与GPT、ELMo模型的区别如图3-9所示。BERT与GPT的区别就在于BERT采用的是transformer encoder,也就是说每个时刻的attention计算都能够得到全部时刻的输入,而open AI GPT采用了transformer decoder,每个时刻的attention计算只能依赖于该时刻前的所有时刻的输入,因为open AI GPT采用了单向语言模型。

图示

图3-8 BERT架构[23]

图示

图3-9 BERT、GPT和ELMo的对比[24]

BERT预处理进行下游任务的输入是三个嵌入表示叠加(见图3-10),token embedding表示当前词的embedding,segment embedding表示当前词所在句子的index embedding,position embedding表示当前词所在位置的index embedding。

图示

图3-10 BERT的嵌入表示形式[25]

在BERT出现之前的词嵌入技术,如word2vec中,一个句子的嵌入表示,往往是简单地对使用word2vec得到的各个单词的词嵌入表示进行平均或加和得到的,这就导致无法得到包含深层语义和语序信息的词嵌入表示,实际任务中效果也较差。而通过BERT得到的词嵌入表示融入了更多的语法、词法以及语义信息,而且动态的改变词嵌入也能够让单词在不同语境下具有不同的词嵌入表示。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)