实现本文的文本数据可以在THUCTC下载也可以自己手动爬虫生成,

本文主要参考:https://blog.csdn.net/hao5335156/article/details/82716923

nb表示朴素贝叶斯

rf表示随机森林

lg表示逻辑回归

初学者(我)通过本程序的学习可以巩固python基础,学会python文本的处理,和分类器的调用。方便接下来的机器学习的学习。

各个参数直观的含义:

# -*- coding: utf-8 -*-
"""
Created on Thu Nov 29 13:00:46 2018 @author: caoqu
"""
import matplotlib.pyplot as plt
import random
import os
import jieba from sklearn.naive_bayes import MultinomialNB as NB
from sklearn.linear_model.logistic import LogisticRegression as LR
from sklearn.ensemble import RandomForestClassifier as RF # 文本处理 --> 生成训练集 测试集 词频集
def text_processor(text_path, test_size=0.2):
folder_list = os.listdir(text_path)
data_list=[] # 每个元素均为一篇文章
class_list=[] # 对应于每篇文章的类别
# 一个循环读取一个类别的文件夹
for folder in folder_list:
new_folder_path = os.path.join(text_path, folder) # 类别列表
# 由于THUCTC文本巨多,所以我从每个类别的文本列表中随机抽取200个文本用于训练和测试,可以自行修改
files = random.sample(os.listdir(new_folder_path), 200)
# 一个循环读取一篇文章
for file in files:
with open(os.path.join(new_folder_path, file), 'r', encoding='UTF-8') as fp:
raw = fp.read()
word_cut = jieba.cut(raw, cut_all=False) #精确模式切分文章
word_list = list(word_cut) # 一篇文章一个 word_list
data_list.append(word_list)
class_list.append(folder.encode('utf-8'))
# 划分训练集和测试集
# data_class_list[[word_list_one[], 体育], [word_list_two[], 财经], ..., [...]]
data_class_list = list(zip(data_list, class_list))
random.shuffle(data_class_list) # 打乱顺序
index = int(len(data_class_list) * test_size) + 1 # 训测比为 8:2 train_list = data_class_list[index:]
test_list = data_class_list[:index] train_data_list, train_class_list = zip(*train_list) # (word_list_one[],...), (体育,...)
test_data_list, test_class_list = zip(*test_list) # 统计词频 all_words_dict{"key_word_one":100, "key_word_two":200, ...}
all_words_dict = {}
for word_list in train_data_list:
for word in word_list:
if all_words_dict.get(word) != None:
all_words_dict[word] += 1
else:
all_words_dict[word] = 1 all_words_tuple_list = sorted(all_words_dict.items(), key=lambda f: f[1], reverse=True) # 按值降序排序
all_words_list = list(list(zip(*all_words_tuple_list))[0]) # all_words_list[word_one, word_two, ...] return all_words_list, train_data_list, test_data_list, train_class_list, test_class_list # 选取特征词
def words_dict(all_words_list, deleteN, stopwords_set=set()):
feature_words = []
n = 1
for t in range(deleteN, len(all_words_list), 1):
if n > 1000: # 维度最大1000
break
# 非数字 非停用词 长度 1-4 之间
if not all_words_list[t].isdigit() and all_words_list[t] not in stopwords_set and 1 < len(all_words_list[t]) < 5:
feature_words.append(all_words_list[t])
n += 1
return feature_words # 文本特征
def text_features(train_data_list, test_data_list, feature_words):
def text_feature_(text, feature_words):
text_words = set(text)
features = [1 if word in text_words else 0 for word in feature_words]
return features
train_feature_list = [text_feature_(text, feature_words) for text in train_data_list]
test_feature_list = [text_feature_(text, feature_words) for text in test_data_list]
return train_feature_list, test_feature_list # 对停用词去重
def make_word_set(words_file):
words_set = set()
with open(words_file, 'r', encoding='UTF-8') as fp:
for line in fp.readlines():
word = line.strip()
if len(word)>0 and word not in words_set:
words_set.add(word)
return words_set # 列表求均值
def average(accuracy_list):
sum = 0
for i in accuracy_list:
sum += i
return round(sum/len(accuracy_list),3) # 分类 同时输出准确率等
def text_classifier(train_feature_list, test_feature_list, train_class_list, test_class_list, flag):
if flag == 'nb':
# 朴素贝叶斯分类器 拟合 默认拉普拉斯平滑 不指定先验概率先验概率
classifier = NB().fit(train_feature_list, train_class_list)
if flag == 'lg':
# 逻辑回归分类器 指定liblinear为求解最优化问题的算法 最大迭代数 多分类问题策略
classifier = LR(solver='liblinear',max_iter=5000, multi_class='auto').fit(train_feature_list, train_class_list)
if flag == 'rf':
# 随机森林分类器
classifier = RF(n_estimators=200).fit(train_feature_list, train_class_list)
test_accuracy = classifier.score(test_feature_list, test_class_list) # 测试准确率
return test_accuracy def start(flag):
folder_path = 'D:/WorkSpace/THUCTC/THUCNews/' # 请修改成自己的路径
all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = text_processor(folder_path, test_size=0.2)
stopwords_set = make_word_set('D:/WorkSpace/tmp/py/stop_words_cn.txt')
# 文本特征的提取和分类
deleteNs = range(0,1000,20)
test_accuracy_list = [] # 每循环一次,去除前 20 个最高词频,直到去除 980 个最高词频为止
for deleteN in deleteNs:
feature_words = words_dict(all_words_list, deleteN, stopwords_set)
train_feature_list, test_feature_list = text_features(train_data_list, test_data_list, feature_words)
if flag == 'nb':
test_accuracy = text_classifier(train_feature_list, test_feature_list, train_class_list, test_class_list, flag='nb')
if flag == 'lg':
test_accuracy = text_classifier(train_feature_list, test_feature_list, train_class_list, test_class_list, flag='lg')
if flag == 'rf':
test_accuracy = text_classifier(train_feature_list, test_feature_list, train_class_list, test_class_list, flag='rf')
test_accuracy_list.append(test_accuracy)
print(flag + '平均准确度:', average(test_accuracy_list))
print(flag + '最大准确度:', round(max(test_accuracy_list), 3))
return deleteNs, test_accuracy_list if __name__ == "__main__":
plt.figure(figsize=(13, 11))
for i in range(5):
# 1
flag = 'nb'
nb_deleteNs, nb_accuracy_list = start(flag)
flag = 'lg'
lg_deleteNs, lg_accuracy_list = start(flag)
flag = 'rf'
rf_deleteNs, rf_accuracy_list = start(flag) # 绘图
plt.title('Relationship of deleteNs and test_accuracy')
plt.xlabel('deleteNs')
plt.ylabel('test_accuracy')
plt.grid()
plt.plot(nb_deleteNs, nb_accuracy_list, 'b', label='nb')
plt.plot(lg_deleteNs, lg_accuracy_list, 'k', label='lg')
plt.plot(rf_deleteNs, rf_accuracy_list, 'r', label='rf')
plt.annotate('大', xy=((nb_accuracy_list.index(max(nb_accuracy_list))-1)*20, max(nb_accuracy_list)))
plt.annotate('大', xy=((lg_accuracy_list.index(max(lg_accuracy_list))-1)*20, max(lg_accuracy_list)))
plt.annotate('大', xy=((rf_accuracy_list.index(max(rf_accuracy_list))-1)*20, max(rf_accuracy_list))) plt.legend()
plt.show()

