word2vec是google 推出的做詞嵌入(word embedding)的開源工具。 簡單的說,它在給定的語料庫上訓練一個模型,然後會輸出所有出現在語料庫上的單詞的向量表示,這個向量稱爲"word embedding"。基於這個向量表示,可以計算詞與詞之間的關係,例如相似性(同義詞等),語義關聯性(中國 - 北京 = 英國 - 倫敦)等。NLP中傳統的詞表示方法是 one-hot representation, 即把每個單詞表示成dim維的稀疏向量,dim等於詞彙量的大小。這個稀疏向量只有一個維度(該單詞的index)上是1,其餘全是0。這個表示方法使得單詞之間是孤立的。 word embedding則是把單詞的表示降維到n維的稠密向量,n<<dim。
本文是對word2vec工具使用過程的整理與總結,方便大家儘快上手。本文分別對英文和中文兩種語料處理爲例。
1、word2vec 源碼
Google Code 提供的 word2vec 可以通過 SVN 下載,
地址爲:http://word2vec.googlecode.com/svn/trunk/
2、環境
編譯和運行都需要在 linux 系統中進行; 我的系統是Ubuntu16.04。
3、編譯
(1)cd 進入 word2vec 的代碼目錄;
(2)直接輸入: make,然後回車即開始編譯,完成後目錄中多出幾個沒有後綴的文件, 即爲編譯後的程序;
4、下載訓練數據(英文語料)
text8:下載地址:http://mattmahoney.net/dc/text8.zip
直接解壓到當前文件夾,text8 數據文件與程序在同一目錄。
5、訓練
訓練 wordvector 一般要指定向量的維度,可以使用默認值:200
編輯 demo-word.sh
原文件中的腳本如下:
make
if [ ! -e text8 ]; then
wget http://mattmahoney.net/dc/text8.zip -O text8.gz
gzip -d text8.gz -f
fi
time ./word2vec -train text8 -output vectors.txt -cbow 0 -size 200 -window 5 -negative 0 -hs
1 -sample 1e-3 -threads 12 -binary 0 -iter 20
保存後,就可以在命令行下運行了:>sh demo-word.sh
等待訓練完成,就可以的到訓練好的詞向量 vectors.txt 。
5、參數介紹
-train text8 表示在指定的語料庫 text8 上訓練模型
-output vectors.txt 表示訓練得到詞向量的結果
-cbow 0 表示使用skip-gram模型,設置 1 表示使用 CBOW 模型
-size 200 表示訓練詞向量的維度
-window 5 表示訓練窗口大小爲5,即考慮一個單詞的前5個單詞和後5個單詞
-negative 0 -hs 1 表示是使用negative sample 還是使用HS 算法,在此使用的 HS 算法
-sample 1e-3 採用的閥值
-threads 12 線程數
-binary 0 表示輸出爲文本格式,設置爲 1 輸出保存爲二進制形式
-iter
20 表示迭代次數
6、訓練中文語料
我用的是商品點評的語料,處理了一份中文wiki語料庫,已經完成格式化、繁體轉簡體和分詞的過程,下載頁面: http://pan.baidu.com/s/1jHZCvvo 文件名爲:wiki_chinese_preprocessed.simplied.txt
對於中文語料,第一步需要分詞。現成的工具很多,我使用的 jieba 分詞。感覺效果還挺不錯的。
分完詞後,把語料庫整理成Word2vec的輸入格式。這個格式很簡單,單詞之間用空格隔開就行了。 word2vec 把一個單詞的前面和後面的k個單詞作爲context訓練, 其中會自動把換行符替換成 </s> ,也就是句子分隔符。
編輯 demo-word.sh
time ./word2vec -train
wiki_chinese_preprocessed.simplied.txt -output wiki_vectors.txt -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary
0 -iter 20
保存後,就可以在命令行下運行了:>sh demo-word.sh
漫長的訓練已經開始了。。。。1G的語料大概需要兩個小時能訓練完吧!!!
。。。。
。。。。
訓練完成後的到 wiki_vectors.txt 詞向量文件