產(chǎn)品級垃圾文本分類器

向AI轉型的程序員都關注了這個號???
機器學習AI算法工程?? 公眾號:datayx
任務場景
文本反垃圾是網(wǎng)絡社區(qū)應用非常常見的任務。因為各種利益關系,網(wǎng)絡社區(qū)通常都難以避免地會涌入大量騷擾、色情、詐騙等垃圾信息,擾亂社區(qū)秩序,傷害用戶體驗。這些信息往往隱晦,多變,傳統(tǒng)規(guī)則系統(tǒng)如正則表達式匹配關鍵詞難以應對。通常情況下,文本反垃圾離不開用戶行為分析,本章只針對文本內容部分進行討論。
為了躲避平臺監(jiān)測,垃圾文本常常會使用火星文等方式對關鍵詞進行隱藏。例如:

垃圾文本通常還會備有多個聯(lián)系方式進行用戶導流。識別異常聯(lián)系方式是反垃圾的一項重要工作,但是傳統(tǒng)的識別方法依賴大量策略,攻防壓力大,也容易被突破。例如:

在這個實例中,我們將使用TensorLayer來訓練一個垃圾文本分類器,并介紹如何通過TensorFlow Serving來提供高性能服務,實現(xiàn)產(chǎn)品化部署。這個分類器將解決以上幾個難題,我們不再擔心垃圾文本有多么隱晦,也不再關心它們用的哪國語言或有多少種聯(lián)系方式。
第一步,訓練詞向量,相關代碼在word2vec文件夾,執(zhí)行步驟見word2vec/README.md。
第二步,訓練分類器,相關代碼在network文件夾,執(zhí)行步驟見network/README.md。
第三步,與TensorFlow Serving交互,客戶端代碼在serving文件夾。
代碼??獲?。?/span>
關注微信公眾號 datayx ?然后回復??文本分類? 即可獲取。
AI項目體驗地址 https://loveai.tech
網(wǎng)絡結構
文本分類必然要先解決文本表征問題。文本表征在自然語言處理任務中扮演著重要的角色。它的目標是將不定長文本(句子、段落、文章)映射成固定長度的向量。文本向量的質量會直接影響下游模型的性能。神經(jīng)網(wǎng)絡模型的文本表征工作通常分為兩步,首先將單詞映射成詞向量,然后將詞向量組合起來。有多種模型能夠將詞向量組合成文本向量,例如詞袋模型(Neural Bag-of-Words,NBOW)、遞歸神經(jīng)網(wǎng)絡(Recurrent Neural Network,RNN)和卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network,CNN)。這些模型接受由一組詞向量組成的文本序列作為輸入,然后將文本的語義信息表示成一個固定長度的向量。NBOW模型的優(yōu)點是簡單快速,配合多層全連接網(wǎng)絡能實現(xiàn)不遜于RNN和CNN的分類效果,缺點是向量線性相加必然會丟失很多詞與詞相關信息,無法更精細地表達句子的語義。CNN在語言模型訓練中也被廣泛使用,這里卷積的作用變成了從句子中提取出局部的語義組合信息,多個卷積核則用來保證提取的語義組合的多樣性。RNN常用于處理時間序列數(shù)據(jù),它能夠接受任意長度的輸入,是自然語言處理最受歡迎的架構之一,在短文本分類中,相比NBOW和CNN的缺點是需要的計算時間更長。
實例中我們使用RNN來表征文本,將輸入的文本序列通過一個RNN層映射成固定長度的向量,然后將文本向量輸入到一個Softmax層進行分類。本章結尾我們會再簡單介紹由NBOW和多層感知機(Multilayer Perceptron,MLP)組成的分類器和CNN分類器。實際分類結果中,CNN和MLP兩種分類器的準確率都能達到95%以上(RNN模型由于未知原因準確度較低)。相比之前訓練的SVM分類器所達到的93%左右的準確率,基于神經(jīng)網(wǎng)絡的垃圾文本分類器表現(xiàn)出非常優(yōu)秀的性能。

