word2vec安裝使用筆記

word2vec 入門基礎

基本概念

word2vec是Google在2013年開源的一個工具,核心思想是將詞表徵映 射爲對應的實數向量。

目前採用的模型有以下兩種

  • CBOW(Continuous Bag-Of-Words,即連續的詞袋模型)
  • Skip-Gram

項目鏈接:https://code.google.com/archive/p/word2vec

背景知識

詞向量

詞向量就是用來將語言中的詞進行數學化的一種方式,顧名思義,詞向量就是把一個詞表示成一個向量。這樣做的初衷就是機器只認識0 1 符號,換句話說,在自然語言處理中,要想讓機器識別語言,就需要將自然語言抽象表示成可被機器理解的方式。所以,詞向量是自然語言到機器語言的轉換。

詞向量有一下兩種

    One-hot Representation

向量的長度爲詞典的大小,向量的分量只有一個 1,其他全爲 0, 1 的位置對應該詞在詞典中的位置,例如

“話筒”表示爲 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …]
“麥克”表示爲 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]
優點: 如果使用稀疏方式存儲,非常簡潔,實現時就可以用0,1,2,3,…來表示詞語進行計算,這樣“話筒”就爲3,“麥克”爲8.
缺點

  1. 容易受維數災難的困擾,尤其是將其用於 Deep Learning 的一些算法時;
  2. 任何兩個詞都是孤立的,存在語義鴻溝詞(任意兩個詞之間都是孤立的,不能體現詞和詞之間的關係)。
    Distributional Representation

最早是 Hinton 於 1986 年提出的,可以克服 one-hot representation的缺點。解決“詞彙鴻溝”問題,可以通過計算向量之間的距離(歐式距離、餘弦距離等)來體現詞與詞的相似性。其基本想法是直接用一個普通的向量表示一個詞,這種向量一般長成這個樣子:[0.792, −0.177, −0.107, 0.109, −0.542, …],常見維度50或100。

優點:解決“詞彙鴻溝”問題;
缺點:訓練有難度。沒有直接的模型可訓練得到。所以採用通過訓練語言模型的同時,得到詞向量
當然一個詞怎麼表示成這麼樣的一個向量是要經過一番訓練的,訓練方法較多,word2vec是其中一種。值得注意的是,每個詞在不同的語料庫和不同的訓練方法下,得到的詞向量可能是不一樣的。

詞向量在機器翻譯領域的一個應用就是google的TomasMikolov團隊開發了一種詞典和術語表的自動生成技術,該技術通過向量空間,把一種語言轉變成另一種語言,實驗中對英語和西班牙語間的翻譯準確率高達90%。
論文http://arxiv.org/pdf/1309.4168.pdf在介紹算法工作原理的時候舉了一個例子:考慮英語和西班牙語兩種語言,通過訓練分別得到它們對應的詞向量空間ES 。從英語中取出五個單詞one,two,three,four,five,設其在E 中對應的詞向量分別爲 v1,v2,v3,v4,v5,爲方便作圖,利用主成分分析(PCA)降維,得到相應的二維向量 u1,u2,u3,u4,u5,在二維平面上將這五個點描出來,如下圖左圖所示。類似地,在西班牙語中取出(與 one,two,three,four,five 對應的) uno,dos,tres,cuatro,cinco,設其在S 中對應的詞向量分別爲 s1,s2,s3,s4,s5,用 PCA 降維後的二維向量分別爲 t1,t2,t3,t4,t5,將它們在二維平面上描出來(可能還需作適當的旋轉),如下圖右圖所示:


觀察左、右兩幅圖,容易發現:五個詞在兩個向量空間中的相對位置差不多,這說明兩種不同語言對應向量空間的結構之間具有相似性,從而進一步說明了在詞向量空間中利用距離刻畫詞之間相似性的合理性。

語言模型

語言模型其實就是看一句話是不是正常人說出來的。意義在於機器翻譯、語音識別得到若干候選之後,可以利用語言模型挑一個儘量靠譜的結果。在NLP的其它任務裏也都能用到。用數學符號描述爲:給定一個字符串w1,w2,,wt 計算它是自然語言的概率P(w1,w2,,wt)w1wT 依次表示這句話中的各個詞。有個很簡單的推論是:

p(s)=p(w1,w2,,wt)=p(w1)p(w2|w1)p(w3|w1,w2)p(wn|w1,w2,,wT1)

上面概率公式的意義爲:第一次詞確定後,看後面的詞在前面次出現的情況下出現的概率。
例如,有個句子“大家喜歡吃蘋果”,一共四個詞:大家,喜歡,吃,蘋果
P (大家,喜歡,吃,蘋果)=p (大家)p (喜歡|大家)p (吃|大家,喜歡)p (蘋果|大家,喜歡,吃);
  • p(大家)表示“大家”這個詞在語料庫裏面出現的概率;
  • p(喜歡|大家)表示“喜歡”這個詞出現在“大家”後面的概率;
  • p(吃|大家,喜歡)表示“吃”這個詞出現在“大家喜歡”後面的概率;
  • p(蘋果|大家,喜歡,吃)表示“蘋果”這個詞出現在“大家喜歡吃”後面的概率。

