当前位置:   article > 正文

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

文本分类数据集

我本次对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 )     

避开停用词:

                  

  

贝叶斯分类

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

    

表达形式:

测试集

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

代码实现:

  1. #!D:/workplace/python
  2. # -*- coding: utf-8 -*-
  3. # @File : homework3.py
  4. # @Author: WangYe
  5. # @Date : 2018/4/22
  6. # @Software: PyCharm
  7. # 微博文字的性别识别
  8. import jieba
  9. import os
  10. import pickle # 持久化
  11. from numpy import *
  12. from sklearn import feature_extraction
  13. from sklearn.feature_extraction.text import TfidfTransformer # TF-IDF向量转换类
  14. from sklearn.feature_extraction.text import TfidfVectorizer # TF_IDF向量生成类
  15. from sklearn.utils import Bunch
  16. from sklearn.naive_bayes import MultinomialNB # 多项式贝叶斯算法
  17. def readFile(path):
  18. with open(path, 'r', errors='ignore') as file: # 文档中编码有些问题,所有用errors过滤错误
  19. content = file.read()
  20. return content
  21. def saveFile(path, result):
  22. with open(path, 'w', errors='ignore') as file:
  23. file.write(result)
  24. def segText(inputPath, resultPath):
  25. fatherLists = os.listdir(inputPath) # 主目录
  26. for eachDir in fatherLists: # 遍历主目录中各个文件夹
  27. eachPath = inputPath + eachDir + "/" # 保存主目录中每个文件夹目录,便于遍历二级文件
  28. each_resultPath = resultPath + eachDir + "/" # 分词结果文件存入的目录
  29. if not os.path.exists(each_resultPath):
  30. os.makedirs(each_resultPath)
  31. childLists = os.listdir(eachPath) # 获取每个文件夹中的各个文件
  32. for eachFile in childLists: # 遍历每个文件夹中的子文件
  33. eachPathFile = eachPath + eachFile # 获得每个文件路径
  34. # print(eachFile)
  35. content = readFile(eachPathFile) # 调用上面函数读取内容
  36. # content = str(content)
  37. result = (str(content)).replace("\r\n", "").strip() # 删除多余空行与空格
  38. # result = content.replace("\r\n","").strip()
  39. cutResult = jieba.cut(result) # 默认方式分词,分词结果用空格隔开
  40. saveFile(each_resultPath + eachFile, " ".join(cutResult)) # 调用上面函数保存文件
  41. def bunchSave(inputFile, outputFile):
  42. catelist = os.listdir(inputFile)
  43. bunch = Bunch(target_name=[], label=[], filenames=[], contents=[])
  44. bunch.target_name.extend(catelist) # 将类别保存到Bunch对象中
  45. for eachDir in catelist:
  46. eachPath = inputFile + eachDir + "/"
  47. fileList = os.listdir(eachPath)
  48. for eachFile in fileList: # 二级目录中的每个子文件
  49. fullName = eachPath + eachFile # 二级目录子文件全路径
  50. bunch.label.append(eachDir) # 当前分类标签
  51. bunch.filenames.append(fullName) # 保存当前文件的路径
  52. bunch.contents.append(readFile(fullName).strip()) # 保存文件词向量
  53. with open(outputFile, 'wb') as file_obj: # 持久化必须用二进制访问模式打开
  54. pickle.dump(bunch, file_obj)
  55. #pickle.dump(obj, file, [,protocol])函数的功能:将obj对象序列化存入已经打开的file中。
  56. #obj:想要序列化的obj对象。
  57. #file:文件名称。
  58. #protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本
  59. def readBunch(path):
  60. with open(path, 'rb') as file:
  61. bunch = pickle.load(file)
  62. #pickle.load(file)
  63. #函数的功能:将file中的对象序列化读出。
  64. return bunch
  65. def writeBunch(path, bunchFile):
  66. with open(path, 'wb') as file:
  67. pickle.dump(bunchFile, file)
  68. def getStopWord(inputFile):
  69. stopWordList = readFile(inputFile).splitlines()
  70. return stopWordList
  71. def getTFIDFMat(inputPath, stopWordList, outputPath): # 求得TF-IDF向量
  72. bunch = readBunch(inputPath)
  73. tfidfspace = Bunch(target_name=bunch.target_name,label=bunch.label, filenames=bunch.filenames, tdm=[],
  74. vocabulary={})
  75. # 初始化向量空间
  76. vectorizer = TfidfVectorizer(stop_words=stopWordList, sublinear_tf=True, max_df=0.5)
  77. transformer = TfidfTransformer() # 该类会统计每个词语的TF-IDF权值
  78. # 文本转化为词频矩阵,单独保存字典文件
  79. tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)
  80. tfidfspace.vocabulary = vectorizer.vocabulary_ #获取词汇
  81. writeBunch(outputPath, tfidfspace)
  82. def getTestSpace(testSetPath, trainSpacePath, stopWordList, testSpacePath):
  83. bunch = readBunch(testSetPath)
  84. # 构建测试集TF-IDF向量空间
  85. testSpace = Bunch(target_name=bunch.target_name, label=bunch.label, filenames=bunch.filenames, tdm=[],
  86. vocabulary={})
  87. # 导入训练集的词袋
  88. trainbunch = readBunch(trainSpacePath)
  89. # 使用TfidfVectorizer初始化向量空间模型 使用训练集词袋向量
  90. vectorizer = TfidfVectorizer(stop_words=stopWordList, sublinear_tf=True, max_df=0.5,
  91. vocabulary=trainbunch.vocabulary)
  92. transformer = TfidfTransformer()
  93. testSpace.tdm = vectorizer.fit_transform(bunch.contents)
  94. testSpace.vocabulary = trainbunch.vocabulary
  95. # 持久化
  96. writeBunch(testSpacePath, testSpace)
  97. def bayesAlgorithm(trainPath, testPath):
  98. trainSet = readBunch(trainPath)
  99. testSet = readBunch(testPath)
  100. clf = MultinomialNB(alpha=0.001).fit(trainSet.tdm, trainSet.label)
  101. #alpha:0.001 alpha 越小,迭代次数越多,精度越高
  102. #print(shape(trainSet.tdm)) #输出单词矩阵的类型
  103. #print(shape(testSet.tdm))
  104. predicted = clf.predict(testSet.tdm)
  105. total = len(predicted)
  106. rate = 0
  107. for flabel, fileName, expct_cate in zip(testSet.label, testSet.filenames, predicted):
  108. if flabel != expct_cate:
  109. rate += 1
  110. print(fileName, ":实际类别:", flabel, "-->预测类别:", expct_cate)
  111. print("erroe rate:", float(rate) * 100 / float(total), "%")
  112. # 分词,第一个是分词输入,第二个参数是结果保存的路径
  113. segText("C:/Users/wy/Desktop/data/", "C:/Users/wy/Desktop/segResult/")
  114. bunchSave("C:/Users/wy/Desktop/segResult/", "C:/Users/wy/Desktop/train_set.dat") # 输入分词,输出分词向量
  115. stopWordList = getStopWord("C:/Users/wy/Desktop/stop/stopword.txt") # 获取停用词
  116. getTFIDFMat("C:/Users/wy/Desktop/train_set.dat", stopWordList, "C:/Users/wy/Desktop/tfidfspace.dat") # 输入词向量,输出特征空间
  117. # 训练集
  118. segText("C:/Users/wy/Desktop/test1/", "C:/Users/wy/Desktop/test_segResult/") # 分词
  119. bunchSave("C:/Users/wy/Desktop/test_segResult/", "C:/Users/wy/Desktop/test_set.dat")
  120. getTestSpace("C:/Users/wy/Desktop/test_set.dat", "C:/Users/wy/Desktop/tfidfspace.dat", stopWordList, "C:/Users/wy/Desktop/testspace.dat")
  121. bayesAlgorithm("C:/Users/wy/Desktop/tfidfspace.dat", "C:/Users/wy/Desktop/testspace.dat")

