Kaggle:Quora Question Pairs
一、概要
Quora Question Pairs是kaggle上一個關(guān)于文本匹配的問題,主要目的是判斷兩個問題是不是同一個意思。
二、數(shù)據(jù)簡介
數(shù)據(jù)結(jié)構(gòu)相對比較簡單,如下:
"id","qid1","qid2","question1","question2","is_duplicate"共有6個字段,比較有用的便是question字段代表一個序列文本,is_duplicate代表兩個文本是否為相同的意思。
三、數(shù)據(jù)預(yù)處理
作為文本數(shù)據(jù),到手之后常用操作就是預(yù)處理,筆者這里將數(shù)據(jù)進(jìn)行簡單清洗,大致分為以下步驟:
1、將文本轉(zhuǎn)為小寫 2、對于文本中一些“不規(guī)范”表述,統(tǒng)一為一種形式,如:1000g——>1kg等 3、詞干提取預(yù)處理這里仔細(xì)考慮可以做出幾層,比如:提取名詞性短語、翻譯模型、去除共現(xiàn)詞等等,但出于時間考慮,這里只是簡單的做了一層的處理。
四、特征工程
對于傳統(tǒng)機(jī)器學(xué)習(xí)模型,重頭戲就來自特征工程,這里將本項目中的特征工程分為以下幾種:
1、統(tǒng)計特征
對于文本的統(tǒng)計特征,項目中提取了以下幾種:
(1)共現(xiàn)詞
共現(xiàn)詞代表同一個詞在兩個文本同時出現(xiàn),這是一個比較形象的特征,同時出現(xiàn)的詞越多代表相似度越高,這里如果單純使用名詞性的詞語可能效果會更好,因為這種問題形式的文本,其核心內(nèi)容都會在名詞短語中體現(xiàn)出來,具體計算方式如下:
(共現(xiàn)詞的在q1中出現(xiàn)的次數(shù)+共現(xiàn)詞在q2中出現(xiàn)的次數(shù))/文本總次數(shù)(2)加權(quán)共現(xiàn)詞
加權(quán)其實就是用文本的TFIDF值作為權(quán)重,計算共現(xiàn)詞概率
(3)特殊共現(xiàn)詞
特殊共現(xiàn)的做法利用了訓(xùn)練數(shù)據(jù)里面的標(biāo)簽,通過計算每一個詞,在文本重復(fù)時出現(xiàn)的次數(shù),在文本不重復(fù)時出現(xiàn)的次數(shù)得到這個詞的一個監(jiān)督權(quán)重;
詞在文本重復(fù)時出現(xiàn)的次數(shù)/詞出現(xiàn)的總次數(shù) = 詞的監(jiān)督權(quán)重在得到每一個詞的監(jiān)督權(quán)重之后,對于文本只需要對每一個詞的權(quán)重進(jìn)行概率連乘就可以了。
詞A的監(jiān)督權(quán)重*詞B的監(jiān)督權(quán)重*... = 特殊共現(xiàn)概率(4)其他
其他還有StrikeAMatch、編輯距離等,實際使用中效果也挺不錯的,詳細(xì)的特征可以參考代碼。
2、表示特征
表示特征主要是一些跟word Embedding相關(guān)的特征提取,
(1)Word2Vec
基于清洗后的文本訓(xùn)練了一個300維的詞向量,之后計算兩個文本之間的cosine、euclidean、manhattan距離作為特征,這里的詞向量也可以考慮利用預(yù)訓(xùn)練的模型如Glove等。
還有基于word2vec的n-gram特征,這個特征效果也還可以。
(2)wordMoverDistance
詞移距離,詳細(xì)可以參考我的博文,一種基于詞向量計算文本相似度的方法,實踐中效果相當(dāng)不錯。
(3)DocVector
上述詞向量也是用了某些方式轉(zhuǎn)化為句向量,之后再計算相似度。這里直接使用句向量模型,生成向量提取cosine特征。
3、NLP特征
(1)關(guān)鍵詞特征
利用TFIDF算法,提取出文本的關(guān)鍵詞,再結(jié)合詞向量計算距離特征。
(2)TFIDF距離
這個直接使用TFIDF矩陣進(jìn)行計算,有點暴力,因為這個矩陣有點大。后續(xù)基于這個特征還可以進(jìn)行擴(kuò)充,比如PAC后的50、100、300維的向量距離,還有其他的如LDA等等,但降維過程占用資源過大,筆者只有一臺空置服務(wù)器可以使用,就放棄了。
(3)其他
后續(xù)還有一些想法沒有實現(xiàn),比如進(jìn)行句法分析,基于句法的特征等等。
4、圖特征
quora的數(shù)據(jù)集一個比較有意思的點是,這是一個社交網(wǎng)絡(luò)狀態(tài)下的數(shù)據(jù)集,對于這種數(shù)據(jù),它很有可能并不是全部手動標(biāo)注的,有可能是基于問題搜索后,用戶對搜搜推薦的問題有沒有點擊來加權(quán)衡量出來,那么,這里其實存在一種很強(qiáng)的圖聯(lián)系。
基于問題與問題是否同時出現(xiàn)構(gòu)建了一個網(wǎng)絡(luò),而多次出現(xiàn)的問題變成獨立連接之間的橋梁,構(gòu)成一個龐大的問題關(guān)系網(wǎng)。
(1)圖的統(tǒng)計特征
統(tǒng)計特征計量了每一個問題得最大連接度,及問題的最大連通長度。
(2)圖的結(jié)構(gòu)特征
結(jié)構(gòu)特征提取了每個問題的最大團(tuán),問題同時出現(xiàn)的最大團(tuán)等,很有意思的是,這種出現(xiàn)重復(fù)的問題,很多時候會聚集在一個團(tuán)中或者周圍。
(3)圖的傳播特征
基于問題網(wǎng)絡(luò),還可以進(jìn)行傳播特征計算,如pagerank、hits等等,但筆者用python簡單構(gòu)建的模型占用資源過大,沒法進(jìn)一步計算,如果有時間,可以考慮在圖數(shù)據(jù)庫中重新構(gòu)建一個,再進(jìn)行相應(yīng)的傳播計算。
五、模型
1、傳統(tǒng)模型
傳統(tǒng)模型這里使用了xgboost,這個模型參數(shù)簡單,且效果也不錯,作為快速驗證想法的工具很值得推薦。
其他還有隨機(jī)森林也是一個不錯的選擇,兩個模型相比較,xgboost會好一點,隨機(jī)森林表現(xiàn)出來過擬合嚴(yán)重一些,但也要可能是筆者沒有花時間進(jìn)行仔細(xì)的調(diào)參所致。
2、深度模型
關(guān)于深度學(xué)習(xí)的模型,筆者實現(xiàn)了兩個,一個基于CNN,一個基于LSTM-RNN,但效果都沒有達(dá)到論文所說的預(yù)期,不知是論文中用了一些小trick沒有注意到,還是在某些方面出了偏差,最后都棄之不用了。
3、融合模型
融合模型作為最后提升分?jǐn)?shù)的利器,很值得一用。但前期在深度模型處花了不少時間,GPU渣。。后面就沒時間了&沒心情繼續(xù)調(diào)了,就此作罷。
六、其他
最終只提交了一個單模型的xgboost的結(jié)果上去,分?jǐn)?shù)0.17574,由于比賽已經(jīng)結(jié)束,自行算了一個大概的位置,應(yīng)該是 600/3300 Top 20%,以后有時間再優(yōu)化吧
具體代碼已經(jīng)開源,可以在我的github上找到:https://github.com/lpty/kaggle
總結(jié)
以上是生活随笔為你收集整理的Kaggle:Quora Question Pairs的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机应用能力提升,大学生计算机应用能力
- 下一篇: 站点部署 廖雪峰的官方网站