把這些概率連乘起來,得到的就是這句話平時出現的概率。
如果這個概率特別低,說明這句話不常出現,那麼就不算是一句自然語言,因爲在語料庫裏面很少出現。如果出現的概率高,就說明是一句自然語言。 爲了表示簡單,上面的公式用下面的方式表示:

p(s)=p(w1,w2,,wt)=i=1T (p(wi)|Contexti)

其中,如果Contexti是空的話,就是它自己p(w) ,另外如“吃”的Context就是“大家”、“喜歡”,其餘的對號入座。
現有模型有
  • N-gram模型
  • N-pos模型
  • Bengio的NNLM
  • C&W 的 SENNA
  • M&H 的 HLBL
  • Mikolov 的 RNNLM
  • Huang 的語義強化

N-gram 模型

接下來說p(wi|Contexti) 的計算方法,上面看的是跟據這句話裏面的所有詞來計算,這樣計算就很複雜,像上面那個例子得掃描四次語料庫,這樣一句話有多少個詞就得掃描多少趟。語料庫一般都比較大,越大的語料庫越能提供準確的判斷。這樣計算開銷太大。
可以想到的優化方法就是提前將p(wi|Contexti) 提前算好了,對於一個只有四個詞的語料庫,總共就有4!+3!+2!+1!個情況要計算,那就是24個情況要計算;換成1000個詞的語料庫,就是1000i=1i! 個情況需要統計,對於計算機來說,這根本不可能。
所以誕生了N -gram 模型,該模型是大詞彙連續語音識別中常用的一種語言模型,對中文而言,我們稱之爲漢語語言模型(CLM, Chinese Language Model)。漢語語言模型利用上下文中相鄰詞間的搭配信息,在需要把連續無空格的拼音、筆畫,或代表字母或筆畫的數字,轉換成漢字串(即句子)時,可以計算出最大概率的句子,從而實現到漢字的自動轉換,無需用戶手動選擇,避開了許多漢字對應一個相同的拼音(或筆畫串、數字串)的重碼問題。
我們給定一個詞,然後猜測下一個詞是什麼。當我說“豔照門”這個詞時,你想到的下一個詞時什麼?我想大家很有可能會想到“陳冠希”,基本上不會有人想到“陳志傑”吧。N -gram 模型的主要思想就是這樣的。
上面的context都是這句話中這個詞前面的所有詞作爲條件的概率,N -gram 就是隻管這個詞前面的n-1個詞,加上它自己,總共n個詞,計算p(wi|Contexti) 只考慮用這n個詞來算,換成數學的公式來表示,就是

p(wi|Contexti)=p(wi|win+1,win+2,,wi1)

一般來說,n取2或者3
假設詞表中詞的個數 |V| = 20,000 詞,那麼有下面的一些數據。
這裏寫圖片描述
照圖中的數據看去,取n=3是目前計算能力的上限了。在實踐中用的最多的就是bigramtrigram 了,而且效果也基本夠了。
如果一個詞的出現僅依賴於它前面出現的一個詞,那麼我們就稱之爲bigram。即
P(T)=P(W1W2W3Wn)=P(W1)P(W2|W1)P(W3|W1W2)P(Wn|W1W2Wn1)P(W1)P(W2|W1)P(W3|W2)P(Wn|Wn1)

如果一個詞的出現僅依賴於它前面出現的兩個詞,那麼我們就稱之爲trigram
那麼我們怎麼得到P(Wn|W1W2Wn1) 呢?P(Wn|W1W2Wn1)=P(W1W2Wn)P(W1W2Wn1)
下面我們用bigram 舉個例子。假設語料庫總詞數爲13,748



===P(IwanttoeatChinesefood)P(I)P(want|I)P(to|want)P(eat|to)P(Chinese|eat)P(food|Chinese)0.25×1087/3437×786/1215×860/3256×19/938×120/2130.000154171

N -gram 模型也會有寫問題,總結如下:
  • n不能取太大,取大了語料庫經常不足,所以基本是用降級的方法
  • 無法建模出詞之間的相似度,就是有兩個詞經常出現在同一個context後面,但是模型是沒法體現這個相似性的。
  • 有些n元組(n個詞的組合,跟順序有關的)在語料庫裏面沒有出現過,對應出來的條件概率就是0,這樣一整句話的概率都是0了,這是不對的,解決的方法主要是兩種:平滑法(基本上是分子分母都加一個數)和回退法(利用n-1的元組的概率去代替n元組的概率)
    該博文主要是前段時間學習word2vec的一個總結,大部分都是網上資料,主要是做了個整理。算是做個備份,方便以後複習之類的。在此感謝前輩們的資料~~~

