從Kaggle賽題: Quora Question Pairs 看文本相似性/相關性

從Kaggle賽題: Quora Question Pairs 看文本相似性/相關性

今天來複盤一下9個月前的Kaggle: Quora Question Pairs, 也算是對文本相似性工作的一點總結,Quora賽題是我接觸數據競賽的第一次比賽,正值大四的下學期開學,在實驗室做一些NLP方面的橫向課題,學弟找我來說要不要玩比賽,我們就把當時kaggle上當時的比賽羅列了一下,最後挑了這個NLP的賽題,當時對調參,特徵工程,模型融合,pipeline沒有深刻的理解。誤打誤撞的拿了銀牌,現在讓我再打一次的話,還是比較有信心衝擊金區的。

這篇文章想發散開來講,從傳統方法到深度模型,結合賽題的數據特點對文本相似性匹配的方法做一個梳理。以及針對比賽中的技巧做一個總結。

Quora給的題就給定兩個quora中的提問。提問數據是類似知乎上的提問標題,判斷兩個問題是不是一個問題。比如:A.如何學習NLP? B.怎樣學習自然語言處理?這就明顯是一個問題。這個題屬於NLP中的文本相似性匹配,由於quora構建數據的方式存在圖的特徵,後來發現其圖模型方面也值得研究。以下部分圖片來自於Quora第四名YesOfCourse團隊的ppt,在此註明版權。

文本相似性/相關性度量是NLP和信息檢索中非常基礎的任務,在搜索引擎,QA系統中有舉足輕重的地位,一般的文本相似性匹配,從大的方法來講,傳統方法和深度學習方法。

特徵工程方法

傳統方法不外乎各種角度的特徵工程,我把常用的特徵羅列如下,比如

  • 編輯距離

編輯距離(Edit Distance),又稱Levenshtein距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。一般來說,編輯距離越小,兩個串的相似度越大。

例如:

我們有兩個字元串: kitten 和 sitting:

現在我們要將kitten轉換成sitting

我們可以做如下的一些操作;

k i t t e n –> s i t t e n 將K替換成S

sitten –> sittin 將 e 替換成i

sittin –> sitting 添加g

在這裡我們設置每經過一次編輯,也就是變化(插入,刪除,替換)我們花費的代價都是1。

FuzzyWuzzy這個python包提供了比較齊全的編輯距離度量方法。

  • 集合度量特徵

集合度量方式就是把兩個句子看成 BOW (bag of words)。然後使用集合相似性度量方法比如Jaccard等。這種方法有一個嚴重問題就是丟失語序。當然基於集合算重合度的度量方法不止Jaccard,也有很多別的,感興趣的同學可以了解下。

  • 統計特徵

比如句子長度,詞長度,標點數量,標點種類,以及詞性序列上的度量,這也是最直觀的度量方法,大家可以發揮自己的想像力把這一部分做豐富一點

  • 使用預訓練的詞向量得到句子表示進行度量

詞向量是深度學習進入NLP的非常代表性的工作,谷歌的詞向量論文引用了3000+次,可謂影響深遠了。

使用詞向量的一種簡單的方法是,BOW求平均,得到兩個句子的表示,然後利用餘弦相似度度量或者Minkowski,歐幾里得距離等等。這是一種非常簡單而直觀的方法。

在比賽中我們這篇參考了論文, From Word Embeddings To Document Distances 這篇論文提出的一種叫做WMD的度量方法,七級本原理是利用word2vec的特性,將文本文檔表示為一個weighted point cloud of embedded words。兩個文檔A和B之間的距離定義為A中所有的詞移動精確匹配到文檔B中點雲的最小累積距離。這個思路也非常直覺,實際表現也非常良好『

  • 使用傳統方法如tfidf,LDA等topic model等拿到句子表示進行度量

對於LDA和tfidf的句子表示原理在此不做細講,在實踐中我們發現,使用tfidf值對詞向量做一個加權,得到的句子表示也是一種不錯的表示。

深度模型

深度模型有兩種思路,一種是基於表示,一種是基於交互。不過基於交互的模型大多也是先要拿到文本表示,從文本表示構建交互,從交互到特徵抽取的思路。其基本的模型如下所示

這是一個非常直觀的思路,最後一層的matching score建模方法甚至可以用一個簡單的FC代替,或者做一次element-wise 乘之後接FC。下面有在IR中用表示方法做這個問題的幾篇論文。

  • DSSM: LearningDeep Structured Semantic Models for
  • WebSearchusing Click-through Data (Huanget al., CIKM』13)
  • CDSSM: Alatentsemanticmodelwith convolutional- poolingstructureforinformationretrieval (ShenY,HeX, Gao J,etal.CIKM』14)
  • ARC I: ConvolutionalNeural NetworkArchitecturesfor MatchingNaturalLanguageSentences(Huet al., NIPS』14)
  • LSTM-RNN:Deep Sentence Embedding Using the Long Short Term MemoryNetwork:Analysis and Application toInformation Retrieval (Palangietal.,TASLP』2016)

