天天看點

word2vec詞向量訓練及中文文本相似度計算

本文是講述如何使用word2vec的基礎教程,文章比較基礎,希望對你有所幫助!

參考:《Word2vec的核心架構及其應用 · 熊富林,鄧怡豪,唐曉晟 · 北郵2015年》

          《Word2vec的工作原理及應用探究 · 周練 · 西安電子科技大學2014年》

          《Word2vec對中文詞進行聚類的研究 · 鄭文超,徐鵬 · 北京郵電大學2013年》

PS:第一部分主要是給大家引入基礎内容作鋪墊,這類文章很多,希望大家自己去學習更多更好的基礎内容,這篇部落客要是介紹Word2Vec對中文文本的用法。

(1) 統計語言模型

統計語言模型的一般形式是給定已知的一組詞,求解下一個詞的條件機率。形式如下:

word2vec詞向量訓練及中文文本相似度計算

統計語言模型的一般形式直覺、準确,n元模型中假設在不改變詞語在上下文中的順序前提下,距離相近的詞語關系越近,距離較遠的關聯度越遠,當距離足夠遠時,詞語之間則沒有關聯度。

但該模型沒有完全利用語料的資訊:

1) 沒有考慮距離更遠的詞語與目前詞的關系,即超出範圍n的詞被忽略了,而這兩者很可能有關系的。

例如,“華盛頓是美國的首都”是目前語句,隔了大于n個詞的地方又出現了“北京是中國的首都”,在n元模型中“華盛頓”和“北京”是沒有關系的,然而這兩個句子卻隐含了文法及語義關系,即”華盛頓“和“北京”都是名詞,并且分别是美國和中國的首都。

2) 忽略了詞語之間的相似性,即上述模型無法考慮詞語的文法關系。

例如,語料中的“魚在水中遊”應該能夠幫助我們産生“馬在草原上跑”這樣的句子,因為兩個句子中“魚”和“馬”、“水”和“草原”、“遊”和“跑”、“中”和“上”具有相同的文法特性。

而在神經網絡機率語言模型中,這兩種資訊将充分利用到。

(2) 神經網絡機率語言模型

神經網絡機率語言模型是一種新興的自然語言處理算法,該模型通過學習訓練語料擷取詞向量和機率密度函數,詞向量是多元實數向量,向量中包含了自然語言中的語義和文法關系,詞向量之間餘弦距離的大小代表了詞語之間關系的遠近,詞向量的加減運算則是計算機在"遣詞造句"。

神經網絡機率語言模型經曆了很長的發展階段,由Bengio等人2003年提出的神經網絡語言模型NNLM(Neural network language model)最為知名,以後的發展工作都參照此模型進行。曆經十餘年的研究,神經網絡機率語言模型有了很大發展。

如今在架構方面有比NNLM更簡單的CBOW模型、Skip-gram模型;其次在訓練方面,出現了Hierarchical Softmax算法、負采樣算法(Negative Sampling),以及為了減小頻繁詞對結果準确性和訓練速度的影響而引入的欠采樣(Subsumpling)技術。

word2vec詞向量訓練及中文文本相似度計算

上圖是基于三層神經網絡的自然語言估計模型NNLM(Neural Network Language Model)。NNLM可以計算某一個上下文的下一個詞為wi的機率,即(wi=i|context),詞向量是其訓練的副産物。NNLM根據語料庫C生成對應的詞彙表V。

近年來,神經網絡機率語言模型發展迅速,Word2vec是最新技術理論的合集。

Word2vec是Google公司在2013年開放的一款用于訓練詞向量的軟體工具。是以,在講述word2vec之前,先給大家介紹詞向量的概念。

(3) 詞向量

正如作者所說:Deep Learning 算法已經在圖像和音頻領域取得了驚人的成果,但是在 NLP 領域中尚未見到如此激動人心的結果。有一種說法是,語言(詞、句子、篇章等)屬于人類認知過程中産生的高層認知抽象實體,而語音和圖像屬于較為底層的原始輸入信号,是以後兩者更适合做deep learning來學習特征。