word2vec安裝使用

安裝

http://word2vec.googlecode.com/svn/trunk/ 下載所有相關代碼,下載下來之後是 .tar.gz文件,使用如下圖中的解壓縮命令解壓: tar -xzvf word2vec-2014-10-29.tar.gz, 解壓過程如圖所示。

這裏寫圖片描述

解壓之後生成文件w2v,如下圖:

這裏寫圖片描述

cd到truck目錄下,該目錄下的文件如下圖:

這裏寫圖片描述

在當前目錄下執行make進行編譯,生成可執行文件。

這裏寫圖片描述

編譯之後的目錄下的文件如下圖:

這裏寫圖片描述

使用

訓練自帶的text8

http://mattmahoney.net/dc/text8.zip下載訓練數據test8.zip。下載完成之後將該文件放在trunk目錄下。此時可以vi demo word.sh查看下這個文件中的內容,其中的腳本如下:

這裏寫圖片描述

因爲已經編譯和下載了text8數據集了,所以可以刪除相應的代碼(1,2,3,4行)

只保留:
time ./word2vec -train text8 -output vectors.bin -cbow 1 -size 200 -window 8 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1 ./distance vectors.bin

運行這個名爲demo-word.sh的文件就可以開始使用word2vec在數據集text8上進行訓練得到詞向量。

以上命令的參數作用如下:

  • -train text8 表示的是輸入文件是text8
  • -output vectors.bin 輸出文件是vectors.bin
  • -cbow 1 表示使用cbow模型,默認爲Skip-Gram模型
  • -size 200 每個單詞的向量維度是200
  • -window 8 訓練的窗口大小爲8就是考慮一個詞前八個和後八個詞語(實際代碼中還有一個隨機選窗口的過程,窗口大小小於等於8)
  • -negative 0 -hs 1不使用NEG方法,使用HS方法。
  • -binary 1指的是結果二進制存儲,爲0是普通存儲(普通存儲的時候是可以打開看到詞語和對應的向量的)
  • -iter 15 迭代次數

訓練的過程大概幾分鐘:

這裏寫圖片描述

因爲腳本demo-word.sh中最後一行命令是 ./distance vectors.bin,所以在詞向量化完之後我們可以計算與給定詞比較接近的詞,例如這個時候我們輸入china 會得到如下的結果(需要注意的是隻要bin文件可以查看詞語之間的相似性,如果得到的txt文件則不可以,這個可以通過-binary來設置):

這裏寫圖片描述

或者查看與education 距離相近的詞:

這裏寫圖片描述

當然還可以使如下的命令來得到txt文件,這樣我們就可以查看到每一個詞的詞向量

time ./word2vec -train text8 -output vectors.txt -cbow 1 -size 100 -windows 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 0 -iter 15
查看text8中的詞向量:(以下顯示的是many,who,new,used的向量化結果)

這裏寫圖片描述

此外,word2vec還有幾個參數對我們比較有用比如:

  • -alpha 設置學習速率,默認的爲0.025.
  • -min-count 設置最低頻率,默認是5,如果一個詞語在文檔中出現的次數小於5,那麼就會丟棄。
  • -classes 100設置聚類個數爲100,使用的方法是k-means。
  • -threads 20 線程數也會對結果產生影響。

  • 架構:skip-gram(慢、對罕見字有利)vs CBOW(快)

  • 訓練算法:分層softmax(對罕見字有利)vs 負採樣(對常見詞和低緯向量有利)
  • 欠採樣頻繁詞:可以提高結果的準確性和速度(適用範圍1e-3到1e-5)
  • 文本(window)大小:skip-gram通常在10附近,CBOW通常在5附近

同樣可以運行命令 ./demo-phrases.sh :查看該腳本內容,主要執行以下步驟:

  1. http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2012.en.shuffled.gz 下載了一個文件news.2012.en.shuffled.gz ( 一個解壓到1.7G的txt文件,可自己下載並解壓放到同級目錄下);
  2. 將文件中的內容拆分成 phrases,然後執行./word2vec生成短語向量到 vectors-phrase.bin文件中, 最後一行命令 ./distance vectors-phrase.bin ,計算word相似度

訓練wiki_chinese_preprocessed.simplied.txt數據集

wiki_chinese_preprocessed.simplied.txt數據內容如下(已經分詞):

這裏寫圖片描述

wiki_chinese_preprocessed.simplied.txt進行向量化,然後將結果聚爲100類。每一個詞的維度爲100。

./word2vec -train wiki_chinese_preprocessed.simplied.txt -output wiki_chinese_classes.txt -cbow 0 -size 100 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -classes 100

對聚類的結果按照類別排序.

sort wiki_chinese_classes.txt -k 2 -n > classes.sorted.txt

參考

發佈了109 篇原創文章 · 獲贊 102 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章