基於交互的方法是通過Interaction來對文本相似性建模,其模型基本的原理是。

有一篇非常有意思的文章Text Matching as Image Recognition. (Liang Pang, Yanyan Lan, Jiafeng Guo, Jun Xu, and Xueqi Cheng. AAAI 2016)這也是龐亮學長在AAAI 2016上的工作,所以他們打這個比賽,完全就是把中科院的模型拉出來遛遛。這個模型也很直覺,就是把兩個文本的相似性建模成一張圖片,再用CNN做特徵抽取器。

  • 拿到每個詞的embedding。 (embedding)
  • 構建兩個文本的相似矩陣。 (Interaction)
  • 把相似矩陣放入兩層CNN中。 (Feature extract)
  • 把CNN的結果放入兩層的全連接中。 (FC)
  • 獲得二分類的score。 (distribution)

後來的一些工作都大同小異,比如不直接使用詞向量,利用RNN的隱層向量去構建交互等等。具體的文章如下,感興趣的同學可以看一下。

  • DeepMatch: A Deep Architecture for Matching Short Texts (Lu and Li, NIPS』13)

    ARC II: Convolutional Neural Network Architectures for Matching Natural Language Sentences (Hu et al., NIPS』14)
  • MatchPyramid: Text Matching as Image Recognition. (Liang Pang, Yanyan Lan, Jiafeng Guo, Jun Xu, and Xueqi Cheng. AAAI 2016)
  • Match-SRNN: Modeling the Recursive Matching Structure with Spatial RNN. (Shengxian Wan, Yanyan Lan, Jiafeng Guo, Jun Xu, and Xueqi Cheng. IJCAI 2016)

下面回到這個比賽中,具體結合數據談一談。

在比賽中發現,訓練集和測試集的正負樣本比有明顯差異,分布上的差異最後體現在logloss指標上的gap,在比賽中大家推導出一個後處理的公式,然後可以拉平分布帶來的分數異動。使用貝葉斯公司能推導出這個後處理,前提是可以測出分布的情況下。有論文對這個做了詳細的講解。"Adjusting the Outputs of a Classifier to New a Priori Probabilities: A Simple Procedure"pdfs.semanticscholar.org

比賽中一些預處理方法有

  • 詞元化/詞幹花
  • 停止詞刪除
  • 標點符號清洗
  • 特殊符號替換
  • 詞向量擴充句子得到另一份句子(這個直覺的思路是,利用詞向量找相關詞的特性,增加傳統特徵方法的容錯性。比如集合度量方法,開心和高興雖然是一個意思,但是不擴充近義詞的話,其容錯性很低)

不得不提的是,這個比賽中有一個非常關鍵的leak信息。一個問題如果出現頻繁的話,就很可能是一個重複的問題。後來發現前幾名在這個leak上做了很多文章,取得了非常好的效果。後來CPMP給的解釋是:

A question that is asked often has more chances to be redundant. Thanks for sharing.

以第一名的解法為例,他的特徵工程中含有大量的來自圖的Structural features 。我感覺這部分也是最關鍵的。

kaggle.com/c/quora-ques第一名的解法有300多個模型做了stacking。簡直爆炸。

第四名HouJP學長的,kaggle.com/c/quora-ques,亮點就是深度模型的分數很高,不愧是中科院IR大佬。

第五名的解法也是在圖的建模上挖掘了大量的特徵。

第七名亮點就是這個人比較懶,花了大量的時間在深度模型上。和第一名都用了一個叫 decomposable attention 的東西。kaggle.com/c/quora-ques

後來總結一下這個賽題,由於基於圖的特徵的存在,使得這部分的特徵工程尤為重要,這也是我們做的不好的地方。前幾名在圖上都做了充分的挖掘,體現了強大的特徵工程能力。不過這部分東西,單純的文本相似性/相關性的工作沒什麼貢獻,如果抱著研究目的的同學可以忽略這部分。

HouJP和龐亮學長把他們的方案開源了,鏈接如下:github.com/HouJP/kaggle。他們的自動化框架很厲害,值得學習。

我們也把代碼開源了,不過在大佬面前就是班門弄斧了:github.com/SpongebBob/Q

由於這是我參加的第一次比賽,所以印象十分深刻。學到了一些對比賽使用的流程性的東西,體會到pipeline的重要性,不過教訓也很多,也算一種成長吧。

推薦閱讀:

Facebook如何利用機器演算法人工智慧教計算機閱讀
重磅乾貨-Richard S. Sutton-2018年強化學習教程免費下載
【乾貨】我是怎麼用四個月時間速成全棧機器學習的
引領深度學習革命--CNN架構全解析
鋼鐵直男的救世主來了!讓AI告訴你妹子到底是啥意思

TAG:Kaggle | 自然語言處理 | 機器學習 |