芝麻HTTP:記scikit-learn貝葉斯文本分類的坑

基本步驟: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··

相關文章
相關標籤/搜索