一、編譯源碼
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 "<content>" > 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