这里写目录标题

  • 前言
  • 文本转变向量
  • 基于词袋模型的
  • One-hot 编码():
  • TF—IDF(Term Frequency------Inverse Document Frequency)
  • 基于词嵌入(word2vec)
  • 原理:
  • 训练阶段:
  • 两种训练模型:
  • 连续词袋(CBOW):
  • Skip-gram:
  • 优化方法(待补充):
  • Negative Sample
  • Hierarchical Softmax


前言

本文适合小白入门学习(不涉及公式和代码)

文本转变向量

基于词袋模型的

One-hot 编码():

将每个单词表示为一个独热向量,向量维度为词汇表大小,其中只有一个元素为1,其余为0。将所有单词的独热向量拼接起来,得到文本的向量表示。

在自然语言处理中,若字典或字库里有N个字段,则每个字段可以被一个N维的 one-hot 向量代表。由于电脑无法理解非数字类的数据,one-hot 编码可以将分类数据转换成统一的数字格式,方便机器学习算法的处理及计算。而转换成固定维度的向量则方便机器学习算法进行线性代数上的计算。另外,由于一个 one-hot 向量中,绝大部分的数字都是 0,所以若使用稀疏矩阵的数据结构,则可以节省电脑内存的使用量。

优点:解决了分类器处理离散数据困难的问题

一定程度上起到了扩展特征的作用

缺点:one-hot 是一个词袋模型,不考虑词与词之间的顺序问题,而在文本中,词的顺序是一个很重要的问题

one-hot 是基于词与词之间相互独立的情况下的,然而在多数情况中,词与词之间应该是相互影响的

one-hot 得到的特征是离散的,稀疏的

文本词频向量化 python 文本转化为词向量_tf-idf

TF—IDF(Term Frequency------Inverse Document Frequency)

当有TF(词频)和IDF(逆文档频率)后,将这两个词相乘,就能得到一个词的TF-IDF的值。某个词在文章中的TF-IDF越大,那么一般而言这个词在这篇文章的重要性会越高,所以通过计算文章中各个词的TF-IDF,由大到小排序,排在最前面的几个词,就是该文章的关键词。


文本词频向量化 python 文本转化为词向量_文本词频向量化 python_02

文本词频向量化 python 文本转化为词向量_tf-idf_03

文本词频向量化 python 文本转化为词向量_机器学习_04

优点:TF-IDF的优点是简单快速,而且容易理解

缺点:是有时候用词频来衡量文章中的一个词的重要性不够全面,有时候重要的词出现的可能不够多,而且这种计算无法体现位置信息,无法体现词在上下文的重要性

文本词频向量化 python 文本转化为词向量_tf-idf_05


文本词频向量化 python 文本转化为词向量_文本词频向量化 python_06

上面两种可以看出都有一个共同的缺点,那就是简单较容易理解,但是都不能够体现词在上下文的重要性和联系。

基于词嵌入(word2vec)

将每个单词表示为一个固定长度的向量,通过训练神经网络来学习单词的向量表示。将所有单词的向量拼接起来,得到文本的向量表示。目的是得到一个向量,每一个值代表着输出一个词的概率。

原理:

word2vec是一个简单的神经网络,有以下几个层组成(以CBOW模型输入一个词为例):


文本词频向量化 python 文本转化为词向量_tf-idf_07

这里我们假设词汇表中有10000个词汇,隐层神经单元数量为300

(1)1个输入层:输入使用的是one-hot编码。即:假设词汇表中有10000个词,则每一个词可以用一个one-hot向量([10000,1]的向量)来表示,这个10000维向量只有一个位置是1,其余位置都是0。

在输入层和隐藏层之间有一个权重系数 W ,我们的目标之一就是通过训练得到这个 权重矩阵 ,由图可得,这个权重矩阵的作用是 ,一个词的one-hot编码通过这个权重矩阵(也就是相当于隐层的输出之后),将会变为一个词向量,前面我们说过这个词向量相比于 one-hot 编码的优势在于维度较低,而且能够表示词语词之间的关系,即(相近的词义投射到 300 维度的空间中,位置相近)。那么为什么 one-hot 编码经过一个权重矩阵之后就变为这个词对应的词向量呢 ?

