word2vec
要解決問題: 在神經網絡中學習將word映射成連續(高維)向量,這樣通過訓練,就可以把對文本內容的處理簡化為K維向量空間中向量運算,而向量空間上的相似度可以用來表示文本語義上的相似度。
一般來說, word2vec輸出的詞向量可以被用來做很多 NLP 相關的工作,比如聚類、找同義詞、詞性分析等等。另外還有其向量的加法組合算法。官網上的例子是 :
vector('Paris') - vector('France') +
vector('Italy') ≈vector('Rome'), vector('king') - vector('man') + vector('woman') ≈
vector('queen')
但其實word2vec也只是少量的例子完美符合這種加減法操作,並不是所有的 case 都滿足。
快速入門
1、從http://word2vec.googlecode.com/svn/trunk/ 下載所有相關代碼:
一種方式是使用svn Checkout,可加代理進行check。
另一種就是export to github,然后再github上下載,我選擇第二種方式下載。
2、運行make編譯word2vec工具:(如果其中makefile文件后有.txt后綴,將其去掉)在當前目錄下執行make進行編譯,生成可執行文件(編譯過程中報出很出Warning,暫且不管);
3、運行示例腳本:./demo-word.sh 看一下./demo-word.sh的內容,大致執行了3步操作
- 從http://mattmahoney.net/dc/text8.zip 下載了一個文件text8 ( 一個解壓后不到100M的txt文件,可自己下載並解壓放到同級目錄下);
- 使用文件text8進行訓練,訓練過程比較長;
- 執行word2vec生成詞向量到 vectors.bin文件中,(速度比較快,幾分鍾的事情)
在demo-word.sh中有如下命令
運行結果如圖:
time ./word2vec -train text8 -output vectors.bin -cbow 1 -size 200 -window 8 -negative 0 -hs 1 -sample 1e-4 -threads 20 -binary 1 -iter 15
以上命令
-train text8 表示的是輸入文件是text8
-output vectors.bin 輸出文件是vectors.bin
-cbow 1 表示使用cbow模型,默認為Skip-Gram模型
-size 200 每個單詞的向量維度是200
-window 8 訓練的窗口大小為5就是考慮一個詞前八個和后八個詞語(實際代碼中還有一個隨機選窗口的過程,窗口大小小於等於8)
-negative 0 -hs 1不使用NEG方法,使用HS方法。-
sampe指的是采樣的閾值,如果一個詞語在訓練樣本中出現的頻率越大,那么就越會被采樣。
-binary為1指的是結果二進制存儲,為0是普通存儲(普通存儲的時候是可以打開看到詞語和對應的向量的)
-iter 15 迭代次數
demo-word.sh中最后一行命令是./distance vectors.bin
該命令是計算距離的命令,可計算與每個詞最接近的詞了:
word2vec還有幾個參數對我們比較有用比如-alpha設置學習速率,默認的為0.025. –min-count設置最低頻率,默認是5,如果一個詞語在文檔中出現的次數小於5,那么就會丟棄。-classes設置聚類個數,看了一下源碼用的是k-means聚類的方法。要注意-threads 20 線程數也會對結果產生影響。
- 架構:skip-gram(慢、對罕見字有利)vs CBOW(快)
- 訓練算法:分層softmax(對罕見字有利)vs 負采樣(對常見詞和低緯向量有利)
- 欠采樣頻繁詞:可以提高結果的准確性和速度(適用范圍1e-3到1e-5)
- 文本(window)大小:skip-gram通常在10附近,CBOW通常在5附近
4、運行命令 ./demo-phrases.sh
:查看該腳本內容,主要執行以下步驟:
- 從http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2012.en.shuffled.gz 下載了一個文件news.2012.en.shuffled.gz ( 一個解壓到1.7G的txt文件,可自己下載並解壓放到同級目錄下);
- 將文件中的內容拆分成 phrases,然后執行./word2vec生成短語向量到 vectors-phrase.bin文件中(數據量大,速度慢,將近半個小時),如下:
最后一行命令./distance vectors-phrase.bin
,一個計算word相似度的demo中去,結果如下:
結果好壞跟訓練詞庫有關。
番外:
如果需要中文語料庫,推薦使用維基的或者搜狗(http://www.sogou.com/labs/dl/ca.html),中文分詞可使用結巴分詞,我覺得很好用。然后進行訓練,因為英文不用分詞,所以上述過程不涉及分詞。
本文主要偏應用,講解一個例子,便於對word2vec有一個初步了解,后續再更原理。