用詞向量得句向量的無監督方法


       詞向量技術是NLP領域中一種基礎的技術,詞向量將一個詞語轉換為固定維度的向量,通過處理向量關系讓NLP中語義計算的任務得以實現。

       我們都知道句子是由一個個詞語組成的,詞向量技術只是將單個詞語轉成固定維度的向量,那么怎么得到多個詞語組成的句子的向量了?這是一個好問題,畢竟實際環境中需要處理的文本是一個個句子,而非一個個詞語。為了讓讀者了解用詞向量生成句向量的具體步驟,本文將介紹如下幾種詞向量生成句向量的無監督學習手段,它們分別是:累加法、平均法、TF-IDF加權平均法以及SIF嵌入法。

1 累加法

       累加法是得到句子向量最簡單的方法,假設有這樣一句文本:

There is no royal way to geometry.
——Euclid(歐幾里得)

       這句是古希臘著名數學家歐幾里得的名言,其中文意思是“通往幾何並沒有皇家大道”。NLP處理一段文本首先需要將一段文本進行去停用詞處理,英語中常見的停用詞有be動詞、介詞、連詞等,經過去停用詞處理后上述文本可得下面的詞語距離:

       {there, no, royal, way, geometry}
       本文采用相應的詞向量詞典(GoogleNews-vectors-negative300.bin)和python的gensim來得到詞向量,可得上述單詞的如下詞向量(本文篇幅有限,用5維的詞向量來演示)

詞語 詞向量
There [ 0.1, 0.2, 0.3, 0.4, 0.5]
No [ 0.2, 0.3, 0.4, 0.5, 0.6]
Royal [ 0.3, 0.4, 0.5, 0.6, 0.7 ]
Way [ 0.4, 0.5, 0.6, 0.7, 0.8 ]
Geometry [0.5, 0.6, 0.7, 0.8, 0.9]

       累加法的做法是將句子中所有非停用詞的詞向量疊加,如果句子有n個非停用詞,則句子的詞向量通過下面的手段獲得:

       Vsentence = Vword1 + Vword2 + …… + Vwordn

       根據此方法可以得到” There is no royal way to geometry.“ 的句子向量為:

       Vsentence = Vthere + Vno + Vroyal + Vway + Vgeometry

                     = [ 0.1, 0.2, 0.3, 0.4, 0.5] + [ 0.2, 0.3, 0.4, 0.5, 0.6] + … + [0.5, 0.6, 0.7, 0.8, 0.9]

                     = [1.5, 2.0, 2.5, 3.0, 3.5]

2 平均法

       平均法和累計法方法相似,同樣需要將一個句子中所有的非停用詞向量疊加起來,但最后需要加疊加起來向量處以非停用詞的個數。句子的詞向量通過下面的手段獲得:

       Vsentence = (Vword1 + Vword2 + …… + Vwordn) / n

       根據此方法可以得到” There is no royal way to geometry.“ 的句子向量為:

       Vsentence =( Vthere + Vno + Vroyal + Vway + Vgeometry) / 5

                     = ([ 0.1, 0.2, 0.3, 0.4, 0.5] + [ 0.2, 0.3, 0.4, 0.5, 0.6] + … + [0.5, 0.6, 0.7, 0.8, 0.9]) / 5

                     = [1.5, 2.0, 2.5, 3.0, 3.5] / 5

                     = [0.3, 0.4, 0.5, 0.6, 0.7]

3 TF-IDF加權平均法

       TF-IDF加權平均法需要利用到TF-IDF技術,TF-IDF技術是一種常用的文本處理技術。TF-IDF模型常用評估一個詞語對於一個文檔的重要程度,經常應用於搜索技術和信息檢索的領域。一個詞語TF-IDF值與它在文檔中出現頻數成正比,與它在語料庫中出現的頻率成反比。TF-IDF由TF詞頻(Term Frequency)和IDF逆向文件頻率(Inverse Document Frequency)相乘而得。對於詞語ti來說:

       其中ni,j是詞語ti在自己所處的文檔j中出現頻數,Σknk,j是文檔j中所有所有詞語對應數
