词向量工具---GloVe使用教程

基于统计的词向量模型以基于SVD分解技术的LSA模型为代表,通过构建一个共现矩阵得到隐层的语义向量,充分利用了全局的统计信息。然而这类模型得到的语义向量往往很难把握词与词之间的线性关系(例如著名的King、Queen、Man、Woman等式)。基于预测的词向量模型则以基于神经网络的Skip-gram模型为代表,通过预测一个词出现在上下文里的概率得到embedding词向量。这类模型的缺陷在于其对统计信息的利用不充分,训练时间与语料大小息息相关。不过,其得到的词向量能够较好地把握词与词之间的线性关系,因此在很多任务上的表现都要略优于SVD模型。既然两种模型各有优劣,那么能不能二者各取其长,构造一个更强大的词向量模型呢?这就是接下来要介绍的GloVe模型。

GloVe是斯坦福大学提出的一种新的词矩阵生成的方法,GloVe全称应该是 Global Vectors for Word Representation,综合运用词的全局统计信息和局部统计信息来生成语言模型和词的向量化表示。官方主页链接,上面还有训练好的模型可以下载。
在GloVe的原始论文里,作者首先分析了Skip-gram模型能够挖掘出词与词之间线性关系的背后成因,然后通过在共现矩阵上构造相似的条件,得到一个基于全局信息的词向量模型——GloVe模型。
与Skip-gram模型相比,GloVe在充分利用了语料库的全局统计信息的同时,也提高了词向量在大语料上的训练速度(一个共现矩阵的遍历要比整个语料库的遍历容易的多)。而与传统的SVD技术相比,SGD的训练也更加简单高效。同时,GloVe得到的词向量更能把握住词与词之间的线性关系。
GloVe综合了LSA、CBOW的优点,训练更快、对于大规模语料算法的扩展性也很好、在小语料或者小向量上性能表现也很好。
和绝大多数的词向量不同,glove的目标是通过训练词向量和上下文向量,使得它们能够重构共现矩阵。
需要注意的是,在运行glove时,对内存要求比较高,1.4G的语料,20G的内存都无法运行,一直死机;后面降到300M的语料,20G的内存基本上能够运行。而gensim中的word2vec,对于1.4G的语料,20G完全可以运行,而且只需要几个小时就能跑出结果。

glove在三元组上面进行训练, glove是根据每个三元组去更新一次词向量和上下文向量
GloVe训练参数:

  • 最佳的向量维度:300左右,之后变化比较轻微
  • 对于GloVe向量来说最佳的窗口长度是8
  • 训练迭代次数越大,对于GloVe来说确实有助于达到更好的效果
    在不同语料库训练的300维向量在类比任务上的精度对比
  • 更多的数据有助于帮助提高训练精度
    GloVe与CBOW、Skip-Gram的对比

论文链接

GloVe实现:
目前开源的有C语言版本、Python版本和R语言版本。
python:python-glove

Python版本GitHub地址
安装
pip install glove_python

GloVeC语言版本GitHub地址
跑在linux下
那就只能用C的代码训练,然后再用python来处理结果。让人欣喜的是,GloVe训练的结果,是可以用gensim里面word2vec的load直接加载并且使用的(将参数write_header设置为1,会在 vectors.txt 的首行添加<词表大小>/<词向量大小>),那就简单了。

下载源码

1
$ git clone http://github.com/stanfordnlp/glove

切换到glove目录

1
$ cd glove

首先先参考 README.txt,里面主要介绍这个程序包含了四部分子程序,按步骤分别是vocab_countcooccurshuffleglove

vocab_count

用于统计文本中的词的词频,生成 vocab.txt,每一行为:词 词频。

cooccur

用于统计词与词的共现,目测类似与 word2vec 的窗口内的任意两个词,生成二进制文件 cooccurrence.bin

shuffle

cooccurrence.bin中的共现结果重新整理。对于大文件,文件自动分割成块,每个块 shuffle 后再合并在一起,生成二进制文件 cooccurrence.shuf.bin

glove

GloVe 算法的训练模型,使用之前生成的vocab.txtcooccurrence.shuf.bin,最终会输出词典中词对应的词向量 vectors.txt和词向量二进制文件 vectors.bin。(

编译源码

1
$ make

确保安装了 gcc ,生成一个 build 的文件夹

Demo测试

1
$ ./demo.sh

GitHub地址

-------------本文结束感谢您的阅读-------------
坚持整理学习笔记,您的支持将鼓励我继续整理下去!