机器学习之文本分类(附带训练集+数据集+所有代码)

2023-10-30

我本次对4类文本进行分类((所有截图代码和数据集最后附带免费下载地址))

主要步骤:

 1.各种读文件,写文件

 2.使用jieba分词将中文文本切割

 3.对处理之后的文本开始用TF-IDF算法进行单词权值的计算

 4.去掉停用词

 5.贝叶斯预测种类

文本预处理:

 除去噪声,如:格式转换,去掉符号,整体规范化

 遍历的读取一个文件下的每个文本

中文分词

中文分词就是将一句话拆分为各个词语,因为中文分词在不同的语境中歧义较大,所以分词极其重要。
原型:我今天中午吃的小面。

分词:我、今天、中午、吃、的、小面。

其中  我、的   两个分词属于停用词(停用词后面讲)

我们本次才用jieba分词来进行辅助,那么jieba分词有这么几个类型

1.精确模式,试图将句子最精确的起开,适合文本分析。
2.全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。

3.搜索引擎模式,再将却模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

        #精确模式: 我/ 去过/ 清华大学/ 和/ 北京大学/ 。
        #全模式: 我/ 去过/ 清华/ 清华大学/ 华大/ 大学/ 和/ 北京/ 北京大学/ 大学/ / 
        #搜索引擎模式: 我/ 去过/ 清华/ 华大/ 大学/ 清华大学/ 和/ 北京/ 大学/ 北京大学/ 。 

本程序使用的是(默认)精准模式,当然jieba还有很多种模式,大家可以自行查阅

TF-IDF逆文本频率指数

 概念:是一种统计方法,用以评估一个词对于一个语料库中一份文件的重要程度。词的重要性随着在文件中出现              的次数正比增加,同时随着它在语料库其他文件中出现的频率反比下降。
           就是说一个词在某一文档中出现次数比较多,其他文档没有出现,说明该词对该文档分类很重要。

           然而如果其他文档也出现比较多,说明该词区分性不大,就用IDF来降低该词的权重。

数学算法:

            TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比
            TF-IDF = TF (词频)   *   IDF(逆文档频率)
            词频:TF = 词在文档中出现的次数 / 文档中总词数

            逆文档频率:IDF = log(语料库中文档总数 / 包含该词的文档数  +1 )     

避开停用词:

                  

  

贝叶斯分类

朴素贝叶斯分类算法核心:       

    

表达形式:

测试集

                          我手动打乱了里面的分类,这样看他能不能预测出来

代码实现:

#!D:/workplace/python
# -*- coding: utf-8 -*-
# @File  : homework3.py
# @Author: WangYe
# @Date  : 2018/4/22
# @Software: PyCharm
# 微博文字的性别识别
import jieba
import os
import pickle  # 持久化
from numpy import *
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer  # TF-IDF向量转换类
from sklearn.feature_extraction.text import TfidfVectorizer  # TF_IDF向量生成类
from sklearn.datasets.base import Bunch
from sklearn.naive_bayes import MultinomialNB  # 多项式贝叶斯算法
 
 
def readFile(path):
    with open(path, 'r', errors='ignore') as file:  # 文档中编码有些问题,所有用errors过滤错误
        content = file.read()
        return content
 
 
def saveFile(path, result):
    with open(path, 'w', errors='ignore') as file:
        file.write(result)
 
 
def segText(inputPath, resultPath):
    fatherLists = os.listdir(inputPath)  # 主目录
    for eachDir in fatherLists:  # 遍历主目录中各个文件夹
        eachPath = inputPath + eachDir + "/"  # 保存主目录中每个文件夹目录,便于遍历二级文件
        each_resultPath = resultPath + eachDir + "/"  # 分词结果文件存入的目录
        if not os.path.exists(each_resultPath):
            os.makedirs(each_resultPath)
        childLists = os.listdir(eachPath)  # 获取每个文件夹中的各个文件
        for eachFile in childLists:  # 遍历每个文件夹中的子文件
            eachPathFile = eachPath + eachFile  # 获得每个文件路径
          #  print(eachFile)
            content = readFile(eachPathFile)  # 调用上面函数读取内容
            # content = str(content)
            result = (str(content)).replace("\r\n", "").strip()  # 删除多余空行与空格
            # result = content.replace("\r\n","").strip()
 
            cutResult = jieba.cut(result)  # 默认方式分词,分词结果用空格隔开
            saveFile(each_resultPath + eachFile, " ".join(cutResult))  # 调用上面函数保存文件
 
 