之和,|D|表示訓練語料庫中文檔的總數,| j:ti∈dj|表示訓練語料庫中包含詞語ti的文檔總數。
另外值得注意的是,如果詞語ti不在語料庫中那么(1)式中| j:ti∈dj|為0,那么會導致IDFj中分母為0,則無法計算出IDFj值。所以需要改進為如下:

       TF-IDF加權法不僅需要得到句子中每個非停用詞的詞向量,還需要得到句子中每個非停用詞的TFIDF值。每個非停用詞的TF部分還好計算,IDF部分就要看用戶使用哪個語料庫,如果是做query檢索,那么IDF部分對應的語料庫就是所有query句子;如果是做文本自相似聚類,那么IDF部分對應的語料庫就是全體待分類句子。然后通過如下手段得到TF-IDF加權的的句子向量:

       Vsentence = TFIDFword1 * Vword1 + TFIDFword2 * Vword2 + …… + TFIDFwordn * Vwordn

       假設” There is no royal way to geometry.“ 是做query檢索,那么計算IT-IDF對應的語料庫就是全體query句子。若全體query句子一共有100個; 其中60個query句子含有詞語there, 65個query句子含有詞語no, 7個query句子含有詞語royal, 72個query句子含有詞語way, 9個quer句子y含有詞語geometry。那么這句話中每個非停用詞的TF-IDF數如下所示:

       There: 1/(1+1+1+1+1) * log(100/(1+60) = 0.098

       No: 1/(1+1+1+1+1) * log(100/(1+65) = 0.083

       Royal: 1/(1+1+1+1+1) * log(100/(1+7) = 0.505

       Way: 1/(1+1+1+1+1) * log(100/(1+72) = 0.629

       Geometry: 1/(1+1+1+1+1) * log(100/(1+9) = 0.460

       所以這句話的IT-IDF加權據向量為:

       Vsentence = TFIDFthere * Vthere + TFIDFno * Vno + …… + TFIDFgeometry * Vgeometry

                     =0.098[0.1,0.2,0.3,0.4,0.5]+0.083[0.2,0.3,0.4,0.5,0.6]+…+0.460*[0.5,0.6,0.7,0.8,0.9]

                     = [0.147, 0.166, 1.2625 , 1.887, 1.61]

4 ISF嵌入法

       ISF加權平均法和TF-IDF加權平均法類似,ISF加權計算來源於普林斯頓大學的論文A latent variable model approach to pmi-based word embeddings. ( https://openreview.net/forum?id=Sy K00v5xx),按照論文作者說法,此方法可以很好的根據每個詞詞向量得到整個句子的據向量。SIF嵌入法需要利用主成分分析和每個詞語的estimated probability, SIF嵌入法具體操作如下所示:


圖1 SIF句子向量嵌入生成
       首先整個算法的輸入有:        (1) 每個詞語的詞向量        (2) 語料庫中全體句子        (3) 可調參數a        (4) 每個詞語estimated probability

       整個算法的輸出為:
       一個句子向量

       算法的具體步驟是:
       (1) 得到初步句向量

       遍歷語料庫中每個句子,假設當前句子為s, 通過如下計算式子得到當前句子s的初步句向量:

\[\frac{{\rm{1}}}{{\left| s \right|}}\sum\nolimits_{w \in s} {\frac{a}{{a + p\left( w \right)}}{v_w}} \]

       即加權求平均的過程,每個詞語向量乘以系數a/(a+p(w)后疊加,最后疊加向量處以句子s中詞語的個數,對於可調參數a論文中作者使用0.001和0.0001兩個。P(w)是詞語在全體語料庫中unigram probability,即詞語w詞頻處以語料庫所有詞語詞頻之和。

       (2) 主成分計算
       全體初步句向量進行主成分分析,計算出全體初步句向量第一主成分u

       (3) 得到目標句向量
       通過如下計算時對初步句向量進行二次處理,得到目標句向量

       此論文作者也在Github上公開了源代碼,感興趣的讀者可以自行下載做實驗,Github代碼

小結

       本文主要介紹了四種無監督手段來根據詞向量生成一個句子的句向量,除了無監督手段外,實際環境中還有用到監督方法來生成一個句子向量,例如訓練一個CNN的文本分類器,取最后一個隱藏層的輸出作為句子向量,感興趣的讀者可以google來進一步學習。

參考文獻

       [1] Arora S, Liang Y, Ma T. A simple but tough-to-beat baseline for sentence embeddings[J]. 2016.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM