基本步驟:json
一、訓練素材分類:函數
我是參考官方的目錄結構:工具
每一個目錄中放對應的文本,一個txt文件一篇對應的文章:就像下面這樣測試
須要注意的是全部素材比例請保持在相同的比例(根據訓練結果酌情調整、不可比例過於懸殊、容易形成過擬合(通俗點就是大部分文章都給你分到素材最多的那個類別去了))ui
廢話很少說直接上代碼吧(測試代碼的醜得一逼;將就着看看吧)code
須要一個小工具: pip install chinese-tokenizerorm
這是訓練器:token
import re import jieba import json from io import BytesIO from chinese_tokenizer.tokenizer import Tokenizer from sklearn.datasets import load_files from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB from sklearn.externals import joblib jie_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)
下面是是使用訓練好的分類器分類文章:ip
須要分類的文章放在predict_data目錄中:照樣是一篇文章一個txt文件utf-8
# -*- coding: utf-8 -*- # @Time : 2017/8/23 18:02 # @Author : 哎喲臥槽 # @Site : # @File : 貝葉斯分類器.py # @Software: PyCharm import re import jieba import json from sklearn.datasets import load_files from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer from 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··