word2vec使用說明(google工具包)

word2vec使用說明


轉自:http://jacoxu.com/?p=1084。javascript

 

Google的word2vec官網:https://code.google.com/p/word2vec/php

下載下來的Demo源碼文件共有以下幾個: word2vec – Revision 41: /trunk … LICENSE //Apache LICENSE README.txt //工具使用說明 compute-accuracy.c demo-analogy.sh  // demo-classes.sh  //詞聚類的示例腳本 demo-phrase-accuracy.sh demo-phrases.sh  // demo-train-big-model-v1.sh demo-word-accuracy.sh demo-word.sh distance.c makefile questions-phrases.txt questions-words.txt word-analogy.c word2phrase.c word2vec.ccss

【快速入門】:1. 從http://word2vec.googlecode.com/svn/trunk/ 下載全部相關代碼(全部的文件如上); 2. 運行make編譯word2vec工具:Makefile的編譯代碼在makefile.txt文件中,先更名makefile.txt 爲Makefile,而後在當前目錄下執行make進行編譯,生成可執行文件(編譯過程當中報出很出Warning,暫且無論); 3. 運行示例腳本:./demo-word.sh 和 ./demo-phrases.sh:看一下./demo-word.sh的內容,大體執行了3步操做 a). 從http://mattmahoney.net/dc/text8.zip 下載了一個文件text8 ( 一個解壓後不到100M的txt文件,可本身下載並解壓放到同級目錄下), b). 執行word2vec生成詞向量到 vectors.bin文件中,(速度比較快,幾分鐘的事情)html

2.將分好詞的訓練語料進行訓練,假定我語料名稱爲test.txt且在word2vec目錄中。輸入命令: ./word2vec -train text8 -output vectors.bin -cbow 0 -size 48 -window 5 -negative 0 -hs 1 -sample 1e-4 -threads 20 -binary 1 -iter 100 以上命令 -train text8 表示的是輸入文件是text8,-output vectors.bin 輸出文件是vectors.bin,-cbow 0表示不使用cbow模型,默認爲Skip-Gram模型。-size 48 每一個單詞的向量維度是48,-window 5 訓練的窗口大小爲5就是考慮一個詞前五個和後五個詞語(實際代碼中還有一個隨機選窗口的過程,窗口大小小於等於5)。-negative 0 -hs 1不使用NEG方法,使用HS方法。-sampe指的是採樣的閾值,若是一個詞語在訓練樣本中出現的頻率越大,那麼就越會被採樣。-binary爲1指的是結果二進制存儲,爲0是普通存儲(普通存儲的時候是能夠打開看到詞語和對應的向量的)除了以上命令中的參數,word2vec還有幾個參數對咱們比較有用好比-alpha設置學習速率,默認的爲0.025. –min-count設置最低頻率,默認是5,若是一個詞語在文檔中出現的次數小於5,那麼就會丟棄。-classes設置聚類個數,看了一下源碼用的是k-means聚類的方法。要注意-threads 20 線程數也會對結果產生影響。 注意:–min-count設置最低頻率,默認是5,進行參數傳遞無效,咱們多是由於參數名中有-,唉咱們只好在程序word2vec.c中將min-count初始化爲1了。java

