在文本分類任務中,有哪些論文中很少提及卻對性能有重要影響的tricks?

這些tricks可能位於預處理環節、神經網路的結構中、梯度計算和優化環節、參數初始化環節、超參選取環節等。


趁機總結一下之前遇到過的一些小trick吧:

  1. 數據預處理時vocab的選取(前N個高頻詞或者過濾掉出現次數小於3的詞等等)
  2. 詞向量的選擇,可以使用預訓練好的詞向量如谷歌、facebook開源出來的,當訓練集比較大的時候也可以進行微調或者隨機初始化與訓練同時進行。訓練集較小時就別微調了
  3. 結合要使用的模型,這裡可以把數據處理成char、word或者都用等
  4. 有時將詞性標註信息也加入訓練數據會收到比較好的效果
  5. 至於PAD的話,取均值或者一個稍微比較大的數,但是別取最大值那種應該都還好
  6. 神經網路結構的話到沒有什麼要說的,可以多試幾種比如fastText、TextCNN、RCNN、char-CNN/RNN、HAN等等。哦,對了,加上dropout和BN可能會有意外收穫。反正模型這塊還是要具體問題具體分析吧,根據自己的需求對模型進行修改(比如之前參加知乎競賽的時候,最終的分類標籤也有文本描述,所以就可以把這部分信息也加到模型之中等等)
  7. 超參數的話,推薦看看之前TextCNN的一篇論文,個人感覺足夠了「A Sensitivity Analysis of (and Practitioners』 Guide to) Convolutional Neural Networks for Sentence Classification」
  8. 之前還見別人在文本領域用過數據增強的方法,就是對文本進行隨機的shuffle和drop等操作來增加數據量

暫時想到這麼多,以後想起來再補充吧,歡迎大家交流、補充


我這邊做垃圾文本識別,看到第一個答案從模型參數的角度去優化,說的已經夠好了,我這邊從文本本身來說說,拿到一系列文本,別急著直接丟進模型訓練,還是做一些最基本的預處理,如繁體轉簡體,全轉半,同義詞替換,表情符號處理,標點符號處理,還有做一些簡單的特徵工程處理,如一個手機號碼,因為有幾千萬的手機號碼,所以手機號碼最好轉化為同一個特徵,不要以為深度學習不要做特徵工程,還有在中文文本分類我是建議分詞,不要用char級別的,比如說我之前做了一個色情模型用char級別的,直接把鐘乳石預測成色情,還有不斷出現的網路新詞會對模型造成干擾,如吃雞這種。最後如果文本長度夠長的話,建議可以用memory network 相關的演算法,一定要加正則,一定要加正則,這點特別重要,我說完了。


主要做短文本分類,一樓和二樓已經講的比較全了,下面只從自己經驗中做部分補充:

預處理部分:

  1. 文本更正,中文如果是正常的文本多數都不涉及,但是很多惡意的文本,裡面會有大量非法字元,比如在正常的詞語中間插入特殊符號,倒序,全半形等。還有一些奇怪的字元,就可能需要你自己維護一個轉換表了。

    如果是英文的,就涉及拼寫檢查,可以用python包pyenchant實現,比如 mothjer -&> mother
  2. 文本泛化

    - 表情符號、數字、人名、地址、網址、命名實體等,用關鍵字替代就行。這個視具體的任務,可能還得往下細化。比如數字也分很多種,普通數字,手機號碼,座機號碼,熱線號碼、銀行卡號,QQ號,微信號,金錢,距離等等,並且很多任務中,這些還可以單獨作為一維特徵。還得考慮中文數字阿拉伯數字等。

    - 中文將字轉換成拼音,許多惡意文本中會用同音字替代。

    - 如果是英文的,那可能還得做詞幹提取、形態還原等,比如fucking,fucked -&> fuck
  3. 分詞

    - 這部分主要是中文,可以只保留長度大於1的詞,本人在多個任務中實驗過,對結果精度沒什麼影響,但是可以有效降低特徵維度。
  4. 停用詞

    - 網上中英文的都能找到,但是需要根據自己的任務決定是否需要增加和刪除一些,比如not、不是等帶有否等意義的停用詞在有些任務中還是會影響結果的。

    - 詞篩選,出現次數太多和太少的都可以考慮去掉,太多的一般是這類文本的常用詞,太少的往往是拼寫錯誤、命名實體、特殊片語等。

    - 也可以考慮根據tfidf來篩選

  5. 數據平衡

    - 相信現實中多數任務的數據集都是很不平衡的,不平衡包括兩個方面一是數據量不平衡;二是數據多樣性不平衡。

    - 主要從採樣和數據增強兩面解決。比如直接上/下採樣到匹配的量,比如先聚類,再按類別上下採樣等等。

    - 數據增強,比如隨機的增刪一些詞等。這個也挺有講究的,就不再這裡細說了。

