語義相似度(實踐篇)


這篇文章,專門講語義相似度問題。

先看場景:

scene(一):用戶通過大眾點評,線上約了餐館,就餐后在上面發表了很多評論,評論中涉及了大量的餐館的問題,比如菜品質量,酒店衛生,服務等等。現在需要抽取之中的要點,然后反饋給商家。

scene(二):KB_QA的兩個問題:①獲取question的語義表示②把語義表示轉換成知識圖譜的能夠理解的語言邏輯形式。無論是核心推導鏈還是向量建模,核心都是question和answer的語義相似度問題。

雖然學術界對於語義相似度問題,都說是熱點和難點,但是他到底難在哪里?今天有必要探討一下。首先,衡量兩個表達之間的相似度,是通過語義級別,而語義屬於認知層面,這給研究帶來帶來了很大的難度。因為目前的聯結主義,僅僅能解決語義表示,無法學習邏輯推理。其次,理解一句話或者一段話的語義,不是單純靠歸納總結能力,還需要借助外部知識,就是說這句話表達了什么樣的事件,這個事件可能會關聯到很多實體,關系,路徑。兩個句子之間的關系、路徑的交集一定程度上代表了語義的重合度。之前的研究,都是靠單純靠聯結主義,包括開頭的兩個場景,都是這個思路。

從算法角度來看的話,探索基於知識圖譜的非監督學習是一個方向,目前有學者在研究;另外一個就是監督學習了,主要是借助深度學習。目前大部分的相似度改進,仍然是后者,前者的難度,對於工業界來說,非常大。從工業界的角度來看,最簡單的相似度當然是元積了,比如著名的word2vector可以做詞級別的語義相似度。通過簡單的dot問題,確實能解決一些相似度問題,但是對於高精度的場景,實在是太粗糙了。如果單純運用聯結主義解決相似度的話,有3個問題需要解決:①語義表示的豐富性②語義的差異衡量③相似度的顆粒度問題。我想這是3個核心問題了。

以KB_QA作為切入點:場景是Ai第一要素,之前有很多人拋開場景研究相似度問題,比如用深度學習總結出語義表示后直接用元積或者cos,存在這種想法的人不在少數。這樣的研究,沒有任何意義。既然涉及到相似度,一定是句子對兒,或者文檔對兒,我們一定要考慮雙方的情況,不同的場景,不同的分析。那么KB_QA,涉及到question和answer,我們需要單獨研究每一個對象。首先看question,舉個例子:whtat's the name of Obama's wife?先用信息抽取的方法分析這句話,如果熟悉信息抽取的話,可以忽略以下了。一個問題,涉及到問題詞qword,焦點詞qfocus,主題詞topic和中心動詞qverb。其中qword比如what,who,where代表了問題的類型,比如where映射為type.location。qfocus代表了答案的類型,這是非常重要的參考標准,比如問句中的name。topic代表了問句中的主題,或者說是知識圖譜中的推理的根節點,比如Obama。然后qverb一定程度上表明了topic和answer之間的一種關系,或者說是約束,當然其他的短語關系,也可以對topic構成一定的約束,比如:who first voiced Meg on Family Guy? Meg on Family Guy這個短語中,Meg對topic構成了一定的約束關系,包括出現of+topic短語,這在語言邏輯形式上往往是joint關系。明白了這些關系后,我們就知道衡量quesiton和anser之間的語義相似度,絕非是簡單的cos!我們一定兼顧到question和anser之間的約束關系,因為KB_QA,本質上就是知識圖譜的查詢問題,只不過這個查詢是通過一步步施加約束,縮小搜索范圍最后得到答案。而每一步施加約束后,我們都會得到相應的獎勵得分。

whtat's the name of Obama's wife?這句話得到了topic后,可以用multi-hot,也就是詞袋模型來表示他的語義。然后answer,我們考慮三方面的約束關系:answer type,answer path,answer context,同樣用multi-hot的詞袋模型來表示,最后用dot做相似度。這個想法非常簡單,但是缺陷非常多,語義相似度如果這么做的話,效果一定非常差。第一,在語義表示上存在非常的問題,類似於word2vector的詞袋模型,在語義表示上不夠豐富,不能考慮到語言的順序;第二,在相似度顆粒度上,還是很粗糙,盡管考慮了answer的三個方面,但是這三個方面應該分開單獨和question做相似度得分。基於這兩個缺陷,我們改進為:用CNN抽取出question的三個方面的語義表示,然后答案的三種約束,單獨和question的語義求形似度得分:

這樣兼顧了語意表達的豐富性和相似度顆粒度問題。這個方案仍然有改進空間,方向就是語義表示的多維度問題。拋開場景,之前textCNN在文本分類中取得了成功,CNN抽取語義表示,類似於n-gram原理,比如過濾器設置為(2,3,4),分別代表2-gram,3-gram,4-gram。目前這個方案已經有了更好的,那就是BILSTM+self_attention。self_attention在捕捉一句話語義的多維度方面,有着非常大的優勢,已經成為語義表示的baseline,所以把前面的方案替換為self_attention。(attention的類型很多,比如local,global,但是大多需要借助額外的語義表示,而且不能捕捉語義的多維度,self_attention是一種突破)

前面的基於向量建模的語義相似度方案,仍然存在缺陷,對於稍微復雜的問題,比如涉及到時序性的推理,或者multi-hot推理,顯得略微吃力一些。向量建模其實還沒有真正觸及語言邏輯問題,只有融合了深度學習,語言邏輯,向量建模,規則,問答才能真正強大起來。語義解析的過程,我們換一種角度來研究。傳統的語義解析,是一下子全部映射為查詢語言,先經過lexicon映射,然后構建語法樹。但是這個過程我們分解為多個步驟,不用一下子構建語法樹,分解的好處是可以融合向量建模,信息抽取的思路,更方便地與深度學習,知識圖譜融合。它其實是query graph的過程,在query的過程中不斷施加約束,而每個環節施加的約束,或者說是action會有多個,我們可以從中選擇出與quesion相似度得分最高的那個action最為最優的action,如此不斷地施加約束,縮小范圍,得到最終的結果。這就是微軟著名的query graph,一下子提升了7.5個F1_score,這個提升在業內是比較罕見的。啟發式的搜索算法很簡單:

核心問題其實還是約束與question的語義相似度,在做core inferential chain與quesion的相似度時,顆粒度做的很細:

question和constraint,都是用CNN來抽取語義表示,然后dot。

從以上案例,我們看出,語義相似度,即使不考慮融合知識圖譜的情況下,也絕不是很多人想的那樣想當然。到現在為止還沒有解決大眾點評的問題,這個問題,明顯不同於KB_QA,是另一個場景。

我們先來分析一下:之前我說過,研究深度學習,先把人自身的邏輯研究明白了,否則不會有突破,可能會走彎路。如果人工來抽取的話,你會怎么做?是一種怎樣的邏輯?一定是這樣的情景:在閱讀用戶的評論時,當讀到了關於菜品質量的描述,我們做一個標記,抽取出來,當遇到衛生問題時,執行同樣的邏輯。那么問題來了,人怎么知道要抽取哪些東西?他怎么知道這個要點是商家需要的?一定是在抽取之前,大腦中已經有了對應的抽取范圍,他知道要抽取哪些東西。所以這個secene的解決很容易:首先收集關於餐館問題的問題模板,盡量涵蓋范圍大一些,接下來就是要運用本人之前研究的siamese lstm(用self_attention改進后的方案)做語義相似度,問題迎刃而解,具體細節不走論述了。這里有一個重要的問題,抽取要點是有數量限制的,得到相似度得分之后,抽取出top K,這樣做不太好,要設定得分閾值,低於這個閾值的,就pass掉。這類問題,用基於規則,效果會非常差,因為用戶的評論,涉及到了情感傾向,而且會經常出現語義轉折,長句子。對於這樣的場景,語義表示的豐富性,多維度,非常重要了。

總結一下,語義相似度,在不考慮知識圖譜的情況下,核心問題:①獲取豐富的多維度的語義表示②語義表示做差后的打分函數映射,比如用ma距離衡量后用exp(-||x1 - x2||1)③顆粒度問題。另外非監督學習的方法,也可以探索,但是場景受限,准確度遭受工業界質疑。

到此為止了,今后的研究,會更多結合外部知識,融合知識圖譜做語義重合度,推進語義理解的進步。

更多語義相似度細節:http://www.cnblogs.com/txq157/p/8863508.html


免責聲明!

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



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