但是将詞用“詞向量”的方式表示可謂是将 Deep Learning 算法引入 NLP 領域的一個核心技術。自然語言了解問題轉化為機器學習問題的第一步都是通過一種方法把這些符号數學化。

詞向量具有良好的語義特性,是表示詞語特征的常用方式。詞向量的每一維的值代表一個具有一定的語義和文法上解釋的特征。故可以将詞向量的每一維稱為一個詞語特征。詞向量用Distributed Representation表示,一種低維實數向量。

例如,NLP中最直覺、最常用的詞表示方法是One-hot Representation。每個詞用一個很長的向量表示,向量的次元表示詞表大小,絕大多數是0,隻有一個次元是1,代表目前詞。

“話筒”表示為 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …] 即從0開始話筒記為3。

但這種One-hot Representation采用稀疏矩陣的方式表示詞,在解決某些任務時會造成維數災難,而使用低維的詞向量就很好的解決了該問題。同時從實踐上看,高維的特征如果要套用Deep Learning,其複雜度幾乎是難以接受的,是以低維的詞向量在這裡也飽受追捧。

Distributed Representation低維實數向量,如:[0.792, −0.177, −0.107, 0.109, −0.542, …]。它讓相似或相關的詞在距離上更加接近。

總之,Distributed Representation是一個稠密、低維的實數限量,它的每一維表示詞語的一個潛在特征,該特征捕獲了有用的句法和語義特征。其特點是将詞語的不同句法和語義特征分布到它的每一個次元上去表示。

(4) Word2vec

參考:Word2vec的核心架構及其應用 · 熊富林,鄧怡豪,唐曉晟 · 北郵2015年

Word2vec是Google公司在2013年開放的一款用于訓練詞向量的軟體工具。它根據給定的語料庫,通過優化後的訓練模型快速有效的将一個詞語表達成向量形式,其核心架構包括CBOW和Skip-gram。

在開始之前,引入模型複雜度,定義如下:

                                                      O = E * T * Q

其中,E表示訓練的次數,T表示訓練語料中詞的個數,Q因模型而異。E值不是我們關心的内容,T與訓練語料有關,其值越大模型就越準确,Q在下面講述具體模型是讨論。

NNLM模型是神經網絡機率語言模型的基礎模型。在NNLM模型中,從隐含層到輸出層的計算時主要影響訓練效率的地方,CBOW和Skip-gram模型考慮去掉隐含層。實踐證明新訓練的詞向量的精确度可能不如NNLM模型(具有隐含層),但可以通過增加訓練語料的方法來完善。

Word2vec包含兩種訓練模型,分别是CBOW和Skip_gram(輸入層、發射層、輸出層),如下圖所示:

word2vec詞向量訓練及中文文本相似度計算

CBOW模型:

了解為上下文決定目前詞出現的機率。在CBOW模型中,上下文所有的詞對目前詞出現機率的影響的權重是一樣的,是以叫CBOW(continuous bag-of-words model)模型。如在袋子中取詞,取出數量足夠的詞就可以了,至于取出的先後順序是無關緊要的。

Skip-gram模型:

Skip-gram模型是一個簡單實用的模型。為什麼會提出該問題呢?

在NLP中,語料的選取是一個相當重要的問題。

首先,語料必須充分。一方面詞典的詞量要足夠大,另一方面盡可能地包含反映詞語之間關系的句子,如“魚在水中遊”這種句式在語料中盡可能地多,模型才能學習到該句中的語義和文法關系,這和人類學習自然語言是一個道理,重複次數多了,也就會模型了。

其次,語料必須準确。所選取的語料能夠正确反映該語言的語義和文法關系。如中文的《人民日報》比較準确。但更多時候不是語料選取引發準确性問題,而是處理的方法。

