詞嵌入在NLP領域已經很流行了,它可以讓我們很簡單地計算兩個單詞的相似度,或者去找到一個目標詞最相似的詞,然而,我們對兩個長的句子或短文本相似度更感興趣。在這篇博客中,我們比較最流行的方法計算句子相似度,研究他們的表現.代碼鏈接
很多NLP應用需要計算短文本在語義層面的相似度。比如搜索引擎,需要對文檔的關聯性建模去查找,而不是根據句子的重疊單詞。問答網站,比如quora,需要去決定一 個問題是否之前已經被問過,這種類型的語義相似度經常通常先得到兩個短文本的embedding,然后計算他們的余弦相似度,盡管word2vec和glove已經變成標准的單詞相似度計算方法了,但是目前仍然沒有一致的意見在句子embedding計算的問題上,接下來,我們會回顧一些最流行的方法並比較他們的表現在兩個已經建立的基准線上。
數據集
我們會評估所有的方法在兩個廣泛使用的數據集上和人類的相似度判斷能力。
- STS Benchmark 在 句子相似度任務在2012-2017
- SICK data 包涵10000個英語句子對,標注了它們的語義相關性和蘊含關系
基准線
最簡單的方法去計算語義相似度是計算兩個句子中所有詞向量的平均,然后計算兩個向量的cosine,很明顯,這種baseline留出了很大的改進空間,我們將研究去除停用詞的影響,和計算tf-idf加權平均值。
Word Mover Distance
一個有趣的替代基准線就是單詞移動距離 --詞向量的歐式距離
平滑逆頻率
從語義上來講,采用單詞詞詞向量的平均值容易給不相關單詞太多的權重。平滑逆頻率嘗試解決這個問題從兩個方面:
- 每個詞的權重被加權a/(a + p(w)) a是一個參數被設置為0.01,p(w)是一個估計的頻率
- 常見成分的去除,SIF計算出句子中結果向量的重要成分,然后減去這些句子中他們在第一個主成分方向的投影。這樣可以消除那些從語義上將不相關的詞。
總之,SIF降低不重要詞的權重,保留重要的信息。
預訓練編碼器
所有上述的方法都擁有兩個重要的特點。首先,作為詞袋模型,他們沒有考慮到詞序。其次,他們使用的詞嵌入已經被學習通過詞嵌入的方式。這兩個特點都是潛在存在問題的。因為不同的詞序往往帶來不同的句意。比如,狗咬人和人咬狗有不同的意思,我們應該讓我們的句向量體現出這種變化。另外,監督學習可以幫句子可以幫助句子向量更好的學到句子的含義。
這就是預訓練編碼器的用武之地。
- facebook 的InferSent:它是一個BiLSTM加max pooling,訓練在57萬個句子對上,標簽是三種關系:蘊含,矛盾,中立。
- 谷歌:transformer模型 DAN
結論
句子相似度是一個復雜的現象,句子的意思不僅取決於它包含的單詞,還依賴於他們組織的方式。句子相似問題可能有幾個維度,句子可能在一個維度相似,另外的維度相反,當前的句嵌入方法可能只觸及了其表面。
經驗:
- word2vec 可能比glove更安全。
- SIF更好
- 選用谷歌 的句子編碼器更好