模型部分:

  1. 主要兩個方向吧,詞袋模型和詞向量模型。

    - 詞袋模型更多應用於傳統的機器學習分類演算法

    - 詞向量是傳統方法和深度學習方法都可以用。
  2. 通用的技巧

    - 可以只保留某幾個詞性的詞語,比如只要形容詞和名詞

    - 可以加入詞的詞性特徵

    - 可以加入詞的情感特徵
  3. 詞袋模型

    - 考慮是用詞頻,還是只關注是否出現用01標示就好。這方面好像就想到這一點,歡迎其他人補充。

  4. 詞向量模型

    - 英語還有字元向量,中文還有筆畫向量,這是之前在阿里雲棲大會上聽阿里的人說的,說是實驗效果有不少提高,我沒實驗過,也對這個持懷疑態度。但是在一些特殊場景上適用也是有可能的,比如一些惡意文本,有時候就得用一些形似的字替代。

    - 如果是應用於傳統方法,那麼根據詞向量合成句子向量又比較有講究了,平均,加權平均等,之前在一個任務中試過根據tfidf來加權平均,有一點提升,但是效果很有限。

    - 在深度學習模型中,就涉及最大取多少個詞的問題,我採取的措施是對正負樣本分別統計,綜合考慮長度與樣本覆蓋,用 均值 + n*方差的方式確定,盡量能完全覆蓋80%以上的負樣本,剩下的再截斷,長度對rnn一類的演算法性能影響比較大,對cnn類要好很多,所以,cnn類的可以稍微長點關係也不大。

    - rnn用雙向lstm,一般會比lstm效果好

    - 截斷從前面截斷還是從後面截斷不同的任務上可能不同,需要注意。

    - 對不均衡的數據,除了數據增強和採樣,還可以用何凱明大神最新的facal loss損失函數。但是我自己實驗發現,在提高了少類樣本準確率的同時,多類的準確率是有所降低的,這個需要根據你自己的具體任務來權衡。

暫時就想到這麼多吧,歡迎大家補充,共同學習。


6最近一直在做文本分類相關的東西,說下自己的體會。

1. 拼寫檢查,可以結合編輯距離和詞向量一起做,效果更好,我主要做英文的。

2. 文本特徵,主要用DL的方法比較多,基於

詞向量特徵,其它特徵也比較好融合,可以採用主題向量,位置向量等

3. 分類器,fasttext和textcnn其實能滿足大部分場景的分類任務,CNN選擇大點的卷積核效果更好,Dropout必須,BN看情況。多分類模型未必分類層必須要用softmax,sigmoid有時候效果更好。

4. 類別太多可以考慮層次分類,不好分的先合併,然後再做內部分類。

5. 該用規則就用規則,不要覺得用規則就底氣不足,覺得降低了你身份。

6. 遷移特徵,嘗試從公開的語料庫去訓練模型,然後可以將模型分類的標籤向量作為自己分類模型的輸入特徵,當然要考慮任務的相關性。

7. 基於RNN的分類模型,可以通過訓練語言模型進行初始化。

8. 有些短文本分類任務可以轉化為語義匹配,當然這需要對標籤做分散式表示,國內最新出了篇論文,還沒細看。

9. 文本預處理,各種歸一化,這是必須的。

有時間再補充 。。


這個問題我從NLP的角度答一下吧。

我沒有做過實際的文本分類工程,不過學NLP的時候導師的assignment里有一個問題時做文本分類,要求比較簡單,就是給定幾個類的訓練樣本最後輸出訓練樣本的Label,不過我不太喜歡用NLTK之類的包,所以自己搞了一個。

  1. 文本和普通feature的區別是文本做向量化會有Sparsity難以訓練(所以我們才會用word2vector),不過NLP有粗糙的解決方法比如stem algorithm這種辭彙級別的預處理,快的一匹,中文的我不確定;
  2. 在做好預處理之後文本有些語法項可以作為擴展的feature比如postagging,FOL語法等等,我個人喜歡用postagging,因為比較簡單,penny-tree-bank+verterbi就能寫一個;
  3. 正則化標點符號我在實際處理中感覺作用不大,反而是不做正則test error和train error要小一些,可能是符號與文本分類有關係,不過做正則可以減少兩成左右的訓練時間;
  4. LDA模型在文本分類意義不大,可能是我不該用詞頻方法吧,LSTM效果不知道,主要是不想寫LSTM模型,懶(╯‵□′)╯︵┻━┻;
  5. 最終的分類先做了個TF-IDF的預處理,然後寫了個MLP的模型,sequence的模型蜜汁比batch好,這是我沒想到的,mini-batch沒想好怎麼做,因為文本上下文相關,隨便抓一批也太……,CNN可以提升空間上下文相關性的表達,可惜沒時間寫代碼,哈哈~;
  6. 其他模型沒研究過,寫過再補充吧;

最後安利一波自己的專欄,方便萌新入坑機器學習ヽ( ̄▽ ̄)?:

從零開始構建機器學習模型zhuanlan.zhihu.com圖標


在word embedding後面加dropout,你不信可以試試!

原理就是其實embedded的詞向量已經表示文本的特徵(語義,位置),因為目標是文本分類,跟cnn後面dropout一樣隨機去掉一些特徵,抑制潛在的過擬合,但是我的經驗是在we層後面用要比在cnn後面用性能更好一些。


有一次去曙光調研,問他們文本分類需要特徵選擇嗎?

他們直接說,不用啊,他們的文本都是和行業相關的,直接用字典就行了。


推薦閱讀:

LDA話題模型訓練後,該如何進行文本分類?

TAG:數據挖掘 | 自然語言處理 | 文本分類 | 深度學習DeepLearning | TensorFlow |