四種計算文本相似度的方法對比
來自專欄論智
作者:Yves Peirsman
編譯:Bing
編者按:本文作者為Yves Peirsman,是NLP領域的專家。在這篇博文中,作者比較了各種計算句子相似度的方法,並了解它們是如何操作的。詞嵌入(word embeddings)已經在自然語言處理領域廣泛使用,它可以讓我們輕易地計算兩個詞語之間的語義相似性,或者找出與目標詞語最相似的詞語。然而,人們關注更多的是兩個句子或者短文之間的相似度。如果你對代碼感興趣,文中附有講解細節的Jupyter Notebook地址。以下是論智的編譯。
許多NLP應用需要計算兩段短文之間的相似性。例如,搜索引擎需要建模,估計一份文本與提問問題之間的關聯度,其中涉及到的並不只是看文字是否有重疊。與之相似的,類似Quora之類的問答網站也有這項需求,他們需要判斷某一問題是否之前已出現過。要判斷這類的文本相似性,首先要對兩個短文本進行embedding,然後計算二者之間的餘弦相似度(cosine similarity)。儘管word2vec和GloVe等詞嵌入已經成為尋找單詞間語義相似度的標準方法,但是對於句子嵌入應如何倍計算仍存在不同的聲音。接下來,我們將回顧一下幾種最常用的方法,並比較它們之間的性能。
數據
我們將在兩個被廣泛使用的數據集上測試所有相似度計算方法,同時還與人類的判斷作對比。兩個數據集分別是:
- STS基準收集了2012年至2017年國際語義評測SemEval中所有的英語數據
- SICK資料庫包含了10000對英語句子,其中的標籤說明了它們之間的語義關聯和邏輯關係
下面的表格是STS數據集中的幾個例子。可以看到,兩句話之間的語義關係通常非常微小。例如第四個例子:
A man is playing a harp.
A man is playing a keyboard.
通過判斷,兩句話之間「非常不相似」,儘管它們的句法結構相同,並且其中的詞嵌入也類似。
相似度檢測方法
用於計算兩句子間語義相似度的方法非常廣泛,下面是常見的幾種方法。
基準方法
估計兩句子間語義相似度最簡單的方法就是求句子中所有單詞詞嵌入的平均值,然後計算兩句子詞嵌入之間的餘弦相似性。很顯然,這種簡單的基準方法會帶來很多變數。我們將研究,如果忽略終止詞並用TF-IDF計算平均權重會帶來怎樣的影響。
詞移距離
替代上述基準方法的其中一種有趣方法就是詞移距離(Word Mover』s Distance)。詞移距離使用兩文本間的詞嵌入,測量其中一文本中的單詞在語義空間中移動到另一文本單詞所需要的最短距離。
Smooth Inverse Frequency
從語義上來講,求一句話中詞嵌入的平均值似乎給與不相關的單詞太多權重了。而Smooth Inverse Frequency試著用兩種方法解決這一問題:
- 加權:就像上文用的TF-IDF,SIF取句中詞嵌入的平均權重。每個詞嵌入都由a/(a + p(w))進行加權,其中a的值經常被設置為0.01,而p(w)是詞語在語料中預計出現的頻率。
- 常見元素刪除:接下來,SIF計算了句子的嵌入中最重要的元素。然後它減去這些句子嵌入中的主要成分。這就可以刪除與頻率和句法有關的變數,他們和語義的聯繫不大。
最後,SIF使一些不重要的詞語的權重下降,例如but、just等,同時保留對語義貢獻較大的信息。
預訓練編碼器
上述兩種方法都有兩個重要的特徵。首先,作為簡單的詞袋方法,它們並不考慮單詞的順序。其次,它們使用的詞嵌入是在一種無監督方法中學習到的。這兩種特點都有潛在的威脅。由於不同的詞語順序會有不同的意思(例如「the dog bites the man」和「the man bites the dog」),我們想讓句子的嵌入對這一變化有所反饋。另外,監督訓練可以更直接地幫助句子嵌入學習到句意。
於是就出現了預訓練編碼器。預訓練的句子編碼器的目的是充當word2vec和GloVe的作用,但是對於句子嵌入來說:它們生成的嵌入可以用在多種應用中,例如文本分類、近似文本檢測等等。一般來說,編碼器在許多監督和非監督的任務中訓練,目的就是能盡量多地獲取通用語義信息。目前已經有好幾款這樣的編碼器了,我們以InferSent和谷歌語句編碼器為例。
InferSent是由Facebook研發的預訓練編碼器,它是一個擁有最大池化的BiLSTM,在SNLI數據集上訓練,該數據集含有57萬英語句子對,所有句子都屬於三個類別的其中一種:推導關係、矛盾關係、中立關係。
為了與Facebook競爭,谷歌也推出了自己的語句編碼器,它有兩種形式:
- 其中一種高級模型,採用的是變換過的模型編碼子圖生成的語境感知詞所表示的元素總和。
- 另一種是簡單一些的深度平均網路(DAN),其中輸入的單詞和雙字元的嵌入相加求平均數,並經過一個前饋深層神經網路。
基於變換的模型的結果更好,但是在書寫的時候,只有基於DAN的編碼器可用。與InferSent不同,谷歌的橘子編碼器是在監督數據和非監督數據上共同訓練的。
結果
我們在SICK和STS數據集上測試了上述所有方法,得出句子對之間的相似度,並與人類判斷相比較。
基準方法
儘管他們很簡潔,在平均詞嵌入之間求餘弦相似性的基準方法表現得非常好。但是,前提仍要滿足一些條件:
- 簡單word2vec嵌入比GloVe嵌入表現的好
- 在用word2vec時,尚不清楚使用停用詞表或TF-IDF加權是否更有幫助。在STS上,有時有用;在SICK上沒用。僅計算未加權的所有word2vec嵌入平均值表現得很好。
- 在使用GloVe時,停用詞列表對於達到好的效果非常重要。利用TF-IDF加權沒有幫助。
詞移距離
基於我們的結果,好像沒有什麼使用詞移距離的必要了,因為上述方法表現得已經很好了。只有在STS-TEST上,而且只有在有停止詞列表的情況下,詞移距離才能和簡單基準方法一較高下。
Smooth Inverse Frequency
SIF是在測試中表現最穩定的方法。在SICK數據集上,它的表現和簡單基準方法差不多,但是在STS數據集上明顯超過了它們。注意,在帶有word2vec詞嵌入的SIF和帶有GloVe詞嵌入的SIF之間有一些差別,這種差別很顯著,它顯示了SIF的加權和去除常用元素後減少的非信息噪音。
預訓練編碼器
預訓練編碼器的情況比較複雜。但是我們的結果顯示編碼器還不能完全利用訓練的成果。谷歌的句子編碼器看起來要比InferSent好一些,但是皮爾森相關係數的結果與SIF的差別不大。
而斯皮爾曼相關係數的效果更直接。這也許表明,谷歌的句子編碼器更能了解到句子的正確順序,但是無法分辨其中的差別。
結論
語句相似度是一個複雜現象,一句話的含義並不僅僅取決於當中的詞語,而且還依賴於它們的組合方式。正如開頭我們舉的那個例子(harp和keyboard),語義相似度有好幾種維度,句子可能在其中一種維度上相似,而在其他維度上有差異。目前的句子嵌入方法也只做到了表面。通常我們在皮爾森相關係數(Pearson correlation)上進行測試,除了有些情況下斯皮爾曼相關係數(Spearman correlation)會有不一樣的結果。
所以,如果你想計算句子相似度,你會選擇哪種方法呢?我們的建議如下:
- word2vec比GloVe的選擇更保險
- 雖然句子中無加權的平均詞嵌入是簡單的基準做法,但是Smooth Inverse Frequency是更強有力的選擇
- 如果你可以用預訓練編碼器,選擇谷歌的那款吧。但是要記住它的表現可能不會總是那麼驚艷。
原文地址:nlp.town/blog/sentence-similarity/
GitHub地址:github.com/nlptown/sentence-similarity/blob/master/Simple%20Sentence%20Similarity.ipynb
推薦閱讀:
※《Semi-supervised Multitask Learning for Sequence Labeling》閱讀筆記
※第五章 自然語言處理系統的模型與測試
※TextGAN 代碼閱讀筆記
※2018.3.26論文推薦
※高效CNN推理庫、多款AlphaGo實現…你們喜歡的Github項目精選又來了!