詞的向量表示
最簡單的詞表示方法是One-hot Representation,即把每個詞表示為一個很長的向量,這個向量的維度是詞表的大小,其中只有一個維度的值為1,其余都為0,這個維度就代表了當前的詞。這種表示方法非常簡潔,但是容易造成維數(shù)災難,并且無法描述詞與詞之間的關系。還有一種表示方法是Distributed Representation,如Word2vec。這種方法把詞表示成一種稠密、低維的實數(shù)向量。該向量可以表示一個詞在一個N維空間中的位置,并且相似詞在空間中的位置相近。由于訓練的時候就利用了單詞的上下文,因此Word2vec訓練出來的詞向量天然帶有一些句法和語義特征。它的每一維表示詞語的一個潛在特征,可以通過空間距離來描述詞與詞之間的相似性。
比較有代表性的Word2vec模型有CBOW模型和Skip-Gram模型。圖2演示了Skip-Gram模型的訓練過程。假設我們的窗口取1,通過滑動窗口我們得到(fox, brown)、(fox, jumps)等輸入輸出對,經(jīng)過足夠多次的迭代后,當我們再次輸入fox時,jumps和brown的概率會明顯高于其他詞。在輸入層與隱層之間的矩陣W1存儲著每一個單詞的詞向量,從輸入層到隱層之間的計算就是取出單詞的詞向量。因為訓練的目標是相似詞得到相似上下文,所以相似詞在隱層的輸出(即其詞向量)在優(yōu)化過程中會越來越接近。訓練完成后我們把W1(詞向量集合)保存起來用于后續(xù)的任務。

Dynamic RNN分類器
傳統(tǒng)神經(jīng)網(wǎng)絡如MLP受限于固定大小的輸入,以及靜態(tài)的輸入輸出關系,在動態(tài)系統(tǒng)建模任務中會遇到比較大的困難。傳統(tǒng)神經(jīng)網(wǎng)絡假設所有輸入都互相獨立,其有向無環(huán)的神經(jīng)網(wǎng)絡的各層神經(jīng)元不會互相作用,不好處理前后輸入有關聯(lián)的問題。但是現(xiàn)實生活中很多問題都是以動態(tài)系統(tǒng)的方式呈現(xiàn)的,一件事物的現(xiàn)狀往往依托于它之前的狀態(tài)。雖然也能通過將一長段時間分成多個同等長度的時間窗口來計算時間窗口內的相關內容,但是這個時間窗的依賴與變化都太多,大小并不好取。目前常用的一種RNN是LSTM,它與標準RNN的不同之處是隱層單元的計算函數(shù)更加復雜,使得RNN的記憶能力變得更強。
在訓練RNN的時候我們會遇到另一個問題。不定長序列的長度有可能范圍很廣,Static RNN由于只構建一次Graph,訓練前需要對所有輸入進行Padding以確保整個迭代過程中每個Batch的長度一致,這樣輸入的長度就取決于訓練集最長的一個序列,導致許多計算資源浪費在Padding部分。Dynamic RNN實現(xiàn)了Graph動態(tài)生成,因此不同Batch的長度可以不同,并且可以跳過Padding部分的計算。這樣每一個Batch的數(shù)據(jù)在輸入前只需Padding到該Batch最長序列的長度,并且根據(jù)序列實際長度中止計算,從而減少空間和計算量。
閱讀過本文的人還看了以下文章:
基于40萬表格數(shù)據(jù)集TableBank,用MaskRCNN做表格檢測
《深度學習入門:基于Python的理論與實現(xiàn)》高清中文PDF+源碼
python就業(yè)班學習視頻,從入門到實戰(zhàn)項目
2019最新《PyTorch自然語言處理》英、中文版PDF+源碼
《21個項目玩轉深度學習:基于TensorFlow的實踐詳解》完整版PDF+附書代碼
PyTorch深度學習快速實戰(zhàn)入門《pytorch-handbook》
【下載】豆瓣評分8.1,《機器學習實戰(zhàn):基于Scikit-Learn和TensorFlow》
《Python數(shù)據(jù)分析與挖掘實戰(zhàn)》PDF+完整源碼
汽車行業(yè)完整知識圖譜項目實戰(zhàn)視頻(全23課)
李沐大神開源《動手學深度學習》,加州伯克利深度學習(2019春)教材
筆記、代碼清晰易懂!李航《統(tǒng)計學習方法》最新資源全套!
《神經(jīng)網(wǎng)絡與深度學習》最新2018版中英PDF+源碼
重要開源!CNN-RNN-CTC 實現(xiàn)手寫漢字識別
【Keras】完整實現(xiàn)‘交通標志’分類、‘票據(jù)’分類兩個項目,讓你掌握深度學習圖像分類
VGG16遷移學習,實現(xiàn)醫(yī)學圖像識別分類工程項目
特征工程(二) :文本數(shù)據(jù)的展開、過濾和分塊
如何利用全新的決策樹集成級聯(lián)結構gcForest做特征工程并打分?
Machine Learning Yearning 中文翻譯稿
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
python+flask搭建CNN在線識別手寫中文網(wǎng)站
中科院Kaggle全球文本匹配競賽華人第1名團隊-深度學習與特征工程
不斷更新資源
深度學習、機器學習、數(shù)據(jù)分析、python
?搜索公眾號添加:?datayx??
機大數(shù)據(jù)技術與機器學習工程
?搜索公眾號添加:?datanlp
長按圖片,識別二維碼
