基于python实现利用支持向量机实现中文文本分类

1,基本流程 1, 1,准备好数据食材,去停用词并利用 结巴 (jieba)进行分词处理 数据食材选用参考: NLP中必不可少的语料资源 jieba分词模块参考 官方文档 啦~ ```python 本程序用于将搜狗语料库中的文本进行分词

本文包含相关资料包-----> 点击直达获取<-------

1.基本流程

1. 1、准备好数据食材、去停用词并利用 结巴 (jieba)进行分词处理

数据食材选用参考: NLP中必不可少的语料资源

jieba分词模块参考 官方文档 啦~ ```python

本程序用于将搜狗语料库中的文本进行分词,并且去除停用词

coding=utf-8

import jieba import jieba.posseg as pseg import time import os ''' 训练集:1200 测试集:200 '''

文本分词

def cutText(dirname): # dirname数据目录 for category in os.listdir(dirname): catdir = os.path.join(dirname,category) if not os.path.isdir(catdir): continue files = os.listdir(catdir)

    i = 0
    for cur_file in files:
        print("正在处理"+category+"中的第"+str(i)+"个文件.............")
        filename = os.path.join(catdir,cur_file)
        #读取文本
        with open(filename,"r",encoding='utf-8') as f:
            content = f.read()

        #进行分词
        words = pseg.cut(content)
        # 用于剔除停用词的列表
        finalContent = []
        # 停用词列表
        stopWords = [line.strip() for line in open('Chinesestopword.txt', 'r', encoding='utf-8').readlines()]

        for word in words:
            word = str(word.word)
            # 如果该单词非空格、换行符、不在听用词表中就将其添加进入最终分词列表中
            if len(word)  > 1 and word != '\n' and word != '\u3000' and word not in stopWords:
                finalContent.append(word)

        # 组合成最终需要的字符串
        finalStr = " ".join(finalContent)

        # 写入文件
        writeFileName = writeFilePathPrefix+"/"+category+"/"+str(i)+".txt"
        print(writeFileName)
        with open(writeFileName,"w",encoding = 'utf-8') as f:
            f.write(finalStr)
        i = i + 1

        print("成功处理"+category+"中的第"+str(i)+"个文件~哦耶!")

if name == ' main ': # 记录开始时间 t1=time.time()

readFilePathPrefix = "SogouData/ClassFile"
writeFilePathPrefix = "SogouDataCut"

cutText(readFilePathPrefix)

# 记录结束时间
t2=time.time()
#反馈结果
print("您的分词终于完成,耗时:"+str(t2-t1)+"秒。")

```

1. 2、利用 卡方检验 特征选择

卡方检验: 在构建每个类别的词向量后,对每一类的每一个单词进行其卡方统计值的计算。 1. 首先对卡方 检验所需的 a、b、c、d 进行计算。 a 为在这个分类下包含这个词的文档数量; b 为不在该分类下包含这个词的文档数量; c 为在这个分类下不包含这个词的文档数量; d 为不在该分类下,且不包含这个词的文档数量。 2. 然后得到该类中该词的卡方统计值 公式为 float(pow((a d - b c), 2)) /float((a+c) * (a+b) * (b+d) * (c+d))。 3. 对每一类别的所有词按卡方值进行排序,取前 k 个作为该类的特征值,这里我们取 k 为 1000 ```python

使用开方检验选择特征

按UTF-8编码格式读取文件

import codecs import math import sys

ClassCode = [ '财经','房产','股票','家居','科技','时政','娱乐' ]

构建每个类别的词Set

分词后的文件路径

textCutBasePath = "SogouDataCut/"

构建每个类别的词向量

def buildItemSets(classDocCount): termDic = dict()

# 每个类别下的文档集合用list<set>表示, 每个set表示一个文档,整体用一个dict表示
termClassDic = dict()
for eachclass in ClassCode:
    currClassPath = textCutBasePath+eachclass+"/"
    eachClassWordSets = set()
    eachClassWordList = list()
    for i in range(classDocCount):
        eachDocPath = currClassPath+str(i)+".txt"
        eachFileObj = open(eachDocPath, 'r')
        eachFileContent = eachFileObj.read()
        eachFileWords = eachFileContent.split(" ")
        eachFileSet = set()
        for eachword in eachFileWords:
            stripEachWord = eachword.strip(" ")
            if len(stripEachWord) > 0:
                eachFileSet.add(eachword)
                eachClassWordSets.add(eachword)
        eachClassWordList.append(eachFileSet)
    termDic[eachclass] = eachClassWordSets
    termClassDic[eachclass] = eachClassWordList