由于視窗大小的限制,這會導緻超出視窗的詞語與目前詞之間的關系不能正确地反映到模型中,如果單純擴大視窗大小會增加訓練的複雜度。Skip-gram模型的提出很好解決了這些問題。

Skip-gram表示“跳過某些符号”。例如句子“中國足球踢得真是太爛了”有4個3元詞組,分别是“中國足球踢得”、“足球踢得真是”、“踢得真是太爛”、“真是太爛了”,句子的本意都是“中國足球太爛”,可是上面4個3元組并不能反映出這個資訊。

此時,使用Skip-gram模型允許某些詞被跳過,是以可組成“中國足球太爛”這個3元詞組。如果允許跳過2個詞,即2-Skip-gram,那麼上句話組成的3元詞組為:

word2vec詞向量訓練及中文文本相似度計算

由上表可知:一方面Skip-gram反映了句子的真實意思,在新組成的這18個3元詞組中,有8個詞組能夠正确反映例句中的真實意思;另一方面,擴大了語料,3元詞組由原來的4個擴充到了18個。

語料的擴充能夠提高訓練的準确度,獲得的詞向量更能反映真實的文本含義。

使用SVN Checkout源代碼,如下圖所示。

word2vec詞向量訓練及中文文本相似度計算
word2vec詞向量訓練及中文文本相似度計算

PS:最後附有word2vec源碼、三大百科語料、騰訊新聞語料和分詞python代碼。

中文語料可以參考我的文章,通過Python下載下傳百度百科、互動百科、維基百科的内容。

下載下傳結果如下圖所示,共300個國家,百度百科、互動百科、維基百科各自100個,對應的編号都是0001.txt~0100.txt,每個txt中包含一個實體(國家)的資訊。

word2vec詞向量訓練及中文文本相似度計算

然後再使用Jieba分詞工具對齊進行中文分詞和文檔合并。

上面隻顯示了對百度百科100個國家進行分詞的代碼,但核心代碼一樣。同時,如果需要對停用詞過濾或标點符号過濾可以自定義實作。

分詞合并後的結果為Result_Country.txt,相當于600行,每行對應一個分詞後的國家。

word2vec詞向量訓練及中文文本相似度計算

強烈推薦三篇大神介紹word2vec進行中文語料的文章,其中Felven好像是師兄。

因為word2vec需要linux環境,所有首先在windows下安裝linux環境模拟器,推薦cygwin。然後把語料Result_Country.txt放入word2vec目錄下,修改demo-word.sh檔案,該檔案預設情況下使用自帶的text8資料進行訓練,如果訓練資料不存在,則會進行下載下傳,因為需要使用自己的資料進行訓練,故注釋掉下載下傳代碼。

demo-word.sh檔案修改如下:

word2vec詞向量訓練及中文文本相似度計算

運作指令sh demo-word.sh,等待訓練完成。模型訓練完成之後,得到了vectors.bin這個詞向量檔案,可以直接運用。

word2vec詞向量訓練及中文文本相似度計算

通過訓練得到的詞向量我們可以進行相應的自然語言處理工作,比如求相似詞、關鍵詞聚類等。其中word2vec中提供了distance求詞的cosine相似度,并排序。也可以在訓練時,設定-classes參數來指定聚類的簇個數,使用kmeans進行聚類。

輸入阿富汗:喀布爾(首都)、坎大哈(主要城市)、吉爾吉斯斯坦、伊拉克等。

word2vec詞向量訓練及中文文本相似度計算

輸入國歌:

word2vec詞向量訓練及中文文本相似度計算

輸入首都:

word2vec詞向量訓練及中文文本相似度計算

輸入GDP:

word2vec詞向量訓練及中文文本相似度計算

最後希望文章對你有所幫助,主要是使用的方法。同時更多應用需要你自己去研究學習。

word2vec源碼、語料下載下傳位址: