實戰:手把手教你用樸素貝葉斯對文檔進行分類

  • 2020 年 2 月 19 日
  • 筆記

樸素貝葉斯分類最適合的場景就是文本分類、情感分析和垃圾郵件識別。其中情感分析和垃圾郵件識別都是通過文本來進行判斷。所以樸素貝葉斯也常用於自然語言處理 NLP 的工具。

sklearn 機器學習包

sklearn 的全稱叫 Scikit-learn,它給我們提供了 3 個樸素貝葉斯分類算法,分別是高斯樸素貝葉斯(GaussianNB)、多項式樸素貝葉斯MultinomialNB)和伯努利樸素貝葉斯(BernoulliNB)。

這三種算法適合應用在不同的場景下,我們應該根據特徵變量的不同選擇不同的算法:

高斯樸素貝葉斯:特徵變量是連續變量,符合高斯分佈,比如說人的身高,物體的長度。 多項式樸素貝葉斯:特徵變量是離散變量,符合多項分佈,在文檔分類中特徵變量體現在一個單詞出現的次數,或者是單詞的 TF-IDF 值等。 伯努利樸素貝葉斯:**特徵變量是布爾變量,符合 0/1 分佈**,在文檔分類中特徵是單詞是否出現。

伯努利樸素貝葉斯是以文件為粒度,如果該單詞在某文件中出現了即為 1,否則為 0。而多項式樸素貝葉斯是以單詞為粒度,會計算在某個文件中的具體次數。

> 如身高、體重這種自然界的現象就比較適合用高斯樸素貝葉斯來處理。而文本分類是使用多項式樸素貝葉斯或者伯努利樸素貝葉斯。

什麼是 TF-IDF 值呢?

TF-IDF 是一個統計方法,用來評估某個詞語對於一個文件集或文檔庫中的其中一份文件的重要程度。

詞頻 TF計算了一個單詞在文檔中出現的次數,它認為一個單詞的重要性和它在文檔中出現的次數呈正比。

逆向文檔頻率 IDF,是指一個單詞在文檔中的區分度。它認為一個單詞出現在的文檔數越少,就越能通過這個單詞把該文檔和其他文檔區分開。IDF 越大就代表該單詞的區分度越大。

所以 TF-IDF 實際上是詞頻 TF 和逆向文檔頻率 IDF 的乘積。這樣我們傾向於找到 TF 和 IDF 取值都高的單詞作為區分,即這個單詞在一個文檔中出現的次數多,同時又很少出現在其他文檔中。這樣的單詞適合用於分類。

TF-IDF 如何計算

些單詞可能不會存在文檔中,為了避免分母為 0,統一給單詞出現的文檔數都加 1。

舉個例子 假設一個文件夾里一共有 10 篇文檔,其中一篇文檔有 1000 個單詞,「this」這個單詞出現 20 次,「bayes」出現了 5 次。「this」在所有文檔中均出現過,而「bayes」只在 2 篇文檔中出現過。

針對「this」,計算 TF-IDF 值:

所以 TF-IDF=0.02*(-0.0414)=-8.28e-4。

針對「bayes」,計算 TF-IDF 值:

TF-IDF=0.005*0.5229=2.61e-3。

很明顯「bayes」的 TF-IDF 值要大於「this」的 TF-IDF 值。這就說明用「bayes」這個單詞做區分比單詞「this」要好。

如何求 TF-IDF

在 sklearn 中我們直接使用 TfidfVectorizer 類,它可以幫我們計算單詞 TF-IDF 向量的值。

在這個類中,取 sklearn 計算的對數 log 時,底數是 e,不是 10。

創建 TfidfVectorizer 的方法是:


當我們創建好 TF-IDF 向量類型時,可以用 fit_transform 幫我們計算,返回給我們文本矩陣,該矩陣表示了每個單詞在每個文檔中的 TF-IDF 值。

在我們進行 fit_transform 擬合模型後,我們可以得到更多的 TF-IDF 向量屬性,比如,我們可以得到詞彙的對應關係(字典類型)和向量的 IDF 值,當然也可以獲取設置的停用詞 stop_words。

現在想要計算文檔里都有哪些單詞,這些單詞在不同文檔中的 TF-IDF 值是多少呢?

首先我們創建 TfidfVectorizer 類:


如何對文檔進行分類

1. 基於分詞的數據準備,包括分詞、單詞權重計算、去掉停用詞; 2. 應用樸素貝葉斯分類進行分類,首先通過訓練集得到樸素貝葉斯分類器,然後將分類器應用於測試集,並與實際結果做對比,最終得到測試集的分類準確率。

一般來說 NTLK 包適用於英文文檔,而 jieba 適用於中文文檔。我們可以根據文檔選擇不同的包,對文檔提取分詞。這些分詞就是貝葉斯分類中最重要的特徵屬性。基於這些分詞,我們得到分詞的權重,即特徵矩陣。

在這個鏈接下下載數據集:github.com/cystanford/t


End.

作者:求知鳥

來源:知乎