· 架構:skip-gram(慢、對罕見字有利)vs CBOW(快) · 訓練算法:分層softmax(對罕見字有利)vs 負採樣(對常見詞和低緯向量有利) · 欠採樣頻繁詞:能夠提升結果的準確性和速度(適用範圍1e-3到1e-5) · 文本(window)大小:skip-gram一般在10附近,CBOW一般在5附近 [root@localhost /home/jacoxu/word2vec]$./demo-word.sh make: Nothing to be done for `all’. Starting training using file text8 Vocab size: 71291 Words in train file: 16718843 Alpha: 0.000560 Progress: 98.88% Words/thread/sec: -117.11k c). 執行./distance vectors.bin能夠進入一個計算word類似度的demo中去,以下: ========中斷======== 52 if (ch == ‘\n’) { 53 strcpy(word, (char *)」");python

148 // Sort the vocabulary and keep at the first position 149 qsort(&vocab[1], vocab_size – 1, sizeof(struct vocab_word), VocabCompare); —- 看代碼,應該是\n這個詞,並且特地排在第一位了 ==================== 對於訓練出來的模型進行操做,我推薦你們使用http://blog.csdn.net/zhaoxinfan/article/details/11640573這個java版本的模型讀取類,比較方便。能夠參照:http://blog.csdn.net/jj12345jj198999/article/details/11069485 Enter word or sentence (EXIT to break): chinajquery

Word: china Position in vocabulary: 486linux

Word Cosine distance (找到了不少和china共現度很高的詞彙,能夠獲得承認) ———————————————————————— taiwan 0.656181 japan 0.633499 tibet 0.607813 manchuria 0.581230 hainan 0.561931 xiamen 0.555860 chongqing 0.550099 jiang 0.549195 chinese 0.548320 liao 0.548220 … Enter word or sentence (EXIT to break): hongkongandroid

Word: hongkong Position in vocabulary: 24623ios

Word Cosine distance(感受效果很糟糕,有些不知所云,承認度很低,主要仍是由於語料太少,覆蓋面窄) ———————————————————————— jardines 0.708792 matheson 0.659444 jardine 0.611295 shareholding 0.489012 company 0.431918 kowloon 0.417640 firm 0.415780 venture 0.415077 plc 0.409350 shanghai 0.404716 … 而後看一下./demo-phrases.sh的內容,也大體執行了3步操做: a). 從http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2012.en.shuffled.gz 下載了一個文件news.2012.en.shuffled.gz ( 一個解壓到1.7G的txt文件,可本身下載並解壓放到同級目錄下); b). 將文件中的內容拆分紅 phrases,而後執行./word2vec生成短語向量到 vectors-phrase.bin文件中(數據量大,速度慢,將近半個小時),以下: [root@localhost /home/jacoxu/word2vec]$ bash demo-phrases.sh (總耗時75分鐘) make: Nothing to be done for `all’. Starting training using file news.2012.en.shuffled-norm0 Words processed: 296900K Vocab size: 33198K Vocab size (unigrams + bigrams): 18838711 Words in train file: 296901342 Words written: 296900K real 11m1.465s user 10m47.888s sys 0m8.317s Starting training using file news.2012.en.shuffled-norm0-phrase0 Words processed: 280500K Vocab size: 38761K Vocab size (unigrams + bigrams): 21728781 Words in train file: 280513979 Words written: 280500K real 10m43.277s user 10m29.983s sys 0m8.137s Starting training using file news.2012.en.shuffled-norm1-phrase1 Vocab size: 681320 Words in train file: 283545447 Alpha: 0.000005 Progress: 100.00% Words/thread/sec: 83.67k real 49m3.925s user 847m21.369s sys 1m11.140s

c). 執行./distance vectors-phrase.bin 能夠進入一個計算word類似度的demo中去,以下: Enter word or sentence (EXIT to break): great_wall

Word: great_wall Position in vocabulary: 36052

Word Cosine distance (確實找到一些極爲相關的詞彙) ———————————————————————— mutianyu 0.588232 terra_cotta_warriors 0.541900 forbidden_city 0.527797 changsha 0.520975 based_koryo_tours 0.510810 three_gorges 0.509765 world’s_tallest 0.501899 dajie 0.500128 ming_dynasty 0.496112 qin_shihuang 0.486954 …

Enter word or sentence (EXIT to break): hong_kong

Word: hong_kong Position in vocabulary: 2322

Word Cosine distance (並無任何體現Hong Kong本土的詞彙,還是語料的問題) ———————————————————————— singapore 0.755051 mainland_china 0.739481 shanghai 0.732764 hong_kong’s 0.727834 mainland_chinese 0.652696 singapore’s 0.636082 keith_bradsher_contributed_reporting 0.626221 hang_seng_index_fell 0.621854 chinese 0.617985 taipei 0.609921 …

【其餘】:Java版本Word2Vector

