天天看點

文本深度表示工具Word2Vec

Word2vec 是 Google 在 2013 年年中開源的一款将詞表征為實數值向量的高效工具,

其利用深度學習的思想,可以通過訓練,把對文本内容的處理簡化為 K

維向量空間中的向量運算,而向量空間上的相似度可以用來表示文本語義上的相似度。Word2vec輸出的詞向量可以被用來做很多 NLP

相關的工作,比如聚類、找同義詞、詞性分析等等。如果換個思路, 把詞當做特征,那麼Word2vec就可以把特征映射到 K

維向量空間,可以為文本資料尋求更加深層次的特征表示 。

Word2vec 使用的是 Distributed representation 的詞向量表示方式。Distributed representation

最早由 Hinton在 1986 年提出[4]。其基本思想是 通過訓練将每個詞映射成 K 維實數向量(K

一般為模型中的超參數),通過詞之間的距離(比如 cosine 相似度、歐氏距離等)來判斷它們之間的語義相似度.其采用一個

三層的神經網絡 ,輸入層-隐層-輸出層。有個核心的技術是 根據詞頻用Huffman編碼

,使得所有詞頻相似的詞隐藏層激活的内容基本一緻,出現頻率越高的詞語,他們激活的隐藏層數目越少,這樣有效的降低了計算的複雜度。而Word2vec大受歡迎的一個原因正是其高效性,Mikolov

在論文[2]中指出,一個優化的單機版本一天可訓練上千億詞。

這個三層神經網絡本身是 對語言模型進行模組化 ,但也同時 獲得一種單詞在向量空間上的表示

,而這個副作用才是Word2vec的真正目标。

與潛在語義分析(Latent Semantic Index, LSI)、潛在狄立克雷配置設定(Latent Dirichlet

Allocation,LDA)的經典過程相比,Word2vec利用了詞的上下文,語義資訊更加地豐富。

在伺服器上部署有Word2Vec系統,可以試試玩一玩

