芝麻HTTP:記scikit-learn貝葉斯文本分類的坑,scikit-learn貝葉斯
基本步驟:
1、訓練素材分類:
我是參考官方的目錄結構:
每個目錄中放對應的文本,一個txt檔案一篇對應的文章:就像下面這樣
需要注意的是所有素材比例請保持在相同的比例(根據訓練結果酌情調整、不可比例過於懸殊、容易造成過擬合(通俗點就是大部分文章都給你分到素材最多的那個類別去了))
廢話不多說直接上代碼吧(測試代碼的醜得一逼;將就著看看吧)
需要一個小工具: pip install chinese-tokenizer
這是訓練器:
import reimport jiebaimport jsonfrom io import BytesIOfrom chinese_tokenizer.tokenizer import Tokenizerfrom sklearn.datasets import load_filesfrom sklearn.feature_extraction.text import CountVectorizer, TfidfTransformerfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.externals import joblibjie_ba_tokenizer = Tokenizer().jie_ba_tokenizer# 載入資料集training_data = load_files('./data', encoding='utf-8')# x_train txt內容 y_train 是類別(正 負 中 )x_train, _, y_train, _ = train_test_split(training_data.data, training_data.target)print('開始建模.....')with open('training_data.target', 'w', encoding='utf-8') as f: f.write(json.dumps(training_data.target_names))# tokenizer參數是用來對文本進行分詞的函數(就是上面我們結巴分詞)count_vect = CountVectorizer(tokenizer=jieba_tokenizer)tfidf_transformer = TfidfTransformer()X_train_counts = count_vect.fit_transform(x_train)X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)print('正在訓練分類器.....')# 多項式貝葉斯分類器訓練clf = MultinomialNB().fit(X_train_tfidf, y_train)# 儲存分類器(好在其它程式中使用)joblib.dump(clf, 'model.pkl')# 儲存向量化(坑在這兒!!需要使用和訓練器相同的 向量器 不然會報錯!!!!!! 提示 ValueError dimension mismatch··)joblib.dump(count_vect, 'count_vect')print("分類器的相關資訊:")print(clf)
下面是是使用訓練好的分類器分類文章:
需要分類的文章放在predict_data目錄中:照樣是一篇文章一個txt檔案
# -*- coding: utf-8 -*-# @Time : 2017/8/23 18:02# @Author : 哎喲臥槽# @Site : # @File : 貝葉斯分類器.py# @Software: PyCharm import reimport jiebaimport jsonfrom sklearn.datasets import load_filesfrom sklearn.feature_extraction.text import CountVectorizer, TfidfTransformerfrom sklearn.externals import joblib # 載入分類器clf = joblib.load('model.pkl') count_vect = joblib.load('count_vect')testing_data = load_files('./predict_data', encoding='utf-8')target_names = json.loads(open('training_data.target', 'r', encoding='utf-8').read())# # 字串處理tfidf_transformer = TfidfTransformer() X_new_counts = count_vect.transform(testing_data.data)X_new_tfidf = tfidf_transformer.fit_transform(X_new_counts)# 進行預測predicted = clf.predict(X_new_tfidf)for title, category in zip(testing_data.filenames, predicted): print('%r => %s' % (title, target_names[category]))
這個樣子將訓練好的分類器在新的程式中使用時候 就不報錯: ValueError dimension mismatch··