这是因为,细心的同学会发现,0-1向量乘上一个矩阵,就相当于选择了权重矩阵的某一行,如图:输入的向量X是[0,0,1,0,0,0],W的转置乘上X就相当于从矩阵中选择第3行[2,1,3]作为隐藏层的值,那又有同学会问,这个权重矩阵是怎么得来的呢 ?请继续往下边看,这里我们先放一放。

(2)1 个隐藏层:隐藏层的神经单元数量(这里不用深究,感兴趣的同学可以百度一下,最常用的神经元数量50-300,神经元数量越少,计算的就越快,反之神经单元数量越多计算的就越准确),代表着每一个词用向量表示的维度大小。对于输入层和隐藏层之间的权值矩阵,它的形状应该是[10000, 300]的矩阵。

在隐藏层和输出层之间还有一个权重矩阵W ’ , 我们先来看一下由隐藏层经过这个**W 变为什么样子了,首先看图我们会发现输出层的第一个数7,就是向量[2,1,3]和列向量[1,2,1]点乘之后的结果,所以,隐藏层的输出 h维度是[300,1] ,输出层 y 的维度是[10000,1],由此我们可知 W ‘ 的维度是[300,10000] , 那么这个权重矩阵的作用是什么呢 ? ** 权重矩阵 W ’ 是通过使用反向传播算法和梯度下降优化算法来训练的。在训练过程中,模型将尝试最小化损失函数,该函数测量模型在预测下一个单词时的错误率。通过反向传播算法,模型可以计算出每个参数对损失函数的贡献,并使用梯度下降算法来更新权重矩阵以最小化损失函数。

(3)1 个输出层:上面经过W‘之后得到的结果经过了输出层,是一个 [10000,1] 大小的向量,而最终的输出需要经过softmax函数,将输出向量中的每一个元素归一化到0-1之间的概率,概率最大的,就是预测的词。

至此,一个大概的框架算是讲完了。那接下来就是我们的训练阶段。

训练阶段:

1.先是获取大量文本数据(例如:所有维基百科内容)
2.然后我们建立一个可以沿文本滑动的窗(例如:一个窗里包含三个单词)
3.利用这样的滑动窗口就能为训练模型生成大量样本数据(每滑动一次,就产生一个样本):样本包含特征和标签,一般把与一个词相邻的词作为特征,自己作为标签

两种训练模型:


文本词频向量化 python 文本转化为词向量_机器学习_08

连续词袋(CBOW):

不仅考虑目标单词的前几个单词还要考虑后面几个单词,即通过上下文预测的当前词

以CBOW模型输入一个词的例子在上面讲过了,下面是以CBOW模型输入多个词的例子


文本词频向量化 python 文本转化为词向量_机器学习_09

对比可以发现,和simple CBOW不同之处在于,输入由1个词变成了C个词,每个输入到达隐藏层都会经过相同的权重矩阵W,隐藏层h的值变成了多个词乘上权重矩阵之后加和求平均值,其他的和simple CBOW相同。

Skip-gram:

根据当前的词来预测前后可能出现的词,即通过当前词预测上下文


文本词频向量化 python 文本转化为词向量_word2vec_10

Skip-gram输入层到隐藏层的原理和simple CBOW一样,不同的是隐藏层到输出层,损失函数变成了C个词损失函数的总和,权重矩阵W’还是共享的。

一般神经网络语言模型在预测的时候,输出的是预测目标词的概率,也就是说我每一次预测都要基于全部的数据集进行计算,这无疑会带来很大的时间开销。不同于其他神经网络,Word2Vec提出两种加快训练速度的方式,一种是Hierarchical softmax,另一种是Negative Sampling

优化方法(待补充):
Negative Sample
Hierarchical Softmax