```

cd /home/liwei/word2vec/trunk

./demo-analogy.sh # Interesting properties of the word vectors (try apple red

mango / Paris France Italy)

./demo-phrases.sh # vector representation of larger pieces of text using the

word2phrase tool

./demo-phrase-accuracy.sh # measure quality of the word vectors

./demo-classes.sh # Word clustering

./distance GoogleNews-vectors-negative300.bin # Pre-trained word and phrase

vectors

./distance freebase-vectors-skipgram1000-en.bin # Pre-trained entity vectors

with Freebase naming

詳細使用方法見 https://code.google.com/p/word2vec

傳統的統計語言模型是表示語言基本機關(一般為句子)的機率分布函數,這個機率分布也就是該語言的生成模型。一般語言模型可以使用各個詞語條件機率的形式表示:

Word2vec采用的是階層化Log-Bilinear語言模型,其中一種是CBOW(Continuous

Bag-of-Words Model)模型,由上下文預測下一個詞為w_t的公式為:

CBOW的計算可以用 層次Softmax算法 ,這種算法結合了Huffman編碼,每個詞 w

都可以從樹的根結點root沿着唯一一條路徑被通路到,其路徑也就形成了其編碼code。假設 n(w, j)為這條路徑上的第 j 個結點,且

L(w)為這條路徑的長度, j 從 1 開始編碼,即 n(w, 1)=root,n(w, L(w)) = w。對于第 j 個結點,層次 Softmax

定義的Label 為 1 - code[j]。

取一個适當大小的視窗當做語境,輸入層讀入視窗内的詞,将它們的向量(K維,初始随機)加和在一起,形成隐藏層K個節點。輸出層是一個巨大的二叉樹,葉節點代表語料裡所有的詞(語料含有V個獨立的詞,則二叉樹有|V|個葉節點)。而這整顆二叉樹建構的算法就是Huffman樹。這樣,對于葉節點的每一個詞,就會有一個全局唯一的編碼,形如"010011",不妨記左子樹為1,右子樹為0。接下來,隐層的每一個節點都會跟二叉樹的内節點有連邊,于是對于二叉樹的每一個内節點都會有K條連邊,每條邊上也會有權值。

對于語料庫中的某個詞wt,對應着二叉樹的某個葉子節點,是以它必然有一個二進制編碼,如"010011"。在訓練階段,當給定上下文,要預測後面的詞wt的時候,我們就從二叉樹的根節點開始周遊,這裡的目标就是預測這個詞的二進制編号的每一位。即對于給定的上下文,我們的目标是使得預測詞的二進制編碼機率最大。形象地說,我們希望在根節點,詞向量和與根節點相連經過logistic計算得到bit=1的機率盡量接近0,在第二層,希望其bit=1的機率盡量接近1,這麼一直下去,我們把一路上計算得到的機率相乘,即得到目标詞wt在目前網絡下的機率P(wt),那麼對于目前這個sample的殘差就是1-P(w_t),于是就可以使用梯度下降法訓練這個網絡得到所有的參數值了。顯而易見,按照目标詞的二進制編碼計算到最後的機率值就是歸一化的。

Hierarchical

Softmax用Huffman編碼構造二叉樹,其實借助了分類問題中,使用一連串二分類近似多分類的思想。例如我們是把所有的詞都作為輸出,那麼“桔子”、“汽車”都是混在一起。給定wt的上下文,先讓模型判斷wt是不是名詞,再判斷是不是食物名,再判斷是不是水果,再判斷是不是“桔子”。

但是在訓練過程中,模型會賦予這些抽象的中間結點一個合适的向量,這個向量代表了它對應的所有子結點。因為真正的單詞公用了這些抽象結點的向量,是以Hierarchical

Softmax方法和原始問題并不是等價的,但是這種近似并不會顯著帶來性能上的損失同時又使得模型的求解規模顯著上升。

沒有使用這種二叉樹,而是直接從隐層直接計算每一個輸出的機率——即傳統的Softmax,就需要對|V|中的每一個詞都算一遍,這個過程時間複雜度是O(|V|)的。而使用了二叉樹(如Word2vec中的Huffman樹),其時間複雜度就降到了O(log2(|V|)),速度大大地加快了。

Word2Vec Homepage

https://code.google.com/p/word2vec/

Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation

of Word Representations in Vector Space. In Proceedings of Workshop at ICLR,

2013.

http://arxiv.org/pdf/1301.3781.pdf

Deep Learning實戰之word2vec

http://techblog.youdao.com/?p=915#LinkTarget_699

Deep Learning in NLP (一)詞向量和語言模型

http://licstar.net/archives/328

word2vec傻瓜剖析

http://xiaoquanzi.net/?p=156

利用中文資料跑Google開源項目word2vec

http://www.cnblogs.com/hebin/p/3507609.html

分詞工具ANSJ

https://github.com/ansjsun/ansj_seg

http://blog.csdn.net/zhaoxinfan/article/details/10403917

Word2vec在事件挖掘中的調研

http://blog.csdn.net/shuishiman/article/details/20769437#1536434-tsina-1-26292-66a1f5d8f89e9ad52626f6f40fdeadaa

使用word2vec訓練的模型,能夠很好的語義表述query,不需要query之間一定有字面交集。如:“特警15秒鐘内開槍擊倒5暴徒”和“車站事件"和”3.1昆明事件"有很強的語義關聯,這是 傳統的 tf-idf方法是達不到的。

而在醫療項目中,如診斷報告和檢查報告,短文本很常見,是以word2vec可能會達到很好的語義表征效果

如果能夠結合口腔醫院的語料,得到例如這樣的詞語相似度結果,甚至把傳統的TF/IDF特征表示映射到新的向量空間中,将是很有意義的

http://cikuapi.com/index.php?content=%E7%89%99%E5%91%A8%E7%82%8E