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.
缺點:
- 容易受維數災難的困擾,尤其是將其用於 Deep Learning 的一些算法時;
- 任何兩個詞都是孤立的,存在語義鴻溝詞(任意兩個詞之間都是孤立的,不能體現詞和詞之間的關係)。
-
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在介紹算法工作原理的時候舉了一個例子:考慮英語和西班牙語兩種語言,通過訓練分別得到它們對應的詞向量空間E 和S 。從英語中取出五個單詞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的其它任務裏也都能用到。用數學符號描述爲:給定一個字符串
上面概率公式的意義爲:第一次詞確定後,看後面的詞在前面次出現的情況下出現的概率。
例如,有個句子“大家喜歡吃蘋果”,一共四個詞:大家,喜歡,吃,蘋果
- p(大家)表示“大家”這個詞在語料庫裏面出現的概率;
- p(喜歡|大家)表示“喜歡”這個詞出現在“大家”後面的概率;
- p(吃|大家,喜歡)表示“吃”這個詞出現在“大家喜歡”後面的概率;
- p(蘋果|大家,喜歡,吃)表示“蘋果”這個詞出現在“大家喜歡吃”後面的概率。
把這些概率連乘起來,得到的就是這句話平時出現的概率。
如果這個概率特別低,說明這句話不常出現,那麼就不算是一句自然語言,因爲在語料庫裏面很少出現。如果出現的概率高,就說明是一句自然語言。 爲了表示簡單,上面的公式用下面的方式表示:
其中,如果Contexti是空的話,就是它自己
現有模型有
- N-gram模型
- N-pos模型
- Bengio的NNLM
- C&W 的 SENNA
- M&H 的 HLBL
- Mikolov 的 RNNLM
- Huang 的語義強化
N-gram 模型
接下來說
可以想到的優化方法就是提前將
所以誕生了
我們給定一個詞,然後猜測下一個詞是什麼。當我說“豔照門”這個詞時,你想到的下一個詞時什麼?我想大家很有可能會想到“陳冠希”,基本上不會有人想到“陳志傑”吧。
上面的context都是這句話中這個詞前面的所有詞作爲條件的概率,
一般來說,n取2或者3
假設詞表中詞的個數 |V| = 20,000 詞,那麼有下面的一些數據。
照圖中的數據看去,取n=3是目前計算能力的上限了。在實踐中用的最多的就是
如果一個詞的出現僅依賴於它前面出現的一個詞,那麼我們就稱之爲
如果一個詞的出現僅依賴於它前面出現的兩個詞,那麼我們就稱之爲
那麼我們怎麼得到
下面我們用
- 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行)
- make編譯,
- wget http://mattmahoney.net/dc/text8.zip下載,
- gzip -d text8.gz -f解壓,
只保留:
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,所以在詞向量化完之後我們可以計算與給定詞比較接近的詞,例如這個時候我們輸入
或者查看與
當然還可以使如下的命令來得到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 :查看該腳本內容,主要執行以下步驟:
- 從 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相似度
訓練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