word2vec编译步骤

一、编译源码


1.直接在word2vec下运行make,报错误信息:显示编译参数-Ofast有问题
  将-Ofast更改为 -O
2.在上一步的基础上继续编译,报错误信息:识别不了选项参数-Wno-unused-result
  查看gcc版本(gcc --version)发现是3.4.5
3.升级gcc版本:
  1)下载gcc安装包: wget http://bpkg.baidu.com/gcc-4.8.3/gcc-4.8.3.02-installer.bin
  2)直接运行下载到的安装包:sh gcc-4.8.3.02-installer.bin /opt/compiler/gcc-4.8.2
  我的开发机器提示目录/opt/compiler/gcc-4.8.2已经存在,已经安装好了
  3)开发机使用:
    方法1)设定PATH变量,进行使用export PATH=/opt/compiler/gcc-4.8.2/bin:$PATH
    方法2)使用绝对路径:/opt/compiler/gcc-4.8.2/bin/gcc XXX
    方法3)设定CC变量:export CC=/opt/compiler/gcc-4.8.2/bin/gcc   CC xxx
4)高版本gcc生效确认
  which gcc
  gcc --version
5)直接make 通过

二、示例测试


1.将文本预料进行分词,以空格,tab隔开都行
2.将分好词的训练语料进行训练,假定语料名称为test.txt且在word2vec目录中
输入:./word2vec -train test.txt -output vectors.bin -cbow 0
-size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1
-train:输入文件
-output:输出文件
-cbow:0表示不使用cbow模型,默认为Skip-Gram模型
-size:200,每个单词的向量维度是200
-window:5,训练的窗口大小为5,考虑一个词前五个和后五个
-negative:0表示不使用NEG方法
-hs:1表示使用HS方法
-sample:采样的阈值,如果一个词语在训练样本中出现的频率越大,那么就越会被采样
-binary:1表示结果二进制存储,0是普通存储。
------------------------------------------
-alpha:学习速率,默认为0.025
–min-count:设置最低频率,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃
-classes:设置聚类个数

三、寻找中文语料


网址:http://www.cnblogs.com/hebin/p/3507609.html
首先准备数据:采用网上博客上推荐的全网新闻数据(SogouCA)
ftp上下载数据包SogouCA.tar.gz:(注意密码需要转义)   http://www.sogou.com/labs/dl/ca.html(搜狗新闻数据)
wget ftp://ftp.labs.sogou.com/Data/SogouCA/SogouCA.tar.gz --user [email protected] --password \(bk\)80ZraPnADjQ7

解压数据包:
gzip -d SogouCA.tar.gz
tar -xvf SogouCA.tar

再将生成的txt文件归并到SogouCA.txt中,取出其中包含content的行并转码,得到语料corpus.txt,大小为2.7G
cat *.txt > SogouCA.txt
cat SogouCA.txt | iconv -f gbk -t utf-8 -c | grep "" > corpus.txt
(windows下的文件复制到linux下时常会乱码,windows下文件编码为GBK,linux下默认文件编码为UTF-8,故需要iconv命令转码
。-f 原始文件编码; -t 输出编码; -c从输出中忽略无效的字符)
 
    
 
    


四、分词

用ANSJ对corpus.txt进行分词,得到分词结果resultbig.txt,大小为3.1G
wget ftp://cp01-dm-003.cp01.baidu.com//home/forum/daihuan/resultbig.txt --user xxx --password xxx
需要内存较大的机器

五、配置ansj环境


下载第三方的jar包http://maven.ansj.org/org/
测试的时候用到了3个:ansj_seg-0.9.jar;nlp-lang-0.2.jar;tree_split-1.4.jar
------------------------------------------------------
test.java
--------
String str = "欢迎使用ansj_seg,(ansj中文分词)在这里如果你遇到什么问题都可以联系我.我一定尽我所能.帮助大家.ansj_seg更快,更准,更自由!";
System.out.println(ToAnalysis.parse(str));
--------------------------------------------------------------------
linux命令行java加载第三方包:(现在jar包和java程序放在同一个目录下,生成的class文件也在同一个目录)
javac -cp ansj_seg-0.9.jar:nlp-lang-0.2.jar:tree_split-1.4.jar: ./test.java
java -cp ansj_seg-0.9.jar:nlp-lang-0.2.jar:tree_split-1.4.jar:./ test
-------------------------------------------------------
需要注意的几点:
1.编译的时候,需要使用-cp环境变量来引入外部jar的地址.
2.运行过程中,环境变量-cp中一定要加入编译时候生成的class文件的路径.并且用冒号分隔.
-----------------------------------------------------------
开始分词:http://blog.csdn.net/jj12345jj198999/article/details/11069485#comments
使用这里面的分词程序:注意写入文件的时候使用utf8编码. 对较大文件,会存在内存不够,分词失败的情况
最后生成resultbig.txt文件

六、本地运行word2vec进行分析


1.计算相似的词

nohup ./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1 &
这里指定输出为vectors.bin文件,便于以后重复利用,处理2.2G的词集合需要接近半个小时的时间.
./distance vectors.bin
输入计算距离的命令,计算与每个词最接近的词
----由于word2vec计算的是余弦值,距离范围为0-1之间,值越大代表这两个词关联度越高
-----./distance可以看成计算词与词之间的距离,把词看成向量空间上的一个点,distance看成向量空间上点与点的距离

2.潜在的语言学规律

对demo-analogy.sh修改后 测试:vector("法国")-vector("巴黎")+vector("巴黎")---->vector("伦敦")
???具体如何修改,待测试

3.聚类命令:

将经过分词后的语料resultbig.txt的词聚类开按照类别排序:
nohup ./word2vec -train resultbig.txt -output classes.txt -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -classes 500 &
sort classes.txt -k 2 -n > classes.sorted.txt

4.短语分析:

先利用经过分词的语料resultbig.txt中得出包含词和短语的文件sogouca_phrase.txt,再训练该文件中词与短语的向量标识
/word2phrase -train resultbig.txt -output sogouca_phrase.txt -threshold 500 -debug 2
 
     
./word2vec -train sogouca_phrase.txt -output vectors_sogouca_phrase.bin -cbow 0 -size 300 -window 10 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1

你可能感兴趣的:(编程学习)