詞向量的訓練最經典的有 3 個工做,C&W 200八、M&H 200八、Mikolov 2010,看看其餘幾個版本的Word Embedding: (如下大部份內容摘自Zhao老闆的學生licstar) 1. 【C&W 的 SENNA – 2008】 ■ 訓練語料及規模:English Wikipedia + Reuters RCV1 共 631M + 221M 詞; ■ 詞向量:130000 詞,50 維; ■ 特色:不區分大小寫,通過有監督修正,訓練了7周; ■ 資源:測試代碼、詞向量 [連接]

Ronan Collobert 和 Jason Weston 在 2008 年的 ICML 上發表的《A Unified Architecture for Natural Language Processing: Deep Neural Networks with Multitask Learning》裏面首次介紹了他們提出的詞向量的計算方法,他們還把論文所寫的系統開源了,叫作 SENNA,3500 多行純 C 代碼也是寫得很是清晰。C&W 這篇論文主要目的並非在於生成一份好的詞向量,甚至不想訓練語言模型,而是要用這份詞向量去完成 NLP 裏面的各類任務,好比詞性標註、命名實體識別、短語識別、語義角色標註等等。

2. 【M&H 的 HLBL – 2007】 Andriy Mnih 和 Geoffrey Hinton 在 2007 年和 2008 年各發表了一篇關於訓練語言模型和詞向量的文章。2007 年發表在 ICML 上的《Three new graphical models for statistical language modelling》代表了 Hinton 將 Deep Learning 戰場擴展到 NLP 領域的決心。2008 年發表在 NIPS 上的《A scalable hierarchical distributed language model》則提出了一種層級的思想替換了 Bengio 2003 方法中最後隱藏層到輸出層最花時間的矩陣乘法,在保證效果的基礎上,同時也提高了速度。2008 年 NIPS 的這篇論文,介紹的是「hierarchical log-bilinear」模型,不少論文中都把它稱做簡稱「HLBL」。

3. 【Mikolov 的 RNNLM – 2010】 ■ 訓練語料及規模:Broadcast news; ■ 詞向量:82390 詞,80、640、1600 維; ■ 特色:不區分大小寫;訓練了若干天; ■ 資源:訓練、測試代碼、詞向量 [連接]

Bengio 2003 在論文裏提到一句,可使用一些方法下降參數個數,好比用循環神經網絡。Mikolov 就抓住了這個坑,今後與循環神經網絡結下了不解之緣。他最先用循環神經網絡作語言模型是在 INTERSPEECH 2010 上發表的《Recurrent neural network based language model》裏。Recurrent neural network 是循環神經網絡,簡稱 RNN,還有個 Recursive neural networks 是遞歸神經網絡(Richard Socher 藉此發了一大堆論文),也簡稱 RNN。看到的時候須要注意區分一下。不過到目前爲止,RNNLM 只表示循環神經網絡作的語言模型,尚未歧義。 在以後的幾年中,Mikolov 在一直在RNNLM 上作各類改進,有速度上的,也有準確率上的。如今想了解 RNNLM,看他的博士論文《Statistical Language Models based on Neural Networks》確定是最好的選擇。

4. 【Huang 的語義強化 – 2012】 ■ 訓練語料及規模:English Wikipedia; ■ 詞向量:100232 詞,50 維; ■ 特色:不區分大小寫,最高頻的6000詞,每詞有10種表示; ■ 資源:訓練、測試代碼、詞向量 [連接]

