从离散到分布,盘点常见的文本表示方法

自然语言处理(NLP)的一些常见任务有:文本分类、指代消歧、自动摘要、机器翻译、主题识别等。传统的处理方法是基于规则的,现在更倾向于使用机器学习或深度学习的方法解决。那幺如何在计算机中表达一段文本/一个词的意思呢?第一步必然是将这些语言特征转化为量化的表达方式。本篇文章总结一下NLP中常用的文本特征表示方式,并提供实际案例和代码实现,用于解决文本分类问题。

 

1. 离散表示(Discrete Representation)

 

1.1 One-Hot,独热表示法

 

NLP 中最常用、最传统的词特征表示方式是采用One-Hot 编码,即每一个词特征都被表示成一个很长的向量,其长度等于词表大小,当前词对应位置为1,其他位置为0。

 

举个简单的例子,如果语料中有以下三段内容:

 

 

建立的词表中词汇依次为:I,like,deep,learning,NLP,enjoy, flying .

 

将第一句中的词汇用 One-Hot 的方法表示:

 

 

但是这种表示方式存在显而易见的问题:

 

1. 不同词之间总是正交的,无法衡量不同词之间的相似关系。

 

2. 只能反映每个词是否出现,但无法突出词之间重要性的区别。

 

1.2 Bag of Words(BOW),词袋表示法

 

在One-Hot 表示法的基础上,对词表中的每一个词在该文本出现的频次进行记录,以表示当前词在该文本的重要程度。例如,对上例中的文本进行 Bag of Words表示:

 

 

但这种表示方式只能表达词在当前文本中的重要程度。很多停用词由于频次较高,权重很大。为了表示词特征在整个语料中重要程度,可以使用TF-IDF对词特征加权。

 

>> TF:词频,即每个词在该文本中的频数,表示该词的重要程度。

 

>> IDF: 倒排文档频率。如果有些词在所有文章中出现的次数(DF,文档频率)都很多,可能是停用词或者常见词,一般重要性不高。IDF是DF的倒数形式,值越大说明该词越重要。

 

TF*IDF提供了一种词重要程度的较合理的度量。

 

对上述文本进行TF-IDF权重表示后的结果:

 

相比较只计算频数的Bag of Words表示,I 和 like 权重被降低了,看起来更合理。但这种方式仍然存在几点问题:

1. 词之间是独立的,无法提供词序信息和上下文信息。

 

2. 数据十分稀疏。

 

1.3 N-Gram,N元组表示法

 

上述提到的Bag of Words表示方法每个词都是独立的,忽略了词序问题。增加N-Gram特征可以获取局部的上下文信息。

 

以 Bigram 为例重新构建词典:I, like, deep, learning, NLP, enjoy, flying, I like, deep learning, like deep,like NLP, I enjoy, enjoy flying

 

注意到词汇表的长度从7增加到13, 使用One-Hot 每个词被表示为13维的向量:

 

使用 Bag of Words 结合TF-IDF Weight,每段文本被表示为13维的向量:

 

当然,这种方法也有它自己的缺陷:

 

1. N-Gram 中随着N的增大增加了更多前后文信息,但是词表的维度也会急剧增大。(通常选取2~3)

 

2. 语料库的增加会导致词表维度不断增大,同时N-Gram词序列也急剧增大。

 

3. 基于词表示:词之间的关系无法度量 。

 

4. 数据十分稀疏。

 

1.4 实例: Bag of Words + SVM 分类实现

 

下面举个简单的例子来展示词袋模型的应用。

 

>> 训练语料:一些公开网站的信息流新闻语料,使用其中的语料标题和网站提供的分类标签。

 

>> 特征表示:使用 jieba 进行分词,并进行 Bag of Words 表示。

 

>> 模型: 使用机器学习模型SVM 实现文本分类。本次实现使用 sklearn中的SGD分类器,设置loss为hinge损失。

 

代码实现:

 

 

2. 分布表示(Distributed Representation)

 

Distributed representation 被称为“Word Representation”或“Word Embedding”, 中文也叫“词向量”或“词嵌入”,1986 年由Hinton 在论文《Learning distributed representations of concepts》中提出。

 

2.1 Co-Occurrence 词向量

 

上文中提到的几种离散表示方式存在诸多问题,如无法提供充分的上下文的信息、词之间的联系无法度量,即使间接的增加n-gram特征也会导致词表维度急剧增大。一种解决办法是使用上下文来表示单词,这是NLP中很现代的一种想法。2005 年 Rohde等在《An Improved Model of Semantic Similarity Based on Lexical Co-Occurrence》中介绍了使用共现矩阵(Co-Occurrence matrix) 结合SVD降维处理的方法,实现了使用上下文表示单词。

 

共现是指不同的词同时出现的文档数。继续使用上面的例子,选择窗宽为1,共现矩阵表示为

 

上述共线矩阵存在维度灾难和数据稀疏的问题。一种想法是高维信息用低维的向量表征,因此需要通过降维的方法来解决,一种常用的方法是奇异值分解(SVD)。

