11. HanLP實現樸素貝葉斯/SVM--文本分類

筆記轉載於GitHub項目https://github.com/NLP-LOVE/Introduction-NLP

11. 文本分類

上一章我們學習了 文本聚類,體驗了無須標註語料庫的便利性。然而無監督學習總歸無法按照我們的意志預測出文檔的類別,限制了文本聚類的應用場景。有許多場景需要將文檔分門別類地歸人具體的類別中,比如垃圾郵件過濾和社交媒體的自動標籤推薦。在這一章中, 我們將介紹如何實現這些需求。

11.1 文本分類的概念

文本分類( text classification),又稱文檔分類( document classification),指的是將一個文檔歸類到一個或多個類別中的自然語言處理任務。文本分類的應用場景非常廣泛,涵蓋垃圾郵件過濾、垃圾評論過濾、自動標籤、情感分析等任何需要自動歸檔文本的場合。

文本的類別有時又稱作標籤,所有類別組成了標註集,文本分類輸出結果一定屬於標註集。

文本分類是一個典型的監督學習任務,其流程離不開人工指導: 人工標註文檔的類別,利用語料訓練模型,利用模型預測文檔的類別。

11.2 文本分類語料庫

文本分類語料庫的標註過程相對簡單,只需收集一些文檔, 人工指定每篇文檔的類別即可。另外,許多新聞網站的欄目是由編輯人工整理的,如果欄目設置符合要求,也可以用爬蟲爬取下來作語料庫使用。其中,搜狗實驗室就提供了這樣一份語料庫 ,詳情見代碼(自動下載語料庫): load_text_classification_corpus.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch11/load_text_classification_corpus.py

運行結果如下:

標註集:[教育, 汽車, 健康, 軍事, 體育, 自然語言處理]
第一篇文檔的類別:教育

當語料庫就緒時,文本分類的流程一般分爲特徵提取和分類器處理兩大步。

11.3 文本分類的特徵提取

在機器學習中,我們需要對具體對象提取出有助於分類的特徵,才能交給某個分類器進行分類。這些特徵數值化後爲一個定長的向量(數據點),用來作爲分類器的輸入。在訓練時,分類器根據數據集中的數據點學習出決策邊界。在預測時,分類器根據輸人的效據點落在決策邊界的位置來決定類別。

我們依然使用詞袋向量作爲特徵向量,詞袋向量是詞語顆粒度上的頻次或 TF-IDF 向量,先進行分詞處理

  1. 分詞

    HanLP 允許爲數據集的構造函數指定一個分詞器 ITokenizer,用來實現包括分詞在內的預處理邏輯。

    實現 應用場景
    HanLPTokenizer 中文文本,使用NotionalTokenizer分詞並過濾停用詞
    BlankTokenizer 英文文本,使用空格分詞
    BigramTokenizer 中文文本,將相鄰字符作爲二元語法輸出
  2. 卡方特徵選擇

    在文本分類時會有這樣一個問題,比如漢語中的虛詞“的”,這些詞在所有類別的文檔中均勻出現,爲了消除這些單詞的影響,一方面可以用停用詞表,另一方面可以用卡方非參數檢驗來過濾掉與類別相關程度不高的詞語。

    在統計學上,卡方檢驗常用於檢驗兩個事件的獨立性,如果兩個隨機事件 A 和 B 相互獨立,則兩者同時發生的概率P(AB)= P(A)P(B)。如果將詞語的出現與類別的出現作爲兩個隨機事件則類別獨立性越高的詞語越不適合作爲特徵。如果將某個事件的期望記作 E,實際出現(觀測)的頻次記作 N,則卡方檢驗衡量期望與觀測的相似程度。卡方檢驗值越高,則期望和觀測的計數越相化也更大程度地否定了獨立性。

    一旦確定了哪些特徵有用,接下來就可以將文檔轉化爲向量了。

  3. 詞袋向量

    我們提取的是 TF 特徵,統計出每個特徵及其頻次。以特徵的 id 作爲下標,頻次作爲數值,假設一共有 n 個特徵,一篇文檔就轉化爲 n 維的詞袋向量。沿用機器學習文獻的習慣,將詞袋向量記作 x,向量的第 i 維記作 X1。將類別記
    作 y,其中 K 爲類別總數。則語料庫(訓練數據集) T 可以表示爲詞袋向量 x 和類別 y 所構成的二元組的集合:
    T={(x(1),y1),(x(2),y2),,(x(N),yN)} T=\left\{\left(x^{(1)}, y_{1}\right),\left(x^{(2)}, y_{2}\right), \cdots,\left(x^{(N)}, y_{N}\right)\right\}
    在不進行特徵選擇的前提下,如果以詞語作爲特徵,則 n 大約在 10 萬量級;如果以字符二元語法作爲特徵,則 n 大約在 50 萬量級。數十萬維的向量運算開銷不容小覷,一般利用卡方特徵選擇,可以將特徵數量減小到10% ~ 20%左右。

    當文檔被轉化爲向量後,就可以利用機器學習進行訓練了。

