這篇文章,專門講語義類似度問題。html
先看場景:算法
scene(一):用戶經過大衆點評,線上約了餐館,就餐後在上面發表了不少評論,評論中涉及了大量的餐館的問題,好比菜品質量,酒店衛生,服務等等。如今須要抽取之中的要點,而後反饋給商家。函數
scene(二):KB_QA的兩個問題:①獲取question的語義表示②把語義表示轉換成知識圖譜的可以理解的語言邏輯形式。不管是核心推導鏈仍是向量建模,核心都是question和answer的語義類似度問題。學習
雖然學術界對於語義類似度問題,都說是熱點和難點,可是他到底難在哪裏?今天有必要探討一下。首先,衡量兩個表達之間的類似度,是經過語義級別,而語義屬於認知層面,這給研究帶來帶來了很大的難度。由於目前的聯結主義,僅僅能解決語義表示,沒法學習邏輯推理。其次,理解一句話或者一段話的語義,不是單純靠概括總結能力,還須要藉助外部知識,就是說這句話表達了什麼樣的事件,這個事件可能會關聯到不少實體,關係,路徑。兩個句子之間的關係、路徑的交集必定程度上表明瞭語義的重合度。以前的研究,都是靠單純靠聯結主義,包括開頭的兩個場景,都是這個思路。htm
從算法角度來看的話,探索基於知識圖譜的非監督學習是一個方向,目前有學者在研究;另一個就是監督學習了,主要是藉助深度學習。目前大部分的類似度改進,仍然是後者,前者的難度,對於工業界來講,很是大。從工業界的角度來看,最簡單的類似度固然是元積了,好比著名的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,本質上就是知識圖譜的查詢問題,只不過這個查詢是經過一步步施加約束,縮小搜索範圍最後獲得答案。而每一步施加約束後,咱們都會獲得相應的獎勵得分。blog
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,這個提高在業內是比較罕見的。啓發式的搜索算法很簡單:get
核心問題其實仍是約束與question的語義類似度,在作core inferential chain與quesion的類似度時,顆粒度作的很細:
question和constraint,都是用CNN來抽取語義表示,而後dot。
從以上案例,咱們看出,語義類似度,即便不考慮融合知識圖譜的狀況下,也毫不是不少人想的那樣想固然。到如今爲止尚未解決大衆點評的問題,這個問題,明顯不一樣於KB_QA,是另外一個場景。
咱們先來分析一下:以前我說過,研究深度學習,先把人自身的邏輯研究明白了,不然不會有突破,可能會走彎路。若是人工來抽取的話,你會怎麼作?是一種怎樣的邏輯?必定是這樣的情景:在閱讀用戶的評論時,當讀到了關於菜品質量的描述,咱們作一個標記,抽取出來,當遇到衛生問題時,執行一樣的邏輯。那麼問題來了,人怎麼知道要抽取哪些東西?他怎麼知道這個要點是商家須要的?必定是在抽取以前,大腦中已經有了對應的抽取範圍,他知道要抽取哪些東西。因此這個secene的解決很容易:首先收集關於餐館問題的問題模板,儘可能涵蓋範圍大一些,接下來就是要運用本人以前研究的siamese lstm(用self_attention改進後的方案)作語義類似度,問題迎刃而解,具體細節不走論述了。這裏有一個重要的問題,抽取要點是有數量限制的,獲得類似度得分以後,抽取出top K,這樣作不太好,要設定得分閾值,低於這個閾值的,就pass掉。這類問題,用基於規則,效果會很是差,由於用戶的評論,涉及到了情感傾向,並且會常常出現語義轉折,長句子。對於這樣的場景,語義表示的豐富性,多維度,很是重要了。
總結一下,語義類似度,在不考慮知識圖譜的狀況下,核心問題:①獲取豐富的多維度的語義表示②語義表示作差後的打分函數映射,好比用ma距離衡量後用exp(-||x1 - x2||1)③顆粒度問題。另外非監督學習的方法,也能夠探索,可是場景受限,準確度遭受工業界質疑。
到此爲止了,從此的研究,會更多結合外部知識,融合知識圖譜作語義重合度,推動語義理解的進步。