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

自然语言处理(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 算法等相关项目。

云脑科技是一家跨越中美两地的人工智能行业平台公司,在深度学习(RNN/CNN)、增强学习、NLP、知识图谱领域均拥有大规模项目成功实践经验。本专栏将持续输出云脑员工的原创技术解读,旨在与AI从业者共同探讨、进步。

工程云脑科技自然语言处理人工智能文本分类SVM模型机器学习
3
相关数据
神经网络技术
Neural Network

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

词袋模型技术
Bag of words

词袋模型(英语:Bag-of-words model)是个在自然语言处理和信息检索(IR)下被简化的表达模型。此模型下,像是句子或是文件这样的文字可以用一个袋子装着这些词的方式表现,这种表现方式不考虑文法以及词的顺序。最近词袋模型也被应用在电脑视觉领域。

分类问题技术
Classification

分类问题是数据挖掘处理的一个重要组成部分,在机器学习领域,分类问题通常被认为属于监督式学习(supervised learning),也就是说,分类问题的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。根据类别的数量还可以进一步将分类问题划分为二元分类(binary classification)和多元分类(multiclass classification)。

fastText技术
fastText

Facebook开发的文本处理工具,是一个用于高效学习单词表示和句子分类的库。

语料库技术
Corpora

语料库一词在语言学上意指大量的文本,通常经过整理,具有既定格式与标记;事实上,语料库英文 "text corpus" 的涵意即为"body of text"。

降维技术
Dimensionality reduction

降维算法是将 p+1 个系数的问题简化为 M+1 个系数的问题,其中 M<p。算法执行包括计算变量的 M 个不同线性组合或投射(projection)。然后这 M 个投射作为预测器通过最小二乘法拟合一个线性回归模型。两个主要的方法是主成分回归(principal component regression)和偏最小二乘法(partial least squares)。

GloVe技术
GloVe

Stanford开发的用于词向量表示的一个库/工具

机器学习技术
Machine Learning

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

语言模型技术
Language models

语言模型经常使用在许多自然语言处理方面的应用,如语音识别,机器翻译,词性标注,句法分析和资讯检索。由于字词与句子都是任意组合的长度,因此在训练过的语言模型中会出现未曾出现的字串(资料稀疏的问题),也使得在语料库中估算字串的机率变得很困难,这也是要使用近似的平滑n元语法(N-gram)模型之原因。

自然语言处理技术
Natural language processing

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

机器翻译技术
Machine translation

机器翻译(MT)是利用机器的力量「自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)」。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

概率模型技术
probabilistic models

概率模型(Statistical Model,也稱為Probabilistic Model)是用来描述不同随机变量之间关系的数学模型,通常情况下刻画了一个或多个随机变量之间的相互非确定性的概率关系。 从数学上讲,该模型通常被表达为 ,其中 是观测集合用来描述可能的观测结果, 是 对应的概率分布函数集合。

目标函数技术
Objective function

目标函数f(x)就是用设计变量来表示的所追求的目标形式,所以目标函数就是设计变量的函数,是一个标量。从工程意义讲,目标函数是系统的性能标准,比如,一个结构的最轻重量、最低造价、最合理形式;一件产品的最短生产时间、最小能量消耗;一个实验的最佳配方等等,建立目标函数的过程就是寻找设计变量与目标的关系的过程,目标函数和设计变量的关系可用曲线、曲面或超曲面表示。

参数技术
parameter

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

奇异值分解技术
Singular Value Decomposition

类似于特征分解将矩阵分解成特征向量和特征值,奇异值分解(singular value decomposition, SVD)将矩阵分解为奇异向量(singular vector)和奇异值(singular value)。通过分解矩阵,我们可以发现矩阵表示成数组元素时不明显的函数性质。而相比较特征分解,奇异值分解有着更为广泛的应用,这是因为每个实数矩阵都有一个奇异值分解,但未必都有特征分解。例如,非方阵型矩阵没有特征分解,这时只能使用奇异值分解。

文本分类技术
text classification

该技术可被用于理解、组织和分类结构化或非结构化文本文档。文本挖掘所使用的模型有词袋(BOW)模型、语言模型(ngram)和主题模型。隐马尔可夫模型通常用于词性标注(POS)。其涵盖的主要任务有句法分析、情绪分析和垃圾信息检测。

时间复杂度技术
time complexity

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。例如,如果一个算法对于任何大小为 n (必须比 n0 大)的输入,它至多需要 5n3 + 3n 的时间运行完毕,那么它的渐近时间复杂度是 O(n3)。

反比文档频数权重评价方法技术
TF-IDF

tf-idf(英语:term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术。tf-idf是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。tf-idf加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了tf-idf以外,互联网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜索结果中出现的顺序。

word2vec技术
word2vec

Word2vec,为一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。 训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络之隐藏层。 Word2vec依赖skip-grams或连续词袋(CBOW)来建立神经词嵌入。Word2vec为托马斯·米科洛夫(Tomas Mikolov)在Google带领的研究团队创造。该算法渐渐被其他人所分析和解释。

词嵌入技术
Word embedding

词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。

权重技术
Weight

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

深度学习技术
Deep learning

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

推荐文章