return termDic, termClassDic

对得到的两个词典进行计算,可以得到a b c d 值

K为每个类别选取的特征个数

卡方计算公式

def ChiCalc(a, b, c, d): result = float(pow((a d - b c), 2)) /float((a+c) * (a+b) * (b+d) * (c+d)) return result

def featureSelection(termDic, termClassDic, K): termCountDic = dict() for key in termDic: # C000008
classWordSets = termDic[key] # print(classWordSets) classTermCountDic = dict() for eachword in classWordSets: # 对某个类别下的每一个单词的 a b c d 进行计算 # 对卡方检验所需的 a b c d 进行计算 # a:在这个分类下包含这个词的文档数量 # b:不在该分类下包含这个词的文档数量 # c:在这个分类下不包含这个词的文档数量 # d:不在该分类下,且不包含这个词的文档数量 a = 0 b = 0 c = 0 d = 0 for eachclass in termClassDic: # C000008 if eachclass == key: #在这个类别下进行处理 for eachdocset in termClassDic[eachclass]: if eachword in eachdocset: a = a + 1 else: c = c + 1 else: # 不在这个类别下进行处理 for eachdocset in termClassDic[eachclass]: if eachword in eachdocset: b = b + 1 else: d = d + 1

        eachwordcount = ChiCalc(a, b, c, d)
        classTermCountDic[eachword] = eachwordcount

    # 对生成的计数进行排序选择前K个
    # 这个排序后返回的是元组的列表
    sortedClassTermCountDic = sorted(classTermCountDic.items(), key=lambda d:d[1], reverse=True)
    count = 0
    subDic = dict()
    for i in range(K):
        subDic[sortedClassTermCountDic[i][0]] = sortedClassTermCountDic[i][1]
    termCountDic[key] = subDic
return termCountDic

def writeFeatureToFile(termCountDic , fileName): featureSet = set() for key in termCountDic: for eachkey in termCountDic[key]: featureSet.add(eachkey)

count = 1
file = open(fileName, 'w')
for feature in featureSet:
    # 判断feature 不为空
    stripfeature = feature.strip(" ")
    if len(stripfeature) > 0 and feature != " " :
        file.write(str(count)+" " +feature+"\n")
        count = count + 1
        print(feature)
file.close()

if name == ' main ': # 调用buildItemSets # buildItemSets形参表示每个类别的文档数目,在这里训练模型时每个类别取前200个文件 termDic, termClassDic = buildItemSets(1200) termCountDic = featureSelection(termDic, termClassDic, 1000) writeFeatureToFile(termCountDic, "SVMFeature.txt")

```

1. 3、利用 TF IDF算法*进行特征权重计算

TF-IDF算法

  • 全称叫 Term Frequency-Inverse Document Frequency 词频-逆文档频率算法
  • 主要用于关键词抽取
  • 优点:每个词的权重与特征项在文档中出现的频率成正比,与在整个语料中出现该特征项的文档数成反比。
  • 原理解说: 训练文本的特征向量表示数据在 train.svm文件中,测试文本的特征向量表示数据在test.svm 中。

```python

import FeatureSelecion

import math import sys

采用TF-IDF 算法对选取得到的特征进行计算权重

documentCount = 200 # 每个类别选取200篇文档

ClassCode = [ '财经','房产','股票','家居','科技','时政','娱乐' ]

构建每个类别的词Set

分词后的文件路径

textCutBasePath = "SogouDataCut/"

def readFeature(featureName): featureFile = open(featureName, 'r') featureContent = featureFile.read().split('\n') featureFile.close() feature = list() for eachfeature in featureContent: eachfeature = eachfeature.split(" ") if (len(eachfeature)==2): feature.append(eachfeature[1]) # print(feature) return feature

读取所有类别的训练样本到字典中,每个文档是一个list