11.4 樸素貝葉斯分類器

在各種各樣的分類器中,樸素貝葉斯法( naive Bayes)可算是最簡單常用的一種生成式模型。樸素貝葉斯法基於貝葉斯定理將聯合概率轉化爲條件概率,然後利用特徵條件獨立假設簡化條件概率的計算。

  1. 樸素貝葉斯法原理

    樸素貝葉斯法的目標是通過訓練集學習聯合概率分佈 P(X,Y),由貝葉斯定理可以將聯合概率轉換爲先驗概率分佈與條件概率分佈之積:
    p(X=x,Y=ck)=p(Y=ck)p(X=xY=ck) p\left(X=x, Y=c_{k}\right)=p\left(Y=c_{k}\right) p\left(X=x | Y=c_{k}\right)

    • 首先計算先驗概率分佈 P(Y=Ck),通過統計每個類別下的樣本數:
      p(Y=ck)=count(Y=ck)N p\left(Y=c_{k}\right)=\frac{\operatorname{count}\left(Y=c_{k}\right)}{N}
  • 然後計算 P(X=x|Y=Ck),這個難以估計,因爲 x 的量級非常大,可以從下式看出來:
    p(X=xY=ck)=p(X1=x1,,Xn=xnY=ck),k=1,2,,K p\left(X=\boldsymbol{x} | Y=c_{k}\right)=p\left(X_{1}=\boldsymbol{x}_{1}, \cdots, X_{n}=\boldsymbol{x}_{n} | Y=c_{k}\right), k=1,2, \cdots, K
    該條件概率分佈的參數數量是指數級的,難以估計。

    爲此樸素貝葉斯法“樸素”的假設了所有特徵是條件獨立的:
    p(X=xY=ck)=p(X1=x1,,Xn=xnY=ck)=i=1np(Xi=xiY=ck) \begin{aligned} p\left(X=\boldsymbol{x} | Y=c_{k}\right) &=p\left(X_{1}=\boldsymbol{x}_{1}, \cdots, X_{n}=\boldsymbol{x}_{n} | Y=c_{k}\right) \\ &=\prod_{i=1}^{n} p\left(X_{i}=\boldsymbol{x}_{i} | Y=c_{k}\right) \end{aligned}
    於是,又可以利用極大似然來進行估計:
    p(Xi=xiY=ck)=count(Xi=xi,yi=ck)count(yi=ck) p\left(X_{i}=\boldsymbol{x}_{i} | Y=c_{k}\right)=\frac{\operatorname{count}\left(X_{i}=\boldsymbol{x}_{i}, y_{i}=c_{k}\right)}{\operatorname{count}\left(y_{i}=c_{k}\right)}

    • 預測時,樸素貝葉斯法依然利用貝葉斯公式找出後驗概率 P(Y=Ck|X=x) 最大的類別 Ck 作爲輸出 y:
      y=argmaxckp(Y=ckX=x) y=\arg \max _{c_{k}} p\left(Y=c_{k} | X=x\right)
      將貝葉斯公式帶入上式得:
      y=argmaxckp(X=xY=ck)p(Y=ck)p(X=x) y=\arg \max _{c_{k}} \frac{p\left(X=\boldsymbol{x} | Y=c_{k}\right) p\left(Y=c_{k}\right)}{p(X=\boldsymbol{x})}

    • 最終,由於分母與 Ck 無關,可以省略掉,然後將獨立性假設帶入,得到最終的分類預測函數:
      y=argmaxckp(Y=ck)i=0np(Xi=xiY=ck) y=\arg \max _{c_{k}} p\left(Y=c_{k}\right) \prod_{i=0}^{n} p\left(X_{i}=x_{i} | Y=c_{k}\right)

  1. 樸素貝葉斯分類器實現

    實現代碼詳見: text_classification.py

    https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch11/text_classification.py

    運行結果如下:

    《C羅獲2018環球足球獎最佳球員 德尚榮膺最佳教練》	屬於分類	【體育】
    《英國造航母耗時8年仍未服役 被中國速度遠遠甩在身後》	屬於分類	【軍事】
    《 研究生考錄模式亟待進一步專業化》	屬於分類	【教育】
    《如果真想用食物解壓,建議可以食用燕麥》	屬於分類	【健康】
    《通用及其部分競爭對手目前正在考慮解決庫存問題》	屬於分類	【汽車】
    

    樸素貝葉斯法實現簡單,但由於特徵獨立性假設過於強烈,有時會影響準確性,下面開始介紹更加健壯的支持向量機分類器。

