• <menu id="w2i4a"></menu>
  • logo 大數(shù)據(jù)干貨(二)

    文檔首頁>>大數(shù)據(jù)干貨(二)>>實(shí)戰(zhàn)文本分類,深度學(xué)習(xí)是最優(yōu)算法嗎?

    實(shí)戰(zhàn)文本分類,深度學(xué)習(xí)是最優(yōu)算法嗎?


     

     

    1 什么是文本分類?

    文本分類 (Text classification) 指的是給定一篇文章,自動判斷該文章所屬的預(yù)先定義好的標(biāo)簽類別 (比如體育、娛樂或者新聞類別等),是自然語言處理 (Natural language processing,NLP) 領(lǐng)域的主要研究方向之一 [1]。

    文本分類有著廣闊的應(yīng)用場景,比如垃圾郵件檢測 (Spam email detection) 和評論情感分析 (Sentiment analysis) ,本質(zhì)上都可以看做是具有兩種標(biāo)簽類別的文本分類任務(wù):

    垃圾郵件檢測——判斷郵件是否屬于垃圾郵件和非垃圾郵件這兩類;
    評論情感分析——判斷評論是否屬于正面郵件和負(fù)面評論這兩類。

    每天,熱巢的工程師都會分析上百萬中國社交網(wǎng)絡(luò)上的熱門內(nèi)容,熱巢平臺上的大量功能,背后都有機(jī)器學(xué)習(xí)處理文本分類的功勞。

    2 文本分類的技術(shù)發(fā)展歷史

    對文本分類的研究可以追溯到二十世紀(jì)五十年代,當(dāng)時(shí)主要依據(jù)特定的人工規(guī)則進(jìn)行文本分類。
    到二十世紀(jì)九十年代,統(tǒng)計(jì)機(jī)器學(xué)習(xí) (Statistical machine learning) 成為主流,一些統(tǒng)計(jì)機(jī)器學(xué)習(xí)方法,比如支持向量機(jī) (Support vector machine, SVM) [2] 和樸素貝葉斯 (Naive Bayes) [3] 等分類方法在文本分類中取得了非常高的分類準(zhǔn)確率。然而,統(tǒng)計(jì)機(jī)器學(xué)習(xí)方法首先需要進(jìn)行特征工程 (Feature engineering) 工作,該工作需要深入理解業(yè)務(wù)需求,并且非常耗時(shí)耗力。
    隨著大數(shù)據(jù)量 (Big data) 和圖形處理單元 (Graphics processing unit, GPU) 強(qiáng)計(jì)算力的支持,深度學(xué)習(xí) (Deep learning) 近年來發(fā)展迅速,在計(jì)算機(jī)視覺 (Computer vision, CV)、語音識別 (Speech recognition) 和自然語言處理領(lǐng)域都有著廣泛研究與應(yīng)用 [4]。與統(tǒng)計(jì)機(jī)器學(xué)習(xí)方法相比,深度學(xué)習(xí)方法可以自動提取特征,使得人們將注意力更多地集中在數(shù)據(jù)和模型上。

    3 實(shí)戰(zhàn)文本分類:CNN模型 VS fastText模型

    關(guān)于卷積神經(jīng)網(wǎng)絡(luò)(Convolutional neural network, CNN)

    卷積神經(jīng)網(wǎng)絡(luò) (Convolutional neural network, CNN) [5] 是經(jīng)典的深度學(xué)習(xí)模型之一,在大規(guī)模圖像識別競賽 (Large scale visual recognition challenge, ILSVRC) 中取得巨大成功。CNN模型的局部連接 (Local connectivity) 和權(quán)值共享 (Parameter sharing) 兩大特性有效地提取了數(shù)據(jù)特征并降低了模型參數(shù)以加快模型訓(xùn)練。

    圖1:Kim Yoon 提出的用于文本分類的CNN模型結(jié)構(gòu)
    圖1:Kim Yoon 提出的用于文本分類的CNN模型結(jié)構(gòu)

    KimYoon [6] 首次提出將CNN模型應(yīng)用在文本分類中(見圖1)。在該模型中,第一步是詞嵌入層 (Word embedding layer),將每個(gè)詞表示為固定長度的稠密的詞向量 (關(guān)于詞嵌入的理論部分,我們還會繼續(xù)發(fā)文介紹)。第二步是卷積層 (Convolutionallayer),采用不同大小的卷積核從上到下依次對詞向量進(jìn)行卷積操作。第三步是池化層 (Pooling layer),采取的是最大池化 (Max-pooling) 操作。第四步是全連接層 (Fully connected layer, 包括了Dropout層),對輸出標(biāo)簽類別進(jìn)行預(yù)測。

    關(guān)于fastText

    2016年8月份,F(xiàn)acebook開源了fastText工具,用于快速進(jìn)行文本表示與文本分類任務(wù) [7]。fastText的模型結(jié)構(gòu)非常簡單 (圖2),單個(gè)詞或者ngram組合詞的詞向量取平均后代表該文本的向量,使用softmax函數(shù)預(yù)測文本所屬各標(biāo)簽類別的概率,損失函數(shù) (Loss function) 是真實(shí)標(biāo)簽類別與預(yù)測標(biāo)簽類別之間的負(fù)對數(shù)似然 (Negative log-likelihood)。與“深層”的CNN模型相比,fastText的模型結(jié)構(gòu)是“淺層”的。

    圖 2. fastText模型結(jié)構(gòu)。x1, x2, …, xN 分別表示文本的N個(gè)ngram 特征
    圖 2. fastText模型結(jié)構(gòu)。x1, x2, …, xN 分別表示文本的N個(gè)ngram 特征

    開始實(shí)驗(yàn)

    接下來將分別使用CNN模型和fastText模型在公開數(shù)據(jù)集上進(jìn)行文本分類,以分類準(zhǔn)確度和模型訓(xùn)練耗時(shí)兩個(gè)角度評估兩個(gè)模型的表現(xiàn)。

    相對于圖像和語音來說,文字已經(jīng)是高度抽象的概念了,因此對文本分析并不需要太深的網(wǎng)絡(luò)結(jié)構(gòu)。在這里使用深度學(xué)習(xí)框架keras [8] 搭建了CNN模型,其結(jié)構(gòu)為:詞嵌入層-Dropout層-卷積層-Dropout層-池化層-全連接層-Dropout層-全連接層。在fastText 的官方GitHub上 [9] 下載并編譯了fastText模型。

    實(shí)驗(yàn)所需公開測試數(shù)據(jù)來自搜狗實(shí)驗(yàn)室新聞數(shù)據(jù)完整版 [10],包括了搜狐新聞2012年6月到7月期間國內(nèi)、國際、體育、社會和娛樂等18個(gè)標(biāo)簽類別的新聞數(shù)據(jù)。在依次經(jīng)過數(shù)據(jù)提取、中文分詞、去停用詞、過濾小于10個(gè)詞的文本和文本去重一系列文本預(yù)處理操作后,選取其中汽車、財(cái)經(jīng)、IT、健康、體育和娛樂6個(gè)標(biāo)簽類別,每個(gè)標(biāo)簽類別下隨機(jī)打亂后選取15,000個(gè)樣本作為訓(xùn)練數(shù)據(jù)集 (Training data),3,000個(gè)樣本作為測試數(shù)據(jù)集 (Testing data),即實(shí)驗(yàn)使用的訓(xùn)練數(shù)據(jù)集大小為90,000,測試數(shù)據(jù)集大小為18,000。

    本實(shí)驗(yàn)在CentOS 平臺運(yùn)行,由于fastText模型訓(xùn)練不需要GPU加速,因此在訓(xùn)練CNN模型時(shí)也沒有使用GPU。實(shí)驗(yàn)使用的相關(guān)軟件以及版本分別是中文分詞工具jieba (0.38) [11], 詞向量訓(xùn)練工具gensim (2.1) [12] 和CNN模型實(shí)現(xiàn)深度學(xué)習(xí)框架keras (2.0)。編程語言是 Python 2.7。

    實(shí)驗(yàn)結(jié)果

    經(jīng)過一系列超參數(shù) (Hyper-parameter) 調(diào)整后,在分類準(zhǔn)確度方面,CNN模型迭代 (Epoch) 訓(xùn)練數(shù)據(jù)7次后,在測試數(shù)據(jù)集上的分類準(zhǔn)確度為95.7 % (圖3)。fastText模型在相同測試數(shù)據(jù)集上的分類準(zhǔn)確度為 95.8 % (圖4)。也就是說,在該測試數(shù)據(jù)集上,兩個(gè)模型的分類準(zhǔn)確度是基本一致的。


    圖 3. CNN模型實(shí)驗(yàn)結(jié)果

    圖 3. CNN模型實(shí)驗(yàn)結(jié)果


    圖 4. fastText模型實(shí)驗(yàn)結(jié)果
    圖 4. fastText模型實(shí)驗(yàn)結(jié)果

    運(yùn)行時(shí)間方面,fastText模型總共只需要27秒鐘就可以完成模型的訓(xùn)練與預(yù)測 (圖4),而CNN模型完成相同的操作耗時(shí)2212秒 (圖3),也就是說fastText模型遠(yuǎn)遠(yuǎn)快于CNN模型。實(shí)驗(yàn)使用的標(biāo)簽類別和相應(yīng)數(shù)據(jù)量并不是太大,在工業(yè)界業(yè)務(wù)需求中往往有成百上千個(gè)標(biāo)簽類別,fastText在更大規(guī)模的數(shù)據(jù)集上的優(yōu)勢更加明顯 [7]。

    值得注意的是,fastText除了可以進(jìn)行有監(jiān)督學(xué)習(xí)的文本分類外,還可以進(jìn)行無監(jiān)督的詞向量學(xué)習(xí)。有了詞向量后,可以直觀地查看語義相關(guān)詞。



    比如,圖5展示了與輸入詞“梁朝偉”最相關(guān)的詞是:聽風(fēng)者?!堵狅L(fēng)者》是梁朝偉和周迅等在2012年主演的一部影片,由于訓(xùn)練數(shù)據(jù)是2012年采集的,因此詞向量準(zhǔn)確地捕捉到了兩個(gè)詞之間的相關(guān)關(guān)系。與輸入詞“奔馳”語義最相關(guān)的詞是:寶馬,可以想象2012年兩個(gè)車系的競品關(guān)系。

    實(shí)驗(yàn)討論

    如前文所述,與圖像和語音不同,人類的語言已經(jīng)是高度抽象的概念了。對于文本分類任務(wù)來說,在良好的特征工程基礎(chǔ)上,線性分類器也可以取得很好的效果 [7]。文本分類還是比較偏線性的任務(wù),因此“淺層”的fastText模型就可以達(dá)到與“深層”的CNN模型相似的分類準(zhǔn)確度。依此類推,為了解決業(yè)務(wù)需求,具體在選擇算法模型時(shí)要充分理解任務(wù)屬性,依據(jù)數(shù)據(jù)量大小和算法模型本身的優(yōu)缺點(diǎn)選擇合適的解決方案。

    除了將CNN模型應(yīng)用在文本分類任務(wù)上之外,還可以將其他深度學(xué)習(xí)模型應(yīng)用在文本分類上,比如循環(huán)神經(jīng)網(wǎng)絡(luò) (Recurrent neural network, RNN) [13],基于注意力 (Attention) 機(jī)制的遞歸神經(jīng)網(wǎng)絡(luò) [14],循環(huán)卷積神經(jīng)網(wǎng)絡(luò) (Recurrent convolutional neural network, RCNN) [15] 等。由于在此實(shí)驗(yàn)中CNN模型已經(jīng)取得了不錯(cuò)的結(jié)果,因此在這里沒有嘗試其他深度學(xué)習(xí)模型。

    目前深度學(xué)習(xí)已經(jīng)分別在計(jì)算機(jī)視覺和語音識別領(lǐng)域取得了state-of-the-art的結(jié)果,近年來在自然語言處理領(lǐng)域有著廣闊的研究。有趣的是,有人指出深度學(xué)習(xí)并不能很容易地應(yīng)用在自然語言處理上 [16]。該文章指出神經(jīng)網(wǎng)絡(luò)適用于處理連續(xù)稠密的數(shù)據(jù) (比如圖像和語音),而自然語言在單詞/符號水平 (Word/symbol level) 上的并不是連續(xù)的,在概念/意義水平 (Concept/meaning level) 上才是連續(xù)的。神經(jīng)網(wǎng)絡(luò)在單詞水平上進(jìn)行分析會受限于訓(xùn)練數(shù)據(jù)集,模型訓(xùn)練完畢后泛化誤差 (Generalization error) 較大。

    因此,不同的算法模型都有不同的優(yōu)勢和劣勢,技術(shù)團(tuán)隊(duì)勢必需要充分理解具體的業(yè)務(wù)需求后,才能提供最佳的技術(shù)解決方案并提升解決問題的效率。

     

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();