芝麻HTTP:记scikit-learn贝叶斯文本分类的坑

Posted zhimaruanjian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了芝麻HTTP:记scikit-learn贝叶斯文本分类的坑相关的知识,希望对你有一定的参考价值。

基本步骤:

1、训练素材分类:

我是参考官方的目录结构:

技术分享图片

每个目录中放对应的文本,一个txt文件一篇对应的文章:就像下面这样

技术分享图片

 

需要注意的是所有素材比例请保持在相同的比例(根据训练结果酌情调整、不可比例过于悬殊、容易造成过拟合(通俗点就是大部分文章都给你分到素材最多的那个类别去了))

废话不多说直接上代码吧(测试代码的丑得一逼;将就着看看吧)

需要一个小工具: pip install chinese-tokenizer

这是训练器:

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)

下面是是使用训练好的分类器分类文章:

技术分享图片

需要分类的文章放在predict_data目录中:照样是一篇文章一个txt文件

# -*- 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··

以上是关于芝麻HTTP:记scikit-learn贝叶斯文本分类的坑的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn学习之贝叶斯分类算法

scikit-learn 朴素贝叶斯类库使用小结

实战:朴素贝叶斯对文档进行分类

如何为 scikit-learn 的朴素贝叶斯指定先验概率

SciKit-learn - 训练高斯朴素贝叶斯分类器

Scikit-Learn 朴素贝叶斯分类丨数析学院