对上例中的共现矩阵进行分解后,各词在二维坐标中的位置:

 

即使是结合降维技术的Co-Occurrence matrix 方法也存在一些问题:

1. 时间复杂度高,尤其对百万级的单词或者文档表现就很糟糕了。

 

2. 新词或新文本难以做到及时更新。

 

3. 相对于 deep learning 模型, 会有不同的学习框架。

 

2.2 Word2Vec 词向量

 

2013年Google 开源了一款直接计算低维词向量的工具 ——Word2Vec,不仅能够在百万级的词典亿级数据集上高效训练,而且能够很好的度量词与词之间的相似性。

 

先回顾一下统计语言模型,2003年Bengio等人用三层的神经网络构建了统计语言模型的框架(Neural Network Language Model,简称NNLM),其基本思想是:

 

1. 假定词表中的每个词都对应一个连续的特征向量。

 

2. 假定一个连续平滑的概率模型,输入一段词向量序列,可以输出这个序列的联合概率。

 

3. 同时学习词向量和概率模型中的参数。

 

模型的网络结构如下图:

NNLM 的问题是:只能处理定长序列,而且训练速度慢。

 

2013 年Mikolov对原始NNLM 进行了一些改造:

 

1. 移除前向反馈神经网络中的非线性hidden layer,直接将中间层的embedding layer 与 softmax layer 连接。

 

2. 输入所有词向量到一个embedding layer 中 。

 

3. 将特征词嵌入上下文环境。这是Word2Vec的第一个模型——CBoW。

 

CBoW的结构图如下:

从数学上看CBoW等价与一个词袋模型的向量乘以一个embedding 矩阵,从而得到一个embedding 向量。实际上CBoW是从周边词到中心词的训练中学习到的词向量,相反如果从中心词到周边词训练得到词向量的方法是word2vec的另一个模型——Skip-Gram。

 

Skip-Gram 的主要思路:预测一个中心词窗口内(窗口长度为c)的周边单词概率。

目标函数:对于一个中心词其目标为最大化其周边任意单词的log概率。

Skip-Gram 本质是计算输入词的输入向量与目标词的输出向量之间的余弦相似度,再经过softmax 归一化。显然对词典里的所有词计算相似度并归一化是一件极其耗时的事情。因此,Mikolov 引入两种优化算法:Herarchical Softmax 和 Negative Sampling。

 

2.3 GloVe 词向量

 

比较以Co-Occurrence为代表的计数方法和word2vec为代表的直接预测方法。

GloVe 思路和Word2Vec很相似,但充分考虑了词的共现情况。而且训练速度更快,在大规模、小规模语料上性能都能表现的很好。其优化目标函数为:

2.4 实例: fastText 分类中训练词向量

 

类似于 Word2Vec 中 CBoW 模型,fastText 的分类模型更灵活的使用了 Hierarchical Softmax,主要体现在:

 

1. Wordvec 最终在输入层得到词向量,输出层对应的 Herarchical Softmax 也会生成一系列的向量,但最终都不会使用。而fastText的输出层对应是分类的label,目的是遍历分类树的所有叶节点,找到概率最大的label。

 

2. Word2Vec的输入是上下文窗口内的词,而fastText 对应的整个文本,包括周边词和 N-Gram的内容。

 

模型: 继续使用上面处理好的test和train数据,训练fastText 的分类模型。

 

或直接使用命令行执行, 词向量结果将保存在文件model.vec中。

对于数据训练样本不充足时,最好使用别人训练好的词向量,但要注意得使用相同内容领域的词向量, 另外要调整dim 参数,使其与 pretrainedVectors 具有相同维数。

3. 小结(Brief Summary)

 

文本特征的向量表示是NLP的基础,也是直接影响模型效果的重要因素。离散的表示结合传统的机器学习模型已经有了较好的效果,但存在缺少上下文信息、数据稀疏等问题。分布式的表达方式不仅能够使用到上下文信息进行表征、建立词与词之间的联系,而且在具体任务中也能很好地利用神经网络进行传播。

 

4. 参考资料(Reference Material)

 

>> A Neural Probabilistic Language Model(Bengio et al., 2003)

 

>> word2vec(Mikolov et al. 2013)

 

>> Improving Word Representations via Global Context and Multiple Word Prototypes(Eric H. Huang et al. 2012)

 

>> Bag of Tricks for Efficient Text Classification (A. Joulin, E. Grave, P. Bojanowski, T. Mikolov, 2016)

 

>> A Primer on Neural Network Models for Natural Language Processing(Yoav Goldberg , 2015)

 

>> 斯坦福大学“深度学习与自然语言处理”课程:CS224d: Deep Learning for Natural Language Processing,word vector部分的slides

 

5. 作者介绍(About The Author;)

 

章洁,机器学习算法工程师,参与自然语言处理,游戏AI 算法等相关项目。

发表评论

电子邮件地址不会被公开。 必填项已用*标注