def readFileToList(textCutBasePath, ClassCode, documentCount): dic = dict() for eachclass in ClassCode: currClassPath = textCutBasePath + eachclass + "/" eachclasslist = list() for i in range(documentCount): eachfile = open(currClassPath+str(i)+".txt") eachfilecontent = eachfile.read() eachfilewords = eachfilecontent.split(" ") eachclasslist.append(eachfilewords) # print(eachfilewords) dic[eachclass] = eachclasslist return dic

计算特征的逆文档频率

def featureIDF(dic, feature, dffilename): dffile = open(dffilename, "w") dffile.close() dffile = open(dffilename, "a")

totalDocCount = 0
idffeature = dict()
dffeature = dict()

for eachfeature in feature:
    docFeature = 0
    for key in dic:
        totalDocCount = totalDocCount + len(dic[key])
        classfiles = dic[key]
        for eachfile in classfiles:
            if eachfeature in eachfile:
                docFeature = docFeature + 1
    # 计算特征的逆文档频率
    featurevalue = math.log(float(totalDocCount)/(docFeature+1))
    dffeature[eachfeature] = docFeature
    # 写入文件,特征的文档频率
    dffile.write(eachfeature + " " + str(docFeature)+"\n")
    # print(eachfeature+" "+str(docFeature))
    idffeature[eachfeature] = featurevalue
dffile.close()
return idffeature

计算Feature's TF-IDF 值

def TFIDFCal(feature, dic,idffeature,filename): file = open(filename, 'w') file.close() file = open(filename, 'a') for key in dic: classFiles = dic[key] # 谨记字典的键是无序的 classid = ClassCode.index(key)

    for eachfile in classFiles:
        # 对每个文件进行特征向量转化
        file.write(str(classid)+" ")
        for i in range(len(feature)):
            if feature[i] in eachfile:
                currentfeature = feature[i]
                featurecount = eachfile.count(feature[i])
                tf = float(featurecount)/(len(eachfile))
                # 计算逆文档频率
                featurevalue = idffeature[currentfeature]*tf
                file.write(str(i+1)+":"+str(featurevalue) + " ")
        file.write("\n")

if name == ' main ': dic = readFileToList(textCutBasePath, ClassCode, documentCount) feature = readFeature("SVMFeature.txt") # print(len(feature)) idffeature = featureIDF(dic, feature, "dffeature.txt") TFIDFCal(feature, dic,idffeature, "train.svm")

```

1. 4、基于训练文本的特征向量数据,使用 LIBSVM库 训练SVM 模型

使用libsvm对train.svm进行模型训练,和对test.svm模型进行预测

测试命令:

```sh 对train.svm文件数据进行缩放到[0,1]区间 ./svm-scale -l 0 -u 1 train.svm > trainscale.svm

对test.svm文件数据进行缩放到[0,1]区间 ./svm-scale -l 0 -u 1 test.svm > testscale.svm

对trainscale.svm 文件进行模型训练 ./svm-train -s 1 trainscale.svm trainscale.model

