芝麻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- -*- # @Time : // : # @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贝叶斯文本分类的坑的更多相关文章
- Mahout朴素贝叶斯文本分类
Mahout朴素贝叶斯文本分类算法 Mahout贝叶斯分类器按照官方的说法,是按照<Tackling the PoorAssumptions of Naive Bayes Text Classi ...
- 朴素贝叶斯文本分类-在《红楼梦》作者鉴别的应用上(python实现)
朴素贝叶斯算法简单.高效.接下来我们来介绍其如何应用在<红楼梦>作者的鉴别上. 第一步,当然是先得有文本数据,我在网上随便下载了一个txt(当时急着交初稿...).分类肯定是要一个回合一个 ...
- 详解使用EM算法的半监督学习方法应用于朴素贝叶斯文本分类
1.前言 对大量需要分类的文本数据进行标记是一项繁琐.耗时的任务,而真实世界中,如互联网上存在大量的未标注的数据,获取这些是容易和廉价的.在下面的内容中,我们介绍使用半监督学习和EM算法,充分结合大量 ...
- 朴素贝叶斯文本分类(python代码实现)
朴素贝叶斯(naive bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法. 优点:在数据较少的情况下仍然有效,可以处理多分类问题. 缺点:对入输入数据的准备方式较为敏感. 使用数据类型:标称 ...
- 朴素贝叶斯文本分类实现 python cherry分类器
贝叶斯模型在机器学习以及人工智能中都有出现,cherry分类器使用了朴素贝叶斯模型算法,经过简单的优化,使用1000个训练数据就能得到97.5%的准确率.虽然现在主流的框架都带有朴素贝叶斯模型算法,大 ...
- 朴素贝叶斯文本分类java实现
package com.data.ml.classify; import java.io.File; import java.util.ArrayList; import java.util.Coll ...
- scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)
scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...
- (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探
一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...
- (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探
目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...
随机推荐
- xBIM WeXplorer
目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...
- loadrunner调用jar包方法
环境 win7(32位)/winXP+loadrunner11+JDK 1.6(一定要配置JAVA环境变量) 1.Eclipse中创建com.medivh包 package com.medivh; p ...
- bzoj 3996: [TJOI2015]线性代数 [最小割]
3996: [TJOI2015]线性代数 题意:给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 \(D=(A * B-C)* A^T\)最大.其中A^T为A的转置.输出D.每 ...
- BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]
3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...
- WPF: WPF 中的 Triggers 和 VisualStateManager
在之前写的这篇文章 WPF: 只读依赖属性的介绍与实践 中,我们介绍了在 WPF 自定义控件中如何添加只读依赖属性,并且使其结合属性触发器 (Trigger) 来实现对控件样式的改变.事实上,关于触发 ...
- Java中从控制台输入数据的几种常用方法(转)
一.使用标准输入串System.in //System.in.read()一次只读入一个字节数据,而我们通常要取得一个字符串或一组数字 //System.in.read()返回一个整数 //必须 ...
- zabbix安装步骤
第一步:安装环境 Zabbix要求的环境 组件 版本要求 Apache版本 1 .3.1 2 MySQL版本 5.0.3 PHP版本 5.4.0 本次安装的环境 组件 版本要求 操作系统 CentOS ...
- Mac下安装php5.6/7.1
安装环境 OS X EI Capitan 10.11.4 Homebrew安装 homebrew是一个类似于ubuntu中apt-get的一个软件管理器,安装比较简单,在命令行中输入如下代码: rub ...
- zabbix邮件报警设置
第一.安装邮件发送工具mailx 这里我选择的是mailx,所以的关闭其他的邮件发送工具 service sendmailstop #关闭 chkconfig sendmailoff #禁止开机启 ...
- 基于微软企业库的AOP组件(含源码)
软件开发,离不开对日志的操作.日志可以帮助我们查找和检测问题,比较传统的日志是在方法执行前或后,手动调用日志代码保存.但自从AOP出现后,我们就可以避免这种繁琐但又必须要实现的方式.本文是在微软企业库 ...