1. 原理
学习了word2vec后,看视频时又发现有了GloVe、fasttext等word2vec的改进,虽然都是来训练词向量的,但觉得有点意思,就也学了学。
GloVe提出了一个共现矩阵的思路,是一种整合了LSA(构造一个关于词典和文档的矩阵X,然后通过SVD矩阵分解,可以减小一次多义等噪声信息,也就是利用了全局统计特征)和word2vec(以skip-gram为例,有一个window size,就是利用了局部的信息)提出的方法。
如果对LSA不清楚,可以参考下面的博客,我觉得是众多博客中写的很清晰的。
另外,这一篇GloVe写的也很清晰。
2. 代码实现
原理看懂上面的我觉得就够了,然后代码的实现部分,我看到大多数人都是把原代码粘贴上去,没啥参考意见导致我看代码花的时间更多,现在写一下批注。
打开https://github.com/stanfordnlp/GloVe,需要执行的文件是demo.sh
eval里有matlab、python文件夹,因为我用的python,所以我只关心python文件夹。里面有三个.py文件,我看demo.sh里运行的是evaluate.py文件,就只看了这个。
以我的语料为例,下面是test8.txt文件
然后是vocab.txt文件里的内容
统计词频,比如“的”出现了138次等。
最后形成的词向量
#!/bin/bash
set -e
# Makes programs, downloads sample data, trains a GloVe model, and then evaluates it.
# One optional argument can specify the language used for eval script: matlab, octave or [default] python
make
# if [ ! -e text8 ]; then # 注释掉的地方是下载语料的命令,因为用的自己的语料,所以注释了
# if hash wget 2>/dev/null; then
# wget http://mattmahoney.net/dc/text8.zip
# else
# curl -O http://mattmahoney.net/dc/text8.zip
# fi
# unzip text8.zip
# rm text8.zip
# fi
CORPUS=text8.txt # 注意更改语料名
VOCAB_FILE=vocab.txt # 词频统计
COOCCURRENCE_FILE=cooccurrence.bin # 共现矩阵的bin文件,暂时不知道是干嘛用的,跑代码后自动生成
COOCCURRENCE_SHUF_FILE=cooccurrence.shuf.bin
BUILDDIR=