與前幾位大牛的工做不一樣,Eric H. Huang 的工做是在 C&W 的基礎上改進而成的,並不是自成一派從頭作起。他這篇發表在 ACL 2012 上的《Improving Word Representations via Global Context and Multiple Word Prototypes》試圖經過對模型的改進,使得詞向量富含更豐富的語義信息。他在文中提出了兩個主要創新來完成這一目標:(其實從論文標題就能看出來)第一個創新是使用全文信息輔助已有的局部信息,第二個創新是使用多個詞向量來表示多義詞。 Huang 認爲 C&W 的工做只利用了「局部上下文(Local Context)」。C&W 在訓練詞向量的時候,只使用了上下文各 5 個詞,算上本身總共有 11 個詞的信息,這些局部的信息還不能充分挖掘出中間詞的語義信息。Huang 直接使用 C&W 的網絡結構計算出一個得分,做爲「局部得分」。 而後 Huang 提出了一個「全局信息」,這有點相似傳統的詞袋子模型。詞袋子模型是把文章中全部詞的 One-hot Representation 加起來,造成一個向量(就像把詞全都扔進一個袋子裏),用來表示文章。Huang 的全局模型是將文章中全部詞的詞向量求個加權平均(權重是詞的 idf),做爲文章的語義。他把文章的語義向量和當前詞的詞向量拼接起來,造成一個兩倍長度的向量做爲輸入,以後仍是用 C&W 的網絡結構算出一個打分。 有了 C&W 方法的獲得的「局部得分」,再加上在 C&W 方法基礎上改造獲得的「全局得分」,Huang 直接把兩個得分相加,做爲最終得分。最終得分使用 C&W 提出的 pair-wise 目標函數來優化。 加了這個全局信息有什麼用處呢?Huang 在實驗中發現,他的模型能更好地捕捉詞的語義信息。好比 C&W 的模型中,與 markets 最相近的詞爲 firms、industries;而 Huang 的模型獲得的結果是 market、firms。很明顯,C&W 的方法因爲只考慮了臨近詞的信息,最後的結果是詞法特徵最相近的詞排在了前面(都是複數形式)。不過我以爲這個多是英語纔有的現象,中文沒有詞形變化,若是在中文中作一樣的實驗還不知道會有什麼效果。 Huang 論文的第二個貢獻是將多義詞用多個詞向量來表示。Bengio 2003 在最後提過這是一個重要的問題,不過當時他還在想辦法解決,如今 Huang 給出了一種思路。 將每一個詞的上下文各 5 個詞拿出來,對這 10 個詞的詞向量作加權平均(一樣使用 idf 做爲權重)。對全部獲得的上下文向量作 k-means 聚類,根據聚類結果給每一個詞打上標籤(不一樣類中的同一個詞,看成不一樣的詞處理),最後從新訓練詞向量。 固然這個實驗的效果也是很不錯的,最後 star 的某一個表示最接近的詞是 movie、film;另外一個表示最接近的詞是 galaxy、planet。

5. 【Turian 對比試驗 – 2010】 優化C&W代碼並重跑試驗 ■ 訓練語料及規模:Reuters RCV1 63M 詞; ■ 詞向量:268810 詞 2五、50、100、200 維; ■ 特色:區分大小寫,訓練了若干周; ■ 資源:訓練代碼、詞向量 [連接]

由M幫忙重跑M&H ■ 訓練語料及規模:Reuters RCV1; ■ 詞向量:246122 詞 50、100 維; ■ 特色:區分大小寫,用GPU訓練了7天; ■ 資源:訓練代碼、詞向量 [連接]

問題?主頁上提供了 兩份 詞向量,一份是 scaled,一份是unscaled,scaled的做用是什麼?這個Scale貌似是全局的,而非單個向量的。 README.text中是這麼解釋的: embeddings-scaled.*.txt.gz Embeddings scaled by 0.1/stddev(embeddings), as described in the ACL 2010 paper. These are the embeddings you should use by default, if you just want word features. The first column is the word, the rest of the columns are the dimensions of the embedding. 也就是說經過stddev進行了一個全局的樣本標準誤差進行縮放;

Turian 的工做前面只是提了一下,他在作 C&W 向量與 H&M 向量的對比實驗時,本身按照論文從新實現了一遍他們的方法,並公佈了詞向量。後來 C&W 在主頁上強調了一下:儘管不少論文把 Turian 實現的結果叫作 C&W 向量,可是與我發佈的詞向量是不一樣的,我這個在更大的語料上訓練,還花了兩個月時間呢! Turian 公佈的 M&H 向量是直接請 Andriy Mnih 在 Turian 作好的語料上運行了一下 HLBL,因此沒有代碼公佈。同時 Turian 本身實現了一份 LBL模型,可是沒有公佈訓練出來的詞向量。(這是根據他主頁上描述推測的結果,從 Turian 的論文中看,他應該是實現了 HLBL 算法而且算出詞向量的。) RCV1 的詞數兩篇文章中所寫的數據差距較大,還不知道是什麼緣由。