运行结果:

其他参数请自行修改

python实现随机森林、逻辑回归和朴素贝叶斯的新闻文本分类的更多相关文章

  1. 【十大算法实现之naive bayes】朴素贝叶斯算法之文本分类算法的理解与实现

    关于bayes的基础知识,请参考: 基于朴素贝叶斯分类器的文本聚类算法 (上) http://www.cnblogs.com/phinecos/archive/2008/10/21/1315948.h ...

  2. Python机器学习(基础篇---监督学习(朴素贝叶斯))

    朴素贝叶斯 朴素贝叶斯分类器的构造基础是贝叶斯理论.采用概率模型来表述,定义x=<x1,x2,...,xn>为某一n维特征向量,y∈{c1,c2,...ck}为该特征向量x所有k种可能的类 ...

  3. 手写朴素贝叶斯(naive_bayes)分类算法

    朴素贝叶斯假设各属性间相互独立,直接从已有样本中计算各种概率,以贝叶斯方程推导出预测样本的分类. 为了处理预测时样本的(类别,属性值)对未在训练样本出现,从而导致概率为0的情况,使用拉普拉斯修正(假设 ...

  4. tf-idf、朴素贝叶斯的短文本分类简述

    朴素贝叶斯分类器(Naïve Bayes classifier)是一种相当简单常见但是又相当有效的分类算法,在监督学习领域有着很重要的应用.朴素贝叶斯是建立在“全概率公式”的基础下的,由已知的尽可能多 ...

  5. 机器学习实战之朴素贝叶斯进行文档分类(Python 代码版)

    贝叶斯是搞概率论的.学术圈上有个贝叶斯学派.看起来吊吊的.关于贝叶斯是个啥网上有很多资料.想必读者基本都明了.我这里只简单概括下:贝叶斯分类其实就是基于先验概率的基础上的一种分类法,核心公式就是条件概 ...

  6. &lt;Machine Learning in Action &gt;之二 朴素贝叶斯 C#实现文章分类

    def trainNB0(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[ ...

  7. 机器学习:朴素贝叶斯--python

    今天介绍机器学习中一种基于概率的常见的分类方法,朴素贝叶斯,之前介绍的KNN, decision tree 等方法是一种 hard decision,因为这些分类器的输出只有0 或者 1,朴素贝叶斯方 ...

  8. Stanford大学机器学习公开课(五):生成学习算法、高斯判别、朴素贝叶斯

    (一)生成学习算法 在线性回归和Logistic回归这种类型的学习算法中我们探讨的模型都是p(y|x;θ),即给定x的情况探讨y的条件概率分布.如二分类问题,不管是感知器算法还是逻辑回归算法,都是在解 ...

  9. 什么是机器学习的分类算法?【K-近邻算法(KNN)、交叉验证、朴素贝叶斯算法、决策树、随机森林】

    1.K-近邻算法(KNN) 1.1 定义 (KNN,K-NearestNeighbor) 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类 ...

随机推荐

  1. mysql数据库优化(一)

    在实际项目中,通过设计表架构时,设计系统结构时,查询数据时综合提高查询数据效率 1.适当冗余 数据库在设计时遵守三范式,同时业务数据(对数据的操作,比如资料审核,对某人评分等)和基础数据(比如资料详情 ...

  2. 4-HBase

    定义: HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Goog ...

  3. Linux java进程无故被kill

    这两天,演示环境的java应用无端端就被停止了.在这里记录一下原因和排查过程: 发现应用挂掉以后,第一时间登陆centos,发现进程没有了.于是重新启动应用. 但是启动不起来,去看业务日志,没有找到任 ...

  4. Handle/Looper源码分析;

    1. Handle中的属性: final Looper mLooper; final MessageQueue mQueue; final Callback mCallback; final bool ...

  5. python学习笔记---文件的操作

    数据的保存: 1.内存:常用的变量2.文件:文本内容,二进制的文件内容3.数据库: 读文件:1.要读取的文件路径一定要存在.2.打开存在的文件:open函数    参数1:文件的路径,相对的或者是绝对 ...

  6. ARM-start.s注释(2410Init.s)

    本人只是做个笔记保存一下. 来源:http://blog.itpub.net/13771794/viewspace-478463/ ;================================= ...

  7. NTP时间服务

    时间服务 NTP:Network Time Protocol 作用:用来给其他主机提供时间同步服务 NTP的配置文件 /etc/ntp.conf NTP相关的命令 date:显示/修改系统时间 hwc ...

  8. CS通用项目系统搭建——三层架构第二天 (补一篇完整的SqlHelper)

    #region ExecuteNonQuery(如果是增,删,修) /// <summary> /// 执行sql命令 /// </summary> /// <param ...

  9. phpstudy设置允许远程访问mysql数据库

    1.先在服务器中通过命令行方式(打开phpstudy界面->右下角其他菜单选项->MySQL工具->MySQL命令行) 登录mysql:mysql   -u root -p 密码 ( ...

  10. 【练习】Python第一,二次

    练习一 1,执行Python脚本的两种方式 a,Python解释器 b,Python  1.py 2,简述位和字节的关系 一个字节等于8位 3,简述ascii,unicode,utf-8,gbk的关系 ...