结果截图:

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

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

数据集(数据集和代码尽量放一起,注意修改文件路径,不想修改路径的就看下面的新博客,有相对路径的代码):

链接:https://pan.baidu.com/s/15OCvT-XavXB6mWQeFVtSEw 
提取码:57ax

--------------------------------------------------分割线2019.5.29日更新---------------------------------------------------------------------------------------

有很多同学加我微信问道dat文件的内容以及想查看词向量,词频矩阵等等详细信息,或者有同学对我代码的路径非常不熟悉很难修改为自己的路径,也有同学出现python的一些小bug,这里放出一个新的博客链接,我将文件的路径换为相对路径,并将dat文件转换为txt文件输出,方便大家查阅或者学习NLP的知识,还放出了大家运行我代码可能出现的一些基础问题,欢迎大家查看,留言,评论,共同学习。新博客我保证你代码一下载下来什么都不用改就能运行(只要python环境没问题)

新博客链接:(已修改)机器学习之文本分类(附带训练集+数据集+所有代码)_懒骨头707-CSDN博客

--------------------------------------------------分割线 2019.6.20日更新---------------------------------------------------------------------------------------

竟然有人私聊问我要我当时做这个玩意儿当时的PPT!!!而且还说当天晚上就要交作业!!!来不及自己做了!!!!

PPT下载链接:基于机器学习的文本分类.pptx-机器学习文档类资源-CSDN下载 (CSDN积分下载,积分多的麻烦给我送点)

没CSDN积分的百度云下载:

链接:https://pan.baidu.com/s/17hT5UTB9VM0nWhrfVfkkzg 
提取码:810f 

PPT是2018年做的,而且当时水平有限,应急交作业的就拿去吧,我已经把我学校的水印还有我个人信息都去掉了。有时间的还是自己好好做一个吧,毕竟我PPT很水的。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------分割线2020.11.29日更新---------------------------------------------------------------------------------------

许多人对于这个输出错误率不是非常认同,希望看到一种输入一段话,然后直接输出类别的那种,例如下图:

所以,我更新了博客,点击即可,只换代码,数据什么的都不用动。

链接:机器学习文本分类(实时预测)_懒骨头707-CSDN博客

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

由于提问评论人太多,这里我留下个人微信:wy1119744330     

添加好友请备注姓名+单位 (我也会告诉你我的名字)例如:张三(xx大学)

加的人太多了,我得改备注了,不然分不清楚了

我也是菜鸟一个,如果数据集或者代码有什么问题欢迎留言,我都会回复的~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/848494
推荐阅读
相关标签
  

闽ICP备14008679号