def bunchSave(inputFile, outputFile):
    catelist = os.listdir(inputFile)
    bunch = Bunch(target_name=[], label=[], filenames=[], contents=[])
    bunch.target_name.extend(catelist)  # 将类别保存到Bunch对象中
    for eachDir in catelist:
        eachPath = inputFile + eachDir + "/"
        fileList = os.listdir(eachPath)
        for eachFile in fileList:  # 二级目录中的每个子文件
            fullName = eachPath + eachFile  # 二级目录子文件全路径
            bunch.label.append(eachDir)  # 当前分类标签
            bunch.filenames.append(fullName)  # 保存当前文件的路径
            bunch.contents.append(readFile(fullName).strip())  # 保存文件词向量
    with open(outputFile, 'wb') as file_obj:  # 持久化必须用二进制访问模式打开
        pickle.dump(bunch, file_obj)
        #pickle.dump(obj, file, [,protocol])函数的功能:将obj对象序列化存入已经打开的file中。
        #obj:想要序列化的obj对象。
        #file:文件名称。
        #protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本
def readBunch(path):
    with open(path, 'rb') as file:
        bunch = pickle.load(file)
        #pickle.load(file)
        #函数的功能:将file中的对象序列化读出。
    return bunch
 
 
def writeBunch(path, bunchFile):
    with open(path, 'wb') as file:
        pickle.dump(bunchFile, file)
 
 
def getStopWord(inputFile):
    stopWordList = readFile(inputFile).splitlines()
    return stopWordList
 
 
def getTFIDFMat(inputPath, stopWordList, outputPath):  # 求得TF-IDF向量
    bunch = readBunch(inputPath)
    tfidfspace = Bunch(target_name=bunch.target_name,label=bunch.label, filenames=bunch.filenames, tdm=[],
                       vocabulary={})
    # 初始化向量空间
    vectorizer = TfidfVectorizer(stop_words=stopWordList, sublinear_tf=True, max_df=0.5)
    transformer = TfidfTransformer()  # 该类会统计每个词语的TF-IDF权值
    # 文本转化为词频矩阵,单独保存字典文件
    tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)
    tfidfspace.vocabulary = vectorizer.vocabulary_   #获取词汇
    writeBunch(outputPath, tfidfspace)
 
def getTestSpace(testSetPath, trainSpacePath, stopWordList, testSpacePath):
    bunch = readBunch(testSetPath)
    # 构建测试集TF-IDF向量空间
    testSpace = Bunch(target_name=bunch.target_name, label=bunch.label, filenames=bunch.filenames, tdm=[],
                      vocabulary={})
    # 导入训练集的词袋
    trainbunch = readBunch(trainSpacePath)
    # 使用TfidfVectorizer初始化向量空间模型  使用训练集词袋向量
    vectorizer = TfidfVectorizer(stop_words=stopWordList, sublinear_tf=True, max_df=0.5,
                                 vocabulary=trainbunch.vocabulary)
    transformer = TfidfTransformer()
    testSpace.tdm = vectorizer.fit_transform(bunch.contents)
    testSpace.vocabulary = trainbunch.vocabulary
    # 持久化
    writeBunch(testSpacePath, testSpace)
 
def bayesAlgorithm(trainPath, testPath):
    trainSet = readBunch(trainPath)
    testSet = readBunch(testPath)
    clf = MultinomialNB(alpha=0.001).fit(trainSet.tdm, trainSet.label)
    #alpha:0.001 alpha 越小,迭代次数越多,精度越高
    #print(shape(trainSet.tdm))  #输出单词矩阵的类型
    #print(shape(testSet.tdm))
    predicted = clf.predict(testSet.tdm)
    total = len(predicted)
    rate = 0
    for flabel, fileName, expct_cate in zip(testSet.label, testSet.filenames, predicted):
        if flabel != expct_cate:
            rate += 1
            print(fileName, ":实际类别:", flabel, "-->预测类别:", expct_cate)
    print("erroe rate:", float(rate) * 100 / float(total), "%")
 
 