Turian 發表在 ACL 2010 上的實驗對比了 C&W 向量與 M&H 向量用做輔助特徵時的效果。在短語識別和命名實體識別兩個任務中,C&W 向量的效果都有略微的優點。同時他也發現,若是將這兩種向量融合起來,會有更好的效果。除了這兩種詞向量,Turian 還使用 Brown Cluster 做爲輔助特徵作了對比,效果最好的實際上是 Brown Cluster,不過這個已經超出本文的範圍了。

【值得一讀】: 1. What are the continuous bag of words and skip-gram architectures 2. Hierarchical Softmax & Negative Sampling 3. word2vec 中的數學原理詳解 4. Deep Learning in NLP (一)詞向量和語言模型:http://licstar.net/archives/328

【問題語料訓練實例】

1. 蒐集語料

StackOverflow語料下載train.zip https://www.kaggle.com/c/predict-closed-questions-on-stack-overflow/ 進行處理,獲得content內容和title標題做爲訓練語料

2. 利用word2vec進行訓練,採用和官網提供的300維Vector一樣的訓練模型:

-cbow 1 -size 300 -window 5 -negative 3 -hs 0 -sample 1e-5 -threads 12 -binary 1 -iter 15

(注:默認的低頻下限是5,因爲當前版本(word2vec42)程序有bug,緣由不太清楚,若是初始化失敗,則到word2vec.c文件中修改此值)

475630606個words, vocab 大小爲1598580,大概花費25分鐘。