对testscale.svm 文件进行模型预测,得到预测结果,控制台会输出正确率 ./svm-predict testscale.svm trainscale.model testscale.result ```

1. 5、对于测试集进行特征向量表示,代入训练得到的 SVM 模型中进行预测分类

预测结果:92%

目前这个阶段,能够讲到这个程度,以后在补充吧,小明酱撤退了~

参考文献

  • 一种面向文本分类的机器学习平台的设计与实现(北京邮电大学·赵江山)
  • 中文文本自动校对系统设计与实现(西南交通大学·张涛)
  • 基于Spring Boot的多用户博客系统的设计研究(青海师范大学·罗涛)
  • 基于网络用户行为分析的用户推荐反馈系统的设计(北京化工大学·石钊)
  • 文本分析资源与任务管理系统的设计与实现(北京交通大学·宋奕文)
  • 一种面向文本分类的机器学习平台的设计与实现(北京邮电大学·赵江山)
  • 网络新闻分类系统及个性化新闻网站的研究与应用(内蒙古工业大学·王继明)
  • 中文文本自动校对系统设计与实现(西南交通大学·张涛)
  • 基于Spring Boot的多用户博客系统的设计研究(青海师范大学·罗涛)
  • Text Classification Based on Graph Convolutional Neural Network with Intimacy Matrix and Text Linking(华中师范大学·夏冰)
  • 基于网络爬虫的信息采集分类系统设计与实现(厦门大学·周茜)
  • 基于商品名称的电商平台商品自动分类的研究与实现(西南交通大学·黄超)
  • 财经领域事件抽取技术的研究与应用(北京理工大学·陈贺)
  • 网站运营分析系统设计与实现(电子科技大学·蒋黎)
  • 基于Python的非结构化数据检索系统的设计与实现(南京邮电大学·董海兰)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕业设计客栈 ,原文地址:https://bishedaima.com/yuanma/35680.html

相关推荐

  • 基于JSP和SQL的CD销售管理系统

    基于JSP和SQL的CD销售管理系统 摘要 二十一世纪是一个集数字化,网络化,信息化的,以网络为核心的社会,中国的网民充分领略到“畅游天地间,网络无极限” 所带来的畅快
    2024年05月14日
    2 1 2
  • 基于Java+Swing的俄罗斯方块小游戏课程设计实现源码

    基于Java+Swing的俄罗斯方块小游戏课程设计实现源码 俄罗斯方块作为经典的益智游戏,一直备受玩家喜爱,随着计算机技术的发展,人们对于游戏的实现方式也有了更高的要求
    2024年05月07日
    5 1 1
  • 高校教务系统之Python

    高校教务系统 一,需求分析 1,1 业务场景 高校教务系统用户分为三种:管理员,教师,学生, 这也是根据现实大学生中的教务系统的情况,以及自己的一些想象
    2024年05月14日
    4 1 1
  • 使用SSM框架的购物网站系统

    1 前言 本次课程设计旨在考察学生对工程的规划与设计能力,本次课程设计中,我选择的题目是web应用,目的在于在对JAVAEE的兴趣的前提下,增加自己对WEB应用开发的项目经验
    2024年05月14日
    9 1 3
  • 基于SpringBoot框架的旅游景点导游平台

    这是一套采用Java编程语言,基于SpringBoot框架构建的旅游导览系统源代码,系统采用了现代化的开发工具Idea或Eclipse,并结合Vue技术进行前端呈现,该旅游导览平台适用于毕业设计或课程实践项目
    2024年05月23日
    5 1 3
  • SSM实现值班管理系统排班管理系统

    值班管理系统是现代组织中不可或缺的一部分,其对于人力资源的合理调配和工作效率的提升至关重要,随着信息技术的迅速发展,基于Spring,SpringMVC和MyBatis的值班管理系统(SSM实现值班管理系统)逐渐成为研究和应用的热点
    2024年05月07日
    9 1 4
  • 基于spring boot实现的ERp仓库管理系统

    1 系统概述 基于SpringBoot框架和SaaS模式,非常好用的ERP软件,目前专注进销存+财务功能,主要模块有零售管理,采购管理,销售管理,仓库管理,财务管理
    2024年05月14日
    7 1 3
  • vue 购物 WebApp---蘑菇购

    vue 购物 WebApp---蘑菇购 项目概述 简介 项目名 蘑菇购 ,与一般购物 WebApp 类似,包括首页
    2024年05月14日
    9 1 1
  • SpringDataJPA

    (一)J2EE 项目系列(三)--Spring Data JPA+Spring+SpringMVC+Maven 快速开发(1)项目架构 (二)J2EE 项目系列(三)--Spring Data JPA+Spring+SpringMVC+Maven 快速开发(2)多个第三方服务端接入之云旺 IM (三)Java-解决实现 JPA 的 hibernate 自动建表的编码问题 (四)WEB 后台--基于 Token 的 Web 后台登录认证机制(并讲解其他认证机制以及 cookie 和 session 机制) (一)J2EE 项目系列(三)--Spring Data JPA+Spring+SpringMVC+Maven 快速开发(1)项目架构 文章结构:(1)项目环境搭建;(2)简单业务逻辑测试框架;(3)项目配置注意点;(4)快速开发上手技巧; 一
    2024年05月14日
    3 1 1
  • 基于SpringBoot框架的酒店管理系统

    这是一份采用Java语言编写的Hotel Management System的源代码,基于流行的SpringBoot框架构建,项目集成了一流的Vue技术,开发工具为Idea或Eclipse
    2024年05月23日
    6 1 2

发表回复

登录后才能评论