比較句子相似度方法

比較句子相似度方法

原文:http://nlp.town/blog/sentence-similarity/
轉載:https://zhuanlan.zhihu.com/p/37104535

編者按:本文作者為Yves Peirsman,是NLP領域的專家。在這篇博文中,作者比較了各種計算句子相似度的方法,并了解它們是如何操作的。詞嵌入(word embeddings)已經在自然語言處理領域廣泛使用,它可以讓我們輕易地計算兩個詞語之間的語義相似性,或者找出與目標詞語最相似的詞語。然而,人們關注更多的是兩個句子或者短文之間的相似度。如果你對代碼感興趣,文中附有講解細節的Jupyter Notebook地址。以下是論智的編譯。

許多NLP應用需要計算兩段短文之間的相似性。例如,搜索引擎需要建模,估計一份文本與提問問題之間的關聯度,其中涉及到的并不只是看文字是否有重疊。與之相似的,類似 Quora 之類的問答網站也有這項需求,他們需要判斷某一問題是否之前已出現過。要判斷這類的文本相似性,首先要對兩個短文本進行 embedding ,然后計算二者之間的余弦相似度(cosine similarity)。盡管 word2vecGloVe 等詞嵌入已經成為尋找單詞間語義相似度的標準方法,但是對于句子嵌入應如何倍計算仍存在不同的聲音。接下來,我們將回顧一下幾種最常用的方法,并比較它們之間的性能。

nlu-embed

數據

我們將在兩個被廣泛使用的數據集上測試所有相似度計算方法,同時還與人類的判斷作對比。兩個數據集分別是:

  • STS基準收集了2012年至2017年國際語義評測SemEval中所有的英語數據
  • SICK數據庫包含了10000對英語句子,其中的標簽說明了它們之間的語義關聯和邏輯關系

下面的表格是STS數據集中的幾個例子。可以看到,兩句話之間的語義關系通常非常微小。例如第四個例子

A man is playing a harp.
A man is playing a keyboard.

通過判斷,兩句話之間“非常不相似”,盡管它們的句法結構相同,并且其中的詞嵌入也類似。

image.png

相似度方法

有很多方法可以計算兩個句子之間的意思相似度。在這里,我們看一下最常見的那些。

基準方法

估計兩句子間語義相似度最簡單的方法就是求句子中所有單詞詞嵌入的平均值,然后計算兩句子詞嵌入之間的余弦相似性。很顯然,這種簡單的基準方法會帶來很多變數。我們將研究,如果忽略終止詞并用TF-IDF計算平均權重會帶來怎樣的影響。

詞移距離

nlu-word-distance

替代上述基準方法的其中一種有趣方法就是詞移距離(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 manthe man bites the dog ),我們想讓句子的嵌入對這一變化有所反饋。另外,監督訓練可以更直接地幫助句子嵌入學習到句意。

于是就出現了預訓練編碼器。預訓練的句子編碼器的目的是充當 word2vecGloVe 的作用,但是對于句子嵌入來說:它們生成的嵌入可以用在多種應用中,例如文本分類、近似文本檢測等等。一般來說,編碼器在許多監督和非監督的任務中訓練,目的就是能盡量多地獲取通用語義信息。目前已經有好幾款這樣的編碼器了,我們以 InferSent谷歌語句編碼器 為例。

image.png

InferSent是由Facebook研發的預訓練編碼器,它是一個擁有最大池化的BiLSTM,在SNLI數據集上訓練,該數據集含有57萬英語句子對,所有句子都屬于三個類別的其中一種:推導關系、矛盾關系、中立關系。

為了與Facebook競爭,谷歌也推出了自己的語句編碼器,它有兩種形式:

  • 其中一種高級模型,采用的是變換過的模型編碼子圖生成的語境感知詞所表示的元素總和。
  • 另一種是簡單一些的深度平均網絡(DAN),其中輸入的單詞和雙字符的嵌入相加求平均數,并經過一個前饋深層神經網絡。

基于變換的模型的結果更好,但是在書寫的時候,只有基于DAN的編碼器可用。與InferSent不同,谷歌的橘子編碼器是在監督數據和非監督數據上共同訓練的。

結果

我們在 SICKSTS數據集 上測試了上述所有方法,得出句子對之間的相似度,并與人類判斷相比較。

基準方法

盡管他們很簡潔,在平均詞嵌入之間求余弦相似性的基準方法表現得非常好。但是,前提仍要滿足一些條件:

  • 簡單 word2vec 嵌入比 GloVe 嵌入表現的好
  • 在用 word2vec 時,尚不清楚使用停用詞表或TF-IDF加權是否更有幫助。在STS上,有時有用;在SICK上沒用。僅計算未加權的所有word2vec嵌入平均值表現得很好。
  • 在使用GloVe時,停用詞列表對于達到好的效果非常重要。利用TF-IDF加權沒有幫助。
image.png

詞移距離

基于我們的結果,好像沒有什么使用詞移距離的必要了,因為上述方法表現得已經很好了。只有在STS-TEST上,而且只有在有停止詞列表的情況下,詞移距離才能和簡單基準方法一較高下。

image.png

Smooth Inverse Frequency

SIF是在測試中表現最穩定的方法。在SICK數據集上,它的表現和簡單基準方法差不多,但是在STS數據集上明顯超過了它們。注意,在帶有word2vec詞嵌入的SIF和帶有GloVe詞嵌入的SIF之間有一些差別,這種差別很顯著,它顯示了SIF的加權和去除常用元素后減少的非信息噪音。

image.png

預訓練編碼器

預訓練編碼器的情況比較復雜。但是我們的結果顯示編碼器還不能完全利用訓練的成果。谷歌的句子編碼器看起來要比InferSent好一些,但是皮爾森相關系數的結果與SIF的差別不大。

image.png

而斯皮爾曼相關系數的效果更直接。這也許表明,谷歌的句子編碼器更能了解到句子的正確順序,但是無法分辨其中的差別。

image.png

結論

語句相似度是一個復雜現象,一句話的含義并不僅僅取決于當中的詞語,而且還依賴于它們的組合方式。正如開頭我們舉的那個例子(harp和keyboard),語義相似度有好幾種維度,句子可能在其中一種維度上相似,而在其他維度上有差異。目前的句子嵌入方法也只做到了表面。通常我們在皮爾森相關系數(Pearson correlation)上進行測試,除了有些情況下斯皮爾曼相關系數(Spearman correlation)會有不一樣的結果。

image.png

所以,如果你想計算句子相似度,你會選擇哪種方法呢?我們的建議如下:

  • word2vecGloVe 的選擇更保險
  • 雖然句子中無加權的平均詞嵌入是簡單的基準做法,但是Smooth Inverse Frequency是更強有力的選擇
  • 如果你可以用預訓練編碼器,選擇谷歌的那款吧。但是要記住它的表現可能不會總是那么驚艷。

Google 編碼器

GitHub地址

github.com/nlptown/sentence-similarity/blob/master/Simple%20Sentence%20Similarity.ipynb

模型

https://tfhub.dev/google/universal-sentence-encoder-multilingual-large/3

Google Research(Universal Sentence Encoder): https://www.dazhuanlan.com/2019/11/21/5dd5876d6a9da/

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373