運行結果並測試效果以下:

  1. [root@linux-237 word2vec42]# bash demo-word.sh    
  2. make: Nothing to be done for `all’.   
  3. Starting training using file stackText.txt   
  4. Vocab size: 1598580   
  5. Words in train file: 475630606   
  6. Alpha: 0.000263  Progress: 99.47%  Words/thread/sec: 541.23k     
  7. real    25m39.774s   
  8. user    221m57.108s   
  9. sys     0m49.199s   
  10. Enter word or sentence (EXIT to break): java   
  11.   
  12. Word: java  Position in vocabulary: 454   
  13.   
  14.                                               Word       Cosine distance   
  15. ————————————————————————   
  16.                                               Java              0.804742   
  17.                                              java,              0.780371   
  18.                                              java.              0.775374   
  19.                                               JAVA              0.743753   
  20.                                              Java.              0.683836   
  21.                                              swing              0.674023   
  22.                                            android              0.672503   
  23.                                                c++              0.668149   
  24.                                                 c#              0.644594   
  25.                                             python              0.643520   
  26.                                            eclipse              0.643359   
  27.                                              Java,              0.637573   
  28.                                              java?              0.630209   
  29.                                                jar              0.628616   
  30.                                             groovy              0.627132   
  31.                                              scala              0.611233   
  32.                                            servlet              0.610064   
  33.                                             applet              0.608627   
  34.                                                php              0.608549   
  35.                                                  i              0.600868   
  36.                                                 my              0.599664   
  37.                                                jsp              0.598296   
  38.                                               ruby              0.597236   
  39.                                           netbeans              0.595057   
  40.                                                  a              0.595011   
  41.                                              write              0.594350   
  42.                                            program              0.593679   
  43.                                                jdk              0.593030   
  44.                                               j2me              0.587537   
  45.                                              which              0.585925   
  46.                                                 to              0.585683   
  47.                                              using              0.580617   
  48.                                               that              0.579790   
  49.                                            written              0.579572   
  50.                                               some              0.579534   
  51.                                           android,              0.577219   
  52.                                                and              0.575742   
  53.                                               .net              0.575061   
  54.                                                web              0.574278   
  55.                                              linux              0.573493   
  56. Enter word or sentence (EXIT to break): html   
  57.   
  58. Word: html  Position in vocabulary: 394   
  59.   
  60.                                               Word       Cosine distance   
  61. ————————————————————————   
  62.                                               HTML              0.853783   
  63.                                              html.              0.836931   
  64.                                              html,              0.795768   
  65.                                         javascript              0.763503   
  66.                                              HTML.              0.721012   
  67.                                                 js              0.715835   
  68.                                            webpage              0.711215   
  69.                                              HTML,              0.700154   
  70.                                            content              0.694945   
  71.                                             markup              0.691843   
  72.                                               Html              0.686390   
  73.                                                css              0.683201   
  74.                                               tags              0.676316   
  75.                                        javascript,              0.676179   
  76.                                              xhtml              0.674844   
  77.                                        javascript.              0.674052   
  78.                                                php              0.673596   
  79.                                               text              0.673089   
  80.                                               page              0.663661   
  81.                                                xml              0.662498   
  82.                                             iframe              0.661740   
  83.                                             jquery              0.652209   
  84.                                                tag              0.651575   
  85.                                           webpage,              0.647792   
  86.                                           content,              0.644945   
  87.                                              .html              0.641437   
  88.                                               aspx              0.638099   
  89.                                               ajax              0.637875   
  90.                                              html?              0.633876   
  91.                                                jsp              0.631024   
  92.                                              tags,              0.624686   
  93.                                           textarea              0.624658   
  94.                                           webpage.              0.624080   
  95.                                                pdf              0.622019   
  96.                                              page,              0.620723   
  97.                                           contents              0.617092   
  98.                                                 JS              0.615214   
  99.                                              text,              0.613630   
  100.                                               form              0.613238   
  101.                                               css.              0.612103   
  102. Enter word or sentence (EXIT to break): android   
  103.   
  104. Word: android  Position in vocabulary: 495   
  105.   
  106.                                               Word       Cosine distance   
  107. ————————————————————————   
  108.                                            Android              0.857668   
  109.                                           android.              0.814769   
  110.                                           android,              0.810972   
  111.                                             iphone              0.744005   
  112.                                         blackberry              0.719089   
  113.                                           Android.              0.718010   
  114.                                           androids              0.693840   
  115.                                           Android,              0.687129   
  116.                                           emulator              0.680624   
  117.                                               java              0.672503   
  118.                                           android?              0.664975   
  119.                                             phone.              0.661444   
  120.                                         Blackberry              0.658390   
  121.                                            andriod              0.653750   
  122.                                          android’s              0.648015   
  123.                                           phonegap              0.641884   
  124.                                          emulator.              0.640713   
  125.                                             iPhone              0.639118   
  126.                                                ios              0.639108   
  127.                                             tablet              0.636023   
  128.                                             Iphone              0.635636   
  129.                                               j2me              0.632937   
  130.                                              phone              0.630827   
  131.                                             mobile              0.624277   
  132.                                             device              0.621280   
  133.                                                apk              0.619061   
  134.                                             phone,              0.611067   
  135.                                                ICS              0.610646   
  136.                                             adroid              0.606088   
  137.                                          emulator,              0.604733   
  138.                                           activity              0.603200   
  139.                                                2.2              0.602148   
  140.                                            eclipse              0.599507   
  141.                                          Honeycomb              0.597581   
  142.                                            device.              0.597449   
  143.                                                IOS              0.597157   
  144.                                          honeycomb              0.596399   
  145.                                            iphone.              0.595373   
  146.                                                sdk              0.592870   
  147.                                                iOS              0.591931  

參考:https://groups.google.com/forum/#!topic/word2vec-toolkit/lxbl_MB29Ic  Tomas Mikolov 用了9個小時進行訓練WIKI數據。

./word2vec -train train100B.txt -read-vocab voc -output vectors.bin -cbow 1 -size 300 -window 5 -negative 3 -hs 0 -sample 1e-5 -threads 12 -binary 1 -min-count 10

除了上面的語料,Tomas Mikolov,在他的word2vec主頁上還提供了WIKI語料的連接,以及XML文件預處理的批文件。 使用方式爲:perl wikifil.pl enwik9 > text  (下載地址:http://mattmahoney.net/dc/textdata.html)

相關文章
相關標籤/搜索