一、 准备自己的语料库
使用爬虫爬取数据,爬取之后的中文文本数据不能直接使用,需要进行分词,分完词后保存为data.txt(这是我爬取的豆瓣影评的数据)
二、下载Glove代码
https://github.com/stanfordnlp/GloVe
将数据data.txt保存在Glove的主文件夹下
三、修改bash
打开 demo.sh,修改相应的内容
修改如下:
因为demo默认是下载网上的语料来训练的,如果想要训练自己的语料,就需要注释掉,并且把语料替换掉,修改如下:
下边的代码,原来是这样的:
echo
echo "$ $BUILDDIR/vocab_count -min-count $VOCAB_MIN_COUNT -verbose $VERBOSE < $CORPUS > $VOCAB_FILE"
$BUILDDIR/vocab_count -min-count $VOCAB_MIN_COUNT -verbose $VERBOSE < $CORPUS > $VOCAB_FILE
echo "$ $BUILDDIR/cooccur -memory $MEMORY -vocab-file $VOCAB_FILE -verbose $VERBOSE -window-size $WINDOW_SIZE < $CORPUS > $COOCCURRENCE_FILE"
$BUILDDIR/cooccur -memory $MEMORY -vocab-file $VOCAB_FILE -verbose $VERBOSE -window-size $WINDOW_SIZE < $CORPUS > $COOCCURRENCE_FILE
echo "$ $BUILDDIR/shuffle -memory $MEMORY -verbose $VERBOSE < $COOCCURRENCE_FILE > $COOCCURRENCE_SHUF_FILE"
$BUILDDIR/shuffle -memory $MEMORY -verbose $VERBOSE < $COOCCURRENCE_FILE > $COOCCURRENCE_SHUF_FILE
echo "$ $BUILDDIR/glove -save-file $SAVE_FILE -threads $NUM_THREADS -input-file $COOCCURRENCE_SHUF_FILE -x-max $X_MAX -iter $MAX_ITER -vector-size $VECTOR_SIZE -binary $BINARY -vocab-file $VOCAB_FILE -verbose $VERBOSE"
$BUILDDIR/glove -save-file $SAVE_FILE -threads $NUM_THREADS -input-file $COOCCURRENCE_SHUF_FILE -x-max $X_MAX -iter $MAX_ITER -vector-size $VECTOR_SIZE -binary $BINARY -vocab-file $VOCAB_FILE -verbose $VERBOSE
if [ "$CORPUS" = 'text8' ]; then
if [ "$1" = 'matlab' ]; then
matlab -nodisplay -nodesktop -nojvm -nosplash < ./eval/matlab/read_and_evaluate.m 1>&2
elif [ "$1" = 'octave' ]; then
octave < ./eval/octave/read_and_evaluate_octave.m 1>&2
else
echo "$ $PYTHON eval/python/evaluate.py"
$PYTHON eval/python/evaluate.py
fi
fi
现修改成这样的:
$BUILDDIR/vocab_count -min-count $VOCAB_MIN_COUNT -verbose $VERBOSE < $CORPUS > $VOCAB_FILE
if [[ $? -eq 0 ]]
then
$BUILDDIR/cooccur -memory $MEMORY -vocab-file $VOCAB_FILE -verbose $VERBOSE -window-size $WINDOW_SIZE < $CORPUS > $COOCCURRENCE_FILE
if [[ $? -eq 0 ]]
then
$BUILDDIR/shuffle -memory $MEMORY -verbose $VERBOSE < $COOCCURRENCE_FILE > $COOCCURRENCE_SHUF_FILE
if [[ $? -eq 0 ]]
then
$BUILDDIR/glove -save-file $SAVE_FILE -threads $NUM_THREADS -input-file $COOCCURRENCE_SHUF_FILE -x-max $X_MAX -iter $MAX_ITER -vector-size $VECTOR_SIZE -binary $BINARY -vocab-file $VOCAB_FILE -verbose $VERBOSE
if [[ $? -eq 0 ]]
then
if [ "$1" = 'matlab' ]; then
matlab -nodisplay -nodesktop -nojvm -nosplash < ./eval/matlab/read_and_evaluate.m 1>&2
elif [ "$1" = 'octave' ]; then
octave < ./eval/octave/read_and_evaluate_octave.m 1>&2
else
python eval/python/evaluate.py
fi
fi
fi
fi
fi
四、训练模型
训练模型需要注意Glove支持在linux下运行,因此需要安装一个可以在windows下用linux的环境。只需安装Cygwin,在页面中下载setup-x86_64.exe就可以了。
3.1 安装Cygwin步骤
注意这一步 Browser选择你想安装的位置,然后点下一步。
在这里选择一个好用的镜像,比如aliyun.com,然后点击下一步。
再然后,开始安装我们需要的组件,也可以把所有的组件都安装上,但是后面安装的时候很耗时间,所以,我们只需要安装若干个很常用的就行了,我们必须安装的有:gcc,g++,make,tar。。
依次点开 all-Devel,在Devel里选择我们需要的组件(binutils,gcc-core,gcc-g++,gdb,git,make,mingw64-i686-gcc-core,mingw64-i686-gcc-g++,)
各种组件:
找不到的不用纠结,会自动帮你选上的,选完了图示的几个组件后,点下一步:
然后就开始坐等安装成功了!安装完成之后,桌面上会有一个快捷方式,打开之后验证我们是否安装成功了:
输入:cygcheck -c cygwin
如果Status 状态是OK,则Cygwin运行正常
之后分别输入make -v,gcc -v, g++ -v查看版本
可以看到这些组件我们都安装好了,但是还没有结束,还差最后一步添加环境变量。我的电脑(右键)->属性->高级系统设置->环境变量->系统变量中 找到path,点击编辑
添加Cygwin文件夹下的 bin、sbin、usr/sbin这三个文件夹
然后就可以在cmd命令行里使用linux命令了
先来测试pwd和ls命令:
测试成功
3.2 Glove训练
在cmd命令行里进入Glove主文件夹下:
输入:make
输入: bash demo.sh
可以看到已经在训练了,训练时间取决于你的语料库,总之还是很快的。
训练完之后可以看到有生成的词向量txt文件,这就是我们已经训练好的词向量!
最后加载模型,使用Gensim。
安装gensim需要注意的一点:
安装命令: pip install gensim
如果numpy报错,就卸载gensim,再卸载numpy,然后重新pip install gensim,pip install numpy
如果scipy报错,就卸载gensim,再卸载scipy,然后重新安装gensim和scipy
注意卸载之后重新安装的顺序不能乱!
如果import gensim的时候出现了warning那么只需要每次import的时候输入:
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')
from gensim.models import KeyedVectors
from gensim.scripts.glove2word2vec import glove2word2vec
import numpy as np
def sigmoid(x):
# TODO: Implement sigmoid function
return 1/(1 + np.exp(-x))
# 输入文件
glove_file = 'vectors.txt'
# 输出文件
w2v_file = 'w2v.txt'
# 开始转换
glove2word2vec(glove_file, w2v_file)
# 加载转化后的文件
model = KeyedVectors.load_word2vec_format(w2v_file) # 该加载的文件格式需要转换为utf-8
# print(model['月'])
vector1 = model['白娘子']
vector2 = model['白素贞']
# print('白娘子和白素贞的相似度', vector1.dot(vector2.T) / (np.linalg.norm(vector1) * np.linalg.norm(vector2)))
print("<余弦距离>\"白娘子\"与\"白素贞\"的相似度为:{:.3f}".format(vector1.dot(vector2.T) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))))
for i in range(len(vector1)):
temp = np.subtract(vector1[i], vector2[i])
temp = np.power(temp, 2)
dicts = np.sqrt(temp.sum())
print("<欧式距离>\"白娘子\"与\"白素贞\"的相似度为:{:.3f}".format(dicts))
运行结果: