短文本相似度計算
短文本的相似度計算方法可以分為兩大類:基於深度學習的方法和基於非深度學習的方法。科研方面基本都是從深度學習方面入手,但個人覺得想把單語言的短文本相似度計算給做出花來比較難,相對而言基於深度學習的跨語言相似度計算稍微好點。工程方面多半不用深度學習的方法,主要是獲取帶標記的語比較難的(除非公司花錢找人標)。下面我將結合自己做過的相似度計算的任務,從深度學習和非深度學習兩個角度說一下文本相似度計算。
首先來說一下基於深度學習的文本相似度計算。在開始表演之前請允許我說一下故事背景。我們要做一個網絡查詢推薦,即類似於圖1一樣:用戶輸入查詢內容,網頁給出一些合理的推薦(這些推薦可以是之前網站日誌記錄下的之前用戶的查詢信息)。為了從日誌之中選出與用戶查詢內容最貼切的推薦返回給用戶,我們需要計算用戶輸入的查詢內容q和候選推薦S(S={s1
圖1 百度搜索框中的查詢推薦
在上述任務中,我們利用Siamese Network(見圖2)計算文本相似度。考慮到候選推薦S會比較大且真實的語料比較短,我們使用CNN做Siamese Network的基本機構,這樣我們在提高速度的同時也能保證性能。使用CNN的一個好處就是我們可以很好地共享兩個CNN的參數,為此,我們比較了三種情況下模型性能結果。一種是兩個CNN不共享參數;另種是兩個CNN共享部分參數;最後一種是兩個CNN全部共享參數。實驗的結果顯示,在同一種語言(查詢和推薦的屬於同一種語言)的情況下,兩個CNN共享的參數越多模型的性能越好,在不同語言(查詢和推薦屬於不同的語言)的情況下兩個CNN共享的參數越多模型的性能越差。
圖2 Siamese Network
比較二者差異的主要由查詢語言和候選推薦語言是否一致造成的。當兩者一致時,用語習慣相同,使用一套參數能更好的擬合他們的分布;但當兩者不一致時,二者的語言環境差異很大,用一套參數很難同時模型二者的分布。使用CNN做相似度計算還是很難獲得句子整體的語義信息,使用膨脹CNN(IDCNN)做Siamese Network的基本單元效果應該會更好。另外把兩個句子任意兩個詞語的相似度組成的矩陣當成是圖片處理也可以很好地適用於查詢推薦的,且聽NLPCC會議上的老師介紹,在數據較少的情況下這種方法更加實用。
非深度學習的文本相似計算方法也有很多,主要有基於詞匯的,基於句型結構的,基於詞向量的。我們這裏主要介紹基於句子詞向量加權和的句子相似度計算。不管是深度學習還是非深度學習,相似度計算的一個難點就是如何合理的表示句子,非深度學習方法在句子的向量化表示過程中主要有SVM(空間向量模型)以及句子詞向量的相加。前者會存在數據稀疏,句子表示過長等問題。所以我們直接使用了詞向量的加權和表示句子,這裏的權重分配主要看這個詞是不是關鍵詞(jieba,pynlpir都可以直接計算)。
將句子表示為詞向量的加權和,然後計算句子相似度的方法相較於深度學習方法有不少優點:一個是不需要花費大量的人力和物力,一個是適用性比較強(畢竟不像深度學習訓練出來的模型,換一個測試集性能就會有很大的差異)。但是其本身也存在問題,主要是性能沒有深度學習方法的好。句子詞向量的簡單相加基本沒有涉及句子句型、語法,結構等。這樣的結果難以包含句字的整體語義信息,且在句子的分詞過程中可能存在的錯誤(感覺影響特別大)會繁衍到下遊的相似度計算。分詞的結果和已有的詞向量(網上下載的)不匹配也會對結果造成影響。
綜上,文本相似度的計算還是由不少難點需要我們去克服的,這些難點往往涉及底層的NLP知識,感覺任重而道遠。
短文本相似度計算