• 机器学习文本分类


    B站资料
    对着这个up的资料学习一遍,
    他的GitHub

    机器学习文本分类~
    这个是 贝叶斯的,
    之前在B站学过knn的,
    联想之前自己的毕设 所有的机器学习模型都用到过。
    参考自己以前写过各种机器学习算法的优缺点
    然后把原理弄懂,都做一个文本分类模型。

    这是一个svm算法的文本分类

    具体的代码在知乎

    知乎大佬一步到位给出了多种机器学习方法

    手把手教你在Python中实现文本分类(附代码、数据集) - 清华大学大数据研究中心的文章 - 知乎
    https://zhuanlan.zhihu.com/p/37157010

    但是这个是英文的数据集,唉就非常遗憾 ,本来都准备复现了来着。。。郁闷

    在这里插入图片描述
    所以说我决定先把这个搞懂,之后再去看知乎那一篇,试着换成中文看看。
    接下来复现 这个大佬的,私聊要到了源码(数据放在百度网盘了)。

    有部分看不懂的结合B站的视频,明天互补一下弄懂。
    他的代码

    #!D:/workplace/python
    # -*- coding: utf-8 -*-
    # @File  : TFIDF_svm_wy.py
    # @Author: WangYe
    # @Date  : 2020/11/29
    # @Software: PyCharm
    # 机器学习之文本分类(附带训练集+数据集+所有代码)
    # 博客链接:https://blog.csdn.net/qq_28626909/article/details/80382029
    from sklearn.multiclass import OneVsRestClassifier  #结合SVM的多分类组合辅助器
    import sklearn.svm as svm  #SVM辅助器
    import jieba
    from numpy import *
    import os
    from sklearn.feature_extraction.text import TfidfTransformer  # TF-IDF向量转换类
     
    from sklearn.feature_extraction.text import CountVectorizer   #词频矩阵
     
     
    def readFile(path):
        with open(path, 'r', errors='ignore',encoding='gbk') as file:  # 文档中编码有些问题,所有用errors过滤错误
            content = file.read()
            file.close()
            return content
     
     
    def saveFile(path, result):
        with open(path, 'w', errors='ignore',encoding='gbk') as file:
            file.write(result)
            file.close()
     
     
    def segText(inputPath):
        data_list = []
        label_list = []
        fatherLists = os.listdir(inputPath)  # 主目录
        for eachDir in fatherLists:  # 遍历主目录中各个文件夹
            eachPath = inputPath +"/"+ eachDir + "/"  # 保存主目录中每个文件夹目录,便于遍历二级文件
            childLists = os.listdir(eachPath)  # 获取每个文件夹中的各个文件
            for eachFile in childLists:  # 遍历每个文件夹中的子文件
                eachPathFile = eachPath + eachFile  # 获得每个文件路径
                content = readFile(eachPathFile)  # 调用上面函数读取内容
                result = (str(content)).replace("\r\n", "").strip()  # 删除多余空行与空格
                cutResult = jieba.cut(result)  # 默认方式分词,分词结果用空格隔开
                # print( " ".join(cutResult))
                label_list.append(eachDir)
                data_list.append(" ".join(cutResult))
        return  data_list,label_list
     
    def getStopWord(inputFile):
        stopWordList = readFile(inputFile).splitlines()
        return stopWordList
     
     
    def getTFIDFMat(train_data,train_label, stopWordList):  # 求得TF-IDF向量
        class0 = ''
        class1 = ''
        class2 = ''
        class3 = ''
        for num in range(len(train_label)):
            if train_label[num]=='体育':
                class0 = class0 + train_data[num]
            elif train_label[num]=='女性':
                class1 = class1 + train_data[num]
            elif train_label[num]=='文学出版':
                class2 = class2+ train_data[num]
            elif train_label[num]=='校园':
                class3 = class3 + train_data[num]
        train = [class0,class1,class2,class3]
        vectorizer = CountVectorizer(stop_words=stopWordList, min_df=0.5)  # 其他类别专用分类,该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
        transformer = TfidfTransformer()  # 该类会统计每个词语的tf-idf权值
        cipin = vectorizer.fit_transform(train)
        tfidf = transformer.fit_transform(cipin)  # if-idf中的输入为已经处理过的词频矩阵
        model = OneVsRestClassifier(svm.SVC(kernel='linear'))
        train_cipin = vectorizer.transform(train_data)
        train_arr = transformer.transform(train_cipin)
        clf = model.fit(train_arr, train_label)
     
        while 1:
            print('请输入需要预测的文本:')
            a = input()
            sentence_in = [' '.join(jieba.cut(a))]
            b = vectorizer.transform(sentence_in)
            c = transformer.transform(b)
            prd = clf.predict(c)
            print('预测类别:',prd[0])
    #
    if __name__ == '__main__':
        data,label = segText('data')
        stopWordList = getStopWord('stop/stopword.txt')  # 获取停用词表
        getTFIDFMat(train_data=data,train_label=label,stopWordList=stopWordList)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    下面这些不是很懂,仔细研究一下。

    下面代码关于第一行的解释

    vectorizer = CountVectorizer(stop_words=stopWordList, min_df=0.5)  # 其他类别专用分类,该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
        transformer = TfidfTransformer()  # 该类会统计每个词语的tf-idf权值
        cipin = vectorizer.fit_transform(train)
        tfidf = transformer.fit_transform(cipin)  # if-idf中的输入为已经处理过的词频矩阵
        model = OneVsRestClassifier(svm.SVC(kernel='linear'))
        train_cipin = vectorizer.transform(train_data)
        train_arr = transformer.transform(train_cipin)
        clf = model.fit(train_arr, train_label)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    还有一些需要研究一下第三方的库的方法,然后逐行解释。
    里面用到的两个主要的类详细讲解。
    这篇很详细了,
    但是有个小问题,我要编码的文本动词非常重要,默认单个字不会切分出来。
    这篇很好的解决了问题

  • 相关阅读:
    datart导入hive连接包
    Sharing-JDBC分布式事务之Seata实现
    Vue3 中 keepAlive 如何搭配 VueRouter 来更自由的控制页面的状态缓存?
    C++入门应该注意的问题(内联函数和C的宏)
    【论文阅读】Semantic Models for the First-stage Retrieval- A Comprehensive Review
    【周周Python百日刷题计划】Day5~内置函数和运算符的使用
    设计模式总结
    锐捷网络NBR700G 信息泄露漏洞复现 [附POC]
    Elasticsearch(016):es常见的字段映射类型之对象类型(object)
    Redis概述和与SpringBoot的整合
  • 原文地址:https://blog.csdn.net/qq_41517071/article/details/125885996