11.5 支持向量機

支持向量機( Support Vector Machine, SVM)是一種二分類模型,其學習策略在於如何找出一個決策邊界,使得邊界到正負樣本的最小距離都最遠。這種策略使得支持向量機有別於感知機,能夠找到一個更加穩健的決策邊界。支持向量機最簡單的形式爲線性支持向量機,其決策邊界爲一個超平面,適用於線性可分數據集。

有關支持向量機(SVM)的原理詳見我的博客,這裏不加詳細介紹:

http://mantchs.com/2019/07/11/ML/SVM/

線性支持向量機文本分類器實現

實現代碼詳見: svm_text_classification.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch11/svm_text_classification.py

可能第一次運行失敗,java類沒有加載,重啓環境運行就可以了,運行結果如下:

《C羅獲2018環球足球獎最佳球員 德尚榮膺最佳教練》	屬於分類	【體育】
《潛艇具有很強的戰略威懾能力與實戰能力》	屬於分類	【軍事】
《 研究生考錄模式亟待進一步專業化》	屬於分類	【汽車】
《如果真想用食物解壓,建議可以食用燕麥》	屬於分類	【健康】
《通用及其部分競爭對手目前正在考慮解決庫存問題》	屬於分類	【汽車】

11.6 標準化評測

本次評測採用兩種分類器和兩種分詞器搭配進行評估,所有試驗採用的數據集皆爲搜狗文本分類語料庫,特徵剪裁算法皆爲卡方檢驗。

我們在搜狗文本分類語料庫上對{樸素貝葉斯,支持向量機} * {中文分詞(HanLPTokenizer),二元語法(BigramTokenizer)}的 4 種搭配組合做評測。

評測代碼詳見: text_classification_evaluation.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch11/text_classification_evaluation.py

評測結果如下表:

算法+分詞 P R F1 文檔/秒
樸素貝葉斯+中文分詞 96.16 96 96.08 6172
樸素貝葉斯+二元語法 96.36 96.2 96.28 3378
SVM + 中文分詞 97.24 97.2 97.22 27777
SVM + 二元語法 97.83 97.8 97.81 12195
  • 中文文本分類的確不需要分詞,不分詞直接用元語法反而能夠取得更高的準確率。只不過由於二元語法數量比單詞多,導致參與運算的特徵更多,相應的分類速度減半。
  • 線性支持向量機的分類準確率更高,而且分類速度更快,推薦使用。

11.7 情感分析

文本情感分析指的是提取文本中的主觀信息的一種 NLP 任務,其具體目標通常是找出文本對應的正負情感態度。情感分析可以在實體、句子、段落乃至文檔上進行。本文介紹文檔級別的情感分析,當然也適用於段落和句子。

對於情感分析而言,只需要準備標註了正負情感的大量文檔,就能將其視作普通的文本分類任務來解決。

  1. ChnsentiCorp情感分析語料庫

    該語料庫由譚鬆波博士整理髮布,包含酒店、電腦與書籍三個行業的評論與相應情感極性。文檔內容爲數十字的簡短評論。

  2. 訓練情感分析模型

    實現代碼詳見: sentiment_analysis.py

    https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch11/sentiment_analysis.py

    運行結果如下:

    《前臺客房服務態度非常好!早餐很豐富,房價很乾淨。再接再厲!》 情感極性是 【正面】
    《結果大失所望,燈光昏暗,空間極其狹小,牀墊質量惡劣,房間還伴着一股黴味。》 情感極性是 【負面】
    《可利用文本分類實現情感分析,效果不是不行》 情感極性是 【負面】
    

    值得注意的是,最後一個測試案例“可利用文本分類實現情感分析,效果不是不行”雖然不屬於酒店評論,但結果依然是正確地,這說明該統計模型有一定的泛化能力,能處理一些其他行業的文本。

11.8 GitHub

HanLP何晗–《自然語言處理入門》筆記:

https://github.com/NLP-LOVE/Introduction-NLP

項目持續更新中…

目錄


章節
第 1 章:新手上路
第 2 章:詞典分詞
第 3 章:二元語法與中文分詞
第 4 章:隱馬爾可夫模型與序列標註
第 5 章:感知機分類與序列標註
第 6 章:條件隨機場與序列標註
第 7 章:詞性標註
第 8 章:命名實體識別
第 9 章:信息抽取
第 10 章:文本聚類
第 11 章:文本分類
第 12 章:依存句法分析
第 13 章:深度學習與自然語言處理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章