幾種句子表示方法的比較
- 2019 年 10 月 7 日
- 筆記
最近發現了一個有趣的nlp網站:nlp-town,有很多不錯的部落格文章,也有一些nlpnotebook程式碼。我覺得非常值得入門者看看。在本篇文章中,我們摘取了其中一篇部落格《Comparing Sentence Similarity Methods》中的精華,簡單介紹一下各種句子表示方法。喜歡速食的小夥伴請直接看文末的結論。
一、句子表示及其相似度計算有哪些應用呢?
- 搜索引擎
- 基於Q-A對的對話機器人
- quora知乎重複問題識別
等等
二、常見的句子向量的表示方法有哪些?
非監督學習的句子表示
1. 句子中所有詞的向量之和的平均值
- 這種方法過於粗暴,改進的辦法有1)忽略stopwords 2)使用tf-idf對辭彙進行加權
2. WDM (Word Mover's Distance)
如下圖所示,該相似度定義為document_1中辭彙與document_2對應辭彙的『travel』代價,這裡可以簡單理解為travel距離之和。

3. SIF (Smooth Inverse Frequency)
- 類似於tf-idf對於高頻出現的辭彙降權,得到句子表示
- 與tf-idf不同的是,SIF對一組句子組成的詞向量矩陣A,求A的最大特徵值對應的特徵向量V,然後將句子表示減去該編碼在該特徵向量上的投影,從而得到句子向量
- 這樣做的目的是為了降低詞頻和句法對語義的影響
- 總之,SIF能夠降低just,but等辭彙的權重,保留那些對句子語義有用的辭彙。
有監督學習的句子表示
這裡考察了兩個方法:Facebook的InferSent和Google的Sentence Encoder。
1. Facebook的InferSent
- 基於BiLSTM模型, 使用了SNLI數據集進行訓練,包含57萬個句子對,有三個類別標籤:entailment(蘊含), contradiction(對立)和 neutral(中立)。
2. Google Sentence Encoder的兩種形式:
- 1)基於transformer模型,根據上下文相關的詞向量表示進行求和來表示句子的向量
- 2)使用Deep Averaging Network (DAN),即 unigram和bigram的向量都要經過一個feed-forward 神經網路的編碼
ps: 基於transformer的Google Sentence Encoder效果好於DAN,但因為Google並未開放基於transformer的Sentence Encoder,所以本文中僅僅使用了基於DAN的句子向量編碼。Google Sentence Encodere與Facebbok InferSent不同,Google不僅使用了labeled的句子,也結合了無標籤數據訓練得到的詞向量。
三、測試數據
作者使用了兩個學術界常用的數據集進行評測,都是經過人工標註的。
1. STS Benchmark:SemEval句子相似度測評比賽(2012-2017),如下圖所示
2. SICK data:包含1萬個英文句子對。

四、句子相似度衡量標準
本文僅採用了cosine相似度來衡量句子相似度
五、實驗結果
實驗結果圖例橫坐標中的DEV表示驗證集,TEST表示測試集。
實驗1:詞向量平均或加權平均

圖中左下角方法介紹:
- AVG-W2V: 保留stopwords,對句子中的word2vec詞向量求平均
- AVG-W2V-STOP: 除去stopwords,對句子中的word2vec詞向量求平均 – AVG-GLOVE-TFIDF-STOP:除去stopwords,使用tf-idf作為權重對句子中的Glove詞向量加權求均值
小結論:
1. word2vec詞向量的效果普遍優於glove
2. 是否保留stopwords,是否使用tf-idf進行加權 對於實驗結果影響不大,STS數據集上,刪除stopwords並使用tf-idf加權有效果,SICK數據集上則沒有什麼效果。也就是說,這些技巧在某些數據集上的表現還不如簡單的word2vec的簡單平均。
3. 使用glove詞向量時,想要得到好的效果,最好刪除stopwords。
實驗2:考察WMD與詞向量平均

小結論:
- WMD普遍效果比較差,僅有少數情況優於簡單的詞向量平均,不建議使用
實驗3:SIF與詞向量平均

小結論:
1. SIF的表現最為穩定
2. STS數據集上SIF-word2vec遠超詞向量平均
3. SIF-Word2vec的表現明顯強於SIF-glove(這裡拋出一個問題:word2vec與glove有什麼區別,為什麼glove的效果普遍比較差?)
4.SIF的加權和特徵向量的刪除,有效降低了無用辭彙所帶來的雜訊,使得模型表現非常穩定。
實驗4:InferSent、GSE與詞向量平均

小結論:
1. Google Sentence Encoder(GSE)在測試集上的表現優於Facebook的方法,也優於詞向量平均的方法。
2. 使用皮爾遜相關係數對句子表示進行分析,可以發現GSE與SIF的相關度比較高(ps:使用皮爾遜相關係數需要滿足的三個條件:連續數據,正態分布,線性關係)
3. 作者認為詞向量的表示並非連續數據且不一定滿足正太分布,所以採用皮爾遜相關係數並不合適,所以採用了spearman相關係數,結果發現GSE與SIF的相關度比較低
六、結論
句子表示及句子對的相似度計算是一個非常大且非常複雜的研究課題。本文僅僅在Sck和STS兩個數據集上,基於cosine similarity,簡單探討了常見的幾種句子表示方法的異同,得出了如下結論:
1. word2vec效果比glove更好
2. 詞向量的平均作為句子表示的效果還不錯,SIF with word2vec效果會更好一些。
3. Google's Sentence Encoder的句子表示效果更好一些,但並不會給模型帶來非常顯著的提升。
實驗結果匯總如下:

七、參考文獻
- SIF: A Simple but Tough-to-Beat Baseline for Sentence Embeddings
- WMD: From Word Embeddings To Document Distances
- GSE: Universal Sentence Encoder
- InferSent: facebookresearch/InferSent