基于sklearn的朴素贝叶斯_朴素贝叶斯分类实战:对文档进行分类
樸素貝葉斯分類最適合的場景就是文本分類、情感分析和垃圾郵件識別。其中情感分析和垃圾郵件識別都是通過文本來進行判斷。所以樸素貝葉斯也常用于自然語言處理 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 類:
from sklearn.feature_extraction.text import TfidfVectorizer tfidf_vec = TfidfVectorizer() documents = ['this is the bayes document','this is the second second document','and the third one','is this the document' ] tfidf_matrix = tfidf_vec.fit_transform(documents) print('不重復的詞:', tfidf_vec.get_feature_names()) print('每個單詞的 ID:', tfidf_vec.vocabulary_) #輸出每個單詞在每個文檔中的 TF-IDF 值,向量里的順序是按照詞語的 id 順序來的: print('每個單詞的 tfidf 值:', tfidf_matrix.toarray())輸出 不重復的詞: ['and', 'bayes', 'document', 'is', 'one', 'second', 'the', 'third', 'this'] 每個單詞的 ID: {'this': 8, 'is': 3, 'the': 6, 'bayes': 1, 'document': 2, 'second': 5, 'and': 0, 'third': 7, 'one': 4} 每個單詞的 tfidf 值: [[0. 0.63314609 0.40412895 0.40412895 0. 0.0.33040189 0. 0.40412895][0. 0. 0.27230147 0.27230147 0. 0.853225740.22262429 0. 0.27230147][0.55280532 0. 0. 0. 0.55280532 0.0.28847675 0.55280532 0. ][0. 0. 0.52210862 0.52210862 0. 0.0.42685801 0. 0.52210862]]如何對文檔進行分類
1、基于分詞的數據準備,包括分詞、單詞權重計算、去掉停用詞; 2、應用樸素貝葉斯分類進行分類,首先通過訓練集得到樸素貝葉斯分類器,然后將分類器應用于測試集,并與實際結果做對比,最終得到測試集的分類準確率。一般來說 NTLK 包適用于英文文檔,而 jieba 適用于中文文檔。我們可以根據文檔選擇不同的包,對文檔提取分詞。這些分詞就是貝葉斯分類中最重要的特征屬性。基于這些分詞,我們得到分詞的權重,即特征矩陣。
在這個鏈接下下載數據集:https://github.com/cystanford/text_classification
train_contents=[] train_labels=[] test_contents=[] test_labels=[] # 導入文件 import os import io start=os.listdir(r'C:/Users/baihua/Desktop/text classification/train') for item in start:test_path='C:/Users/baihua/Desktop/text classification/test/'+item+'/'train_path='C:/Users/baihua/Desktop/text classification/train/'+item+'/'for file in os.listdir(test_path):with open(test_path+file,encoding="GBK") as f:test_contents.append(f.readline())#print(test_contents)test_labels.append(item)for file in os.listdir(train_path):with open(train_path+file,encoding='gb18030', errors='ignore') as f:train_contents.append(f.readline())train_labels.append(item) print(len(train_contents),len(test_contents))# 導入stop word import jieba from sklearn import metrics from sklearn.naive_bayes import MultinomialNB #stop_words = [line.strip() for line in io.open(r'C:/Users/baihua/Desktop/stopword.txt').readlines()] with open(r'C:/Users/baihua/Desktop/stopword.txt', 'rb') as f:stop_words = [line.strip() for line in f.readlines()]# 分詞方式使用jieba,計算單詞的權重 tf = TfidfVectorizer(tokenizer=jieba.cut,stop_words=stop_words, max_df=0.5)##注意數據結構:stop_words是list,過濾詞token_parten是正則表達式 train_features = tf.fit_transform(train_contents)#該函數返回文本矩陣,表示每個單詞在每個文檔中的TF-IDF值 print(train_features.shape)#模塊 4:生成樸素貝葉斯分類器 # 多項式貝葉斯分類器 clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)#模塊 5:使用生成的分類器做預測 test_tf = TfidfVectorizer(tokenizer=jieba.cut,stop_words=stop_words, max_df=0.5, vocabulary=tf.vocabulary_) test_features=test_tf.fit_transform(test_contents) predicted_labels=clf.predict(test_features) #模塊六,計算準確性 from sklearn import metrics print (metrics.accuracy_score(test_labels, predicted_labels)) #print(test_features.shape) #print(metrics.accuracy_score(test_labels, predicted_labels))參考文獻
數據分析實戰45講
Python NLTK 處理原始文本?cloud.tencent.com總結
以上是生活随笔為你收集整理的基于sklearn的朴素贝叶斯_朴素贝叶斯分类实战:对文档进行分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux rmp命令安装包在哪里_【M
- 下一篇: postman 设置请求编码_Postm