词表征
·词表征就是如何用向量的方式来表示一个词的特征,让计算机能够对词进行处理,常用的两种词表征的方法:
·词袋模型:一个词也可以理解为是一篇最简单的文档,所以它可以用词袋来表示他的特征,这个时候的词袋就是一个独热编码。
独热编码举例:
·词向量模型:
词向量:又叫词嵌入,这种方法可以解决词袋模型的稀核心思想是:每一个词映射到一个多维空间中,成为空间中的一个向量,一般这个多维空间的维数不会太高,在几百个的量级,这几百维的特征向量是稠密的,向量中的每一个成员都是非零的。
由于词向量由几百个维度构成,所以也被称为分布式表征。词向量模型是通过对原始文本建模训练学习得到的。
由于词向量把每一个词映射到了一个高维空间中,并用向量表示,响亮的生成是基于词与词之间的相关性得来,可以理解为相关的词在空间中的位置比较靠近,所以词向量有一个非常有趣的特征,那就是类比。
·中心词:就是每一个待分析的词
·邻居词:在文档语料中,出现在中心词,周围某个小窗口内的关联词
·窗口大小c:就是指寻找邻居词的时候需要观察中心词的前后c个词
举例说明:“我家/猫/是/我/养/的/第一/只/宠物”这句话中,如果把“猫”当成当前正在分析的中心词,如果窗口大小c=3,那么,“猫”的邻居词是:我家,是,我,养。
词向量模型的核心原理就是用邻居词的概率分布来作为中心词的向量表示。
1.基于邻居词共现矩阵分解法
2.神经网络训练:通过构建两种类型的预测模型,然后使用网络的隐藏层输出作为词向量表征,这两种预测模型是
CBOW:利用中心词和邻居词预测中心词
Skip-gram:利用中心词来预测邻居词
不管是哪种类型的神经网络,它的本质都是希望发现中心词和邻居词之间的相关关系,词向量就是隐藏在这个相关关系中的隐特征。
从上图的示例中可以看到:输入是中心词(或者是邻居词),输出是邻居词(或者中心词)。神经网络中间有一个隐藏层,他的神经元个数要显著小于词的个数(一般就只有几百个),通过预测模型的训练学习,我们会得到网络的连接权重,例如”drink“这个词会和隐藏层的所有神经元都有连接权重,依据这个权重就可以得到drink这个词的词向量,向量的长度就是隐藏层的神经元个数,向量的数值就是神经元之间的连接权重。再看图的右边,与drink连接权重较高的神经元,他的右边又连接了一些词,这些词可以理解为就是drink的邻居词,例如juice,milk之类的词。
词向量只是对词的特征表征,如果要对一篇文档进行特征表征,有以下几种方法
·直接使用文档中所有词的词向量的平均值
·使用文档中每个词的TF-IDF值做为权重,与每个词的词向量进行加权平均
·根据文档中每个词的词向量对文档进行聚类,使用聚类后包含词最多的那个类的中心点作为文档特征向量
·使用doc2vec模型,这是个类似word2vec的模型,不过他是直接对doc来建模
以下为训练word2vec的代码及一些参数的讲解
创建输出目录 用来保存训练好的词向量
output_dir='output_word2vec'
import os
if not os.path.exists(output_dir):
os.mkdir(output_dir)
导入数据
import numpy as np
import pandas as pd
查看训练数据
train_data=pd.read_csv('sohu_train.txt',sep='\t',header=None,dtype=np.str_,encoding='utf8',names=['频道','文章'])
train_data.info()
·输出结果