# 分词,第一个是分词输入,第二个参数是结果保存的路径
segText("C:/Users/wy/Desktop/data/", "C:/Users/wy/Desktop/segResult/")
bunchSave("C:/Users/wy/Desktop/segResult/", "C:/Users/wy/Desktop/train_set.dat")  # 输入分词,输出分词向量
stopWordList = getStopWord("C:/Users/wy/Desktop/stop/stopword.txt")  # 获取停用词
getTFIDFMat("C:/Users/wy/Desktop/train_set.dat", stopWordList, "C:/Users/wy/Desktop/tfidfspace.dat")  # 输入词向量,输出特征空间
 
# 训练集
segText("C:/Users/wy/Desktop/test1/", "C:/Users/wy/Desktop/test_segResult/")  # 分词
bunchSave("C:/Users/wy/Desktop/test_segResult/", "C:/Users/wy/Desktop/test_set.dat")
getTestSpace("C:/Users/wy/Desktop/test_set.dat", "C:/Users/wy/Desktop/tfidfspace.dat", stopWordList, "C:/Users/wy/Desktop/testspace.dat")
bayesAlgorithm("C:/Users/wy/Desktop/tfidfspace.dat", "C:/Users/wy/Desktop/testspace.dat")
结果截图:

从结果看出,手动添加的错误都预测出来了,谢谢大家~

参考文献:https://www.jianshu.com/p/915b0ab166e5

数据集+代码百度云:链接:链接:https://pan.baidu.com/s/1jyTis9z9D8FNU7khO7k0VA 密码:rgy5

我也是菜鸟一个,如果数据集或者代码有什么问题欢迎留言~
--------------------- 
作者:懒骨头707 
原文:https://blog.csdn.net/qq_28626909/article/details/80382029 
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习之文本分类(附带训练集+数据集+所有代码) 的相关文章

