word2vec下载
word2vec是Google2013年开源的一个计算词向量的工具,因为近期想做一个词向量的尝试所以向word2vec求助了,也是刚刚入门。
word2vec原理
对word2vec的理解,我的最主要的学习资料是word2vec的数学原理,以下大部分内容是对这篇文章的一个简要复述,略去了数学基础部分。
词向量
词向量这一概念是Bengio等人在A neural probabilistic language model 中提出的。什么是词向量呢?简单来说就是对词典D中的任意词w,指定一个固定长度的实值向量v(w)∈ℝm,v(w)就称为w的词向量,m为词向量的长度。
为什么要用词向量呢?最基本的需求就是在NLP任务中,我们需要将自然语言交给机器处理,然而机器无法处理自然语言,因此需要将我们的输入映射为数值。
处理这一问题传统的方法是利用one-hot representation对词进行表示。就是利用一个长度与词典大小相等的向量来表示一个词,向量中取值为1的分量只有一个,它的位置对应于该词在词典中的索引,而其他位置的分量取值全为0。这种表示的不足在于过于稀疏,容易引发维数灾难,并且在处理训练集中出现较少的词时表现较弱。
另一种对词的表示是Distributed Representation,我们现在讨论的词向量就属于这种表示。它最早是Hinton于1986年提出的,基本思想是通过训练将某种语言中的每一个词映射成一个固定长度的短向量,所有向量构成一个词向量空间,而每一向量可视为该空间中的一个点,在这个空间上引入“距离”,就可以根据词之间的距离来判断它们之间的(词法,语义上的)相似性了。
词向量的生成
word2vec提供了两个生成词向量的模型——CBOW模型(Continuous Bag-of-Words Model)和Skip-gram模型(Continuous Skip-gram Model)。要理解词向量的生成过程,重要的一点是理解在两个模型中,词向量都是一种副产品。
CBOW模型包括三层:输入层,投影层和输出层。以样本(Context(w),w)为例,这里假设Context(w)由w前后各c个词组成。输入层是Context(w)中2c个词的词向量;投影层将这2c个向量做求和累加;输出层对应一个Huffman树,树的每个叶子结点都对应着词表中的某个词。词向量每经过一个分支,相当于对词向量进行一次分类,直到沿某一路径走到叶子结点,这个叶子结点对应的词就是w的取值。
所以这整个系统解决的问题是根据词w的上下文来预测w的取值。在进入输入层之前w前后的2c个词就已经表示成了词向量,这一表示过程中的参数是与后面Huffman树结点的参数同时进行训练的。具体过程参见《word2vec的数学原理》。
word2vec使用
在使用word2vec进行训练之前,有些东西是我们需要确定的,具体来说就是:
- 生成词向量的维数
- 上下文窗的大小
- 训练算法(hierarchical softmax/ negative sampling)
- 对频繁出现的词欠采样的门限
- 使用的线程数
- 输出文件的格式(文本/二进制)
工具的使用很简单,需要的输入只有一个文本格式的语料和以上各种选项。下载word2vec后对压缩包进行提取,进入trunk目录,然后在终端执行二进制程序word2vec,下面是系统给出的示例:
./word2vec -train data.txt -output vec.txt -size 200 -window 5 -sample 1e-4 -negative 5 -hs 0 -binary 0 -cbow 1 -iter 3
此例中输入的语料是data.txt,输出存储为文本形式的vec.txt,词向量维数为200,上下文窗为5,对频繁出现的词欠采样的门限为10−4,使用negative sampling算法,输出格式为文本,采用cbow算法,对预料遍历3次。
训练过程很快,得到的结果可以直接用于后续流程,可以用trunk中的distance程序评估词向量的效果(需要二进制格式的词向量输出)。
./distance vec
distance用于交互地列出语料中与用户输入相似的词,其中vec是已经生成的二进制格式的词向量。