NPL实践系列:6、简单神经网络

1. 文本表示:从one-hot到word2vec

在自然语言处理领域,one-hot,word2vec是两种常见的词向量,下面来介绍这两种词向量的原理和特性。

1.1 词向量

词向量就是用来将语言中的词进行数学化的一种方式,顾名思义,词向量
就是把一个词表示成一个向量。这样做的初衷就是机器只认识0 1 符号,换句话说,在自然语言处理中,要想让机器识别语言,就需要将自然语言抽象表示成可被机器理解的方式。所以,词向量是自然语言到机器语言的转换。

1.2 one-hot向量

词向量最初是用one-hot represention表征的,也就是向量中每一个元素都关联着词库中的一个单词,指定词的向量表示为:其在向量中对应的元素设置为1,其他的元素设置为0。采用这种表示无法对词向量做比较,后来就出现了分布式表征。

在word2vec中就是采用分布式表征,在向量维数比较大的情况下,每一个词都可以用元素的分布式权重来表示,因此,向量的每一维都表示一个特征向量,作用于所有的单词,而不是简单的元素和值之间的一一映射。这种方式抽象的表示了一个词的“意义”。
向量的长度为词典的大小,向量的分量只有一个 1,其他全为 0, 1 的位置对应该词在词典中的位置,例如

“话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …]

“麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]

优点: 如果使用稀疏方式存储,非常简洁,实现时就可以用0,1,2,3,…来表示词语进行计算,这样“话筒”就为3,“麦克”为8.

缺点:1.容易受维数灾难的困扰,尤其是将其用于 Deep Learning 的一些算法时;2.任何两个词都是孤立的,存在语义鸿沟词(任意两个词之间都是孤立的,不能体现词和词之间的关系)。

也正是这些原因,Hinton在 1986 年提出了Distributional Representation,可以克服 one-hot representation的缺点。解决“词汇鸿沟”问题,可以通过计算向量之间的距离(欧式距离、余弦距离等)来体现词与词的相似性

其基本想法是直接用一个普通的向量表示一个词,这种向量一般长成这个样子:[0.792, −0.177, −0.107, 0.109, −0.542, …],常见维度50或100。

优点:解决“词汇鸿沟”问题

缺点:训练有难度。没有直接的模型可训练得到。所以采用通过训练语言模型的同时,得到词向量 。

当然一个词怎么表示成这么样的一个向量是要经过一番训练的,训练方法较多,word2vec是其中一种。值得注意的是,每个词在不同的语料库和不同的训练方法下,得到的词向量可能是不一样的。

1.3 word2vec向量

现在得到词向量最常用的方法是word2vec。word2vec通过训练一个神经网络,得到网络的权重矩阵,作为输入的词向量。常用的word2vec模型是:CBOW(连续词袋模型),Skip-gram。CBOW,Skip-gram两者的差别在于:CBOW通过上下文预测中心词概率,而Skip-gram模型则通过中心词预测上下文的概率。
举个例子,对于一句话:社会主义就是好,对于CBOW,如果要预测“主义”,则输入就是“社会”,“就是”,“好”;对于Skip-gram,输入则是“主义”,输出是剩下的几个字。
但它们的相同点在于,这两个算法训练的目标都是最大限度的观察实际输出词(焦点词)在给定输入上下文且考虑权重的条件概率。比如在上段的例子里,通过输入“社会”,“就是”,“好”之后,算法的目标就是训练出一个网络,在输出层,能最大概率的得到“主义”的条件概率。

2. 走进FastText

2.1 FastText的原理

fastText算法是一种有监督的模型,CBOW架构很相似,CBOW,通过上下文预测中间词,而fastText则是通过上下文预测标签(这个标签就是文本的类别,是训练模型之前通过人工标注等方法事先确定下来的)。从模型架构上来说,fastText沿用了CBOW的单层神经网络的模式,不过fastText的处理速度才是这个算法的创新之处。
fastText模型的输入是一个词的序列(一段文本或者一句话),输出是这个词序列属于不同类别的概率。在序列中的词和词组构成特征向量,特征向量通过线性变换映射到中间层,再由中间层映射到标签。fastText在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
该模型将一系列单词作为输入并产生一个预定义类的概率分布。我们使用一个softmax方程来计算这些概率。当数据量巨大时,线性分类器的计算十分昂贵,所以fastText使用了一个基于霍夫曼编码树的分层softmax方法。常用的文本特征表示方法是词袋模型,然而词袋(BoW)中的词顺序是不变的,但是明确考虑该顺序的计算成本通常十分高昂。作为替代,fastText使用n-gram获取额外特征来得到关于局部词顺序的部分信息。
在fastText 中一个低维度向量与每个单词都相关。隐藏表征在不同类别所有分类器中进行共享,使得文本信息在不同类别中能够共同使用。这类表征被称为词袋(bag of words)(此处忽视词序)。在 fastText中也使用向量表征单词 n-gram来将局部词序考虑在内,这对很多文本分类问题来说十分重要。

2.2 利用FastText模型进行文本分类

下面使用的语料是清华大学的新闻文本(下载地址:http://thuctc.thunlp.org/message),
用FastText模型进行文本分类:

import fasttext.fasttext as ff

参考博客:https://zhuanlan.zhihu.com/p/26306795
https://blog.csdn.net/mawenqi0729/article/details/80698780
https://blog.csdn.net/jiede1/article/details/80803171
https://www.jianshu.com/p/e828f02e41c8

你可能感兴趣的:(python,机器学习,NPL)