随机推荐

  • C# JSON 常用方法 - Json字符串转对象

    创建项目 ConsoleApplication Json 选择项目右键管理NuGet程序包 搜索Newtonsoft Json 并下载安装 选择项目添加 JsonHelper cs 添加引用 using Newtonsoft Json 编写
  • [893]推荐几款提高体验与效率的Chrome插件神器

    今天推荐几款好用的 Chrome 插件 都是我自己一直在用的插件 可以到 Chrome 商店下载 话不多说 进入主题 Insight io For Github 如图 就像这样 可以以文件树的方式浏览 github 的代码文件 Toggle
  • 【注册机】JCreator Pro v4.50.010 注册机

    下载地址 http oyksoft oyksoft com oyksoft com JCreator Pro v4 50 010 Keygen Only HAZE rar
  • OpenCV均值、中值滤波器的讲解及实战应用(附Python源码)

    需要源码和图片请点赞关注收藏后评论区留言私信 在尽量保留原图像信息的情况下 去除图像内噪声 降低细节层次信息等一系列过程 叫作图像的平滑处理 或图像的模糊处理 实现平滑处理最常用的工具就是滤波器 通过调节滤波器的参数 可以控制图像的平滑程度
  • Java通过两点经纬度和范围距离计算范围四个顶点的经纬度

    参考博文 https blog csdn net zengmingen article details 68490497 private static final double mile 1609 344 米 英里换算 通过起点 终点的经纬
  • SQL数据库:数据查询

    数据查询 语句格式 SELECT子句 指定要显示的属性列 FROM子句 指定查询对象 基本表或视图 WHERE子句 指定查询条件 GROUP BY子句 对查询结果按指定序列的值分组 比如说男的一组 女的一组 该属性列值相等的元祖为一个组 通
  • python读入2个正整数a和b_C/C++知识点之C语言解题:读入两个小于100的正整数A和B,计算A+B...

    本文主要向大家介绍了C C 知识点之C语言解题 读入两个小于100的正整数A和B 计算A B 通过具体的内容向大家展示 希望对大家学习C C 知识点有所帮助 题目描述 读入两个小于100的正整数A和B 计算A B 需要注意的是 A和B的每一
  • STC15单片机实战项目 - 项目需求

    以经典的51内核单片机设计一款产品 功能如下 1 采用宏晶的STC15L2K32S2 LQFP32 2k SRAM 32k ROM 目的 选用STC15系列1T的经典51内核单片机 资源丰富 2 设计1个运行指示灯 工作时 间隔1s闪烁 目
  • 人工智能及其在工业领域的三大应用

    人工智能是一门新的技术学科 研究和开发用于模拟人类智慧扩充套件和扩充套件的理论 方法 技术和应用系统 人工智能研究的目标 是让机器执行一些需要智慧人类完成的复杂任务 也就是说 我们希望这台机器能取代我们 解决一些复杂的任务 不仅是重复的机械
  • 数据库系统概论——第九章 关系查询处理和查询优化

    一 关系数据库系统查询处理 1 查询处理步骤 1 查询分析的任务 对查询语句进行扫描 词法分析和语法分析 词法分析 从查询语句中识别出正确的语言符号 语法分析 进行语法检查 2 查询检查的任务 1 合法权检查 根据数据字典检查语句中的数据库
  • 【linux】cpu过高解决方法

    CPU过高情况 1 使用top命令查看cpu的进程占用情况 2 发现11443的进程占比过高 通过top Hp 11443 查看线程的占用情况 发现11459 11460 11461线程的占比过高 解决swap占用CPU 设置vm swap
  • # Linux 升级g++7.5.0

    Linux 升级g 7 5 0 最近使用需要使用c 14标准 发现自己的编译器版本为gcc 4 8 只支持c 11标准 因此进行升级 升级为可以支持c 17的gcc7 5 0 关于编译器的版本支持问题可以到gcc的官方文档进行查询 下面开始
  • 【机器学习杂烩】投票(Voting)算法在分类问题上的应用(一口气实现Logistic 回归、SVM、KNN、C4.5 决策树、 Adaboost、GBDT 和随机森林,并集成起来)

    投票算法简介 投票是在分类算法中广泛运用的集成学习算法之一 投票主要有硬投票和软投票 两种 硬投票即各基分类器权重相同的投票 其原理为多数投票原则 如果基分类器 的某一分类结果超过半数 则集成算法选择该结果 若无半数结果则无输出 软投票 的
  • (一)Windows下tensorflow安装 win64+Python3.5

    2016年11月29日 TF官方宣布0 12版tensorflow支持原生windows操作系统 不在需要通过Docker进行安装 tf初学者 windows重度依赖用户 可以按照下面这种可行的安装方法进行 一 安装Python 1 通过P
  • JavaWeb远程调试

    目录 远程调试 Centos JDK 工程 启动配置 IDE连接 调试 停止调试 远程调试原理 原理 三种通信方式 Debug参数 第1种Socket Attach调试方法 第2种Socket Listen调试方法 第3种调试方法 断点分类
  • Go_实现HTTP请求和响应

    请求 HTTP 超文本传输协议 请求报文由请求行 请求头部 空行 请求包体4个部分组成 如下图所示 请求行 请求行由请求方法 URL HTTP协议版本组成 它们之间使用空格隔开 常用的HTTP请求方法有GET POST请求 GET GET请
  • Java序列化与JNDI注入

    现阶段公司会进行季度的安全巡检 扫描出来的 Java 相关漏洞 无论是远程代码执行 还是 JNDI 注入 基本都和 Java 的序列化机制有关 本文简单梳理了一下序列化机制相关知识 解释为什么这么多漏洞都和 Java 的序列化有关 以及后续
  • Python:三种格式化字符串的方式,附:小题案例+知识点

    python中常见的格式符 格式符 格式说明 c 将对应的数据格式转化为字符 s 将对应的数据格式化为字符串 d 将对应的数据格式化为整数 u 将对应的数据格式化为无符号整型 o 将对应的数据格式化为八进制数据 x 将对应的数据格式化为十六
  • Python爬取电影信息:Ajax介绍、爬取案例实战 + MongoDB存储

    Ajax介绍 Ajax Asynchronous JavaScript and XML 是一种用于在Web应用程序中实现异步通信的技术 它允许在不刷新整个网页的情况下 通过在后台与服务器进行数据交换 实时更新网页的一部分 Ajax的主要特点
  • 机器学习之文本分类(附带训练集+数据集+所有代码)

    我本次对4类文本进行分类 所有截图代码和数据集最后附带免费下载地址 主要步骤 1 各种读文件 写文件 2 使用jieba分词将中文文本切割 3 对处理之后的文本开始用TF IDF算法进行单词权值的计算 4 去掉停用词 5 贝叶斯预测种类 文