news 2026/6/10 13:35:08

毕业设计项目 中文文本分类 ( 机器学习 和 深度学习 )

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
毕业设计项目 中文文本分类 ( 机器学习 和 深度学习 )

文章目录

  • 0 简介
  • 1 前言
  • 2 中文文本分类
  • 3 数据集准备
  • 4 经典机器学习方法
    • 4.1 分词、去停用词
    • 4.2 文本向量化 tf-idf
    • 4.3 构建训练和测试数据
    • 4.4 训练分类器
      • 4.4.1 logistic regression分类器
    • 4.5 Random Forest 分类器
    • 4.6 结论
  • 5 深度学习分类器 - CNN文本分类
    • 5.1 字符级特征提取

0 简介

今天学长向大家介绍一个毕设项目,中文文本分类技术

中文文本分类 ( 机器学习 和 深度学习 ) - 新闻分类 情感分类 垃圾邮件分类

🧿选题指导, 项目分享:见文末

1 前言

学长今天帮助同学开发项目,正好需要到文本分类,今天就带大家梳理一下中文文本分类的主要方法和流程

学长本片博客的目的主要记录学长自己构建文本分类系统的过程,分别构建基于传统机器学习的文本分类和基于深度学习的文本分类系统,并在同一数据集上进行测试。

2 中文文本分类

作为NLP领域最经典的场景之一,文本分类积累了大量的技术实现方法,如果将是否使用深度学习技术作为标准来衡量,实现方法大致可以分成两类:

  • 基于传统机器学习的文本分类
  • 基于深度学习的文本分类

facebook之前开源的fastText属于简化版的第二类,词向量取平均直接进softmax层,还有业界研究上使用比较多的TextCNN模型属于第二类。

学长本片博客的目的主要记录学长自己构建文本分类系统的过程,分别构建基于传统机器学习的文本分类和基于深度学习的文本分类系统,并在同一数据集上进行测试。

经典的机器学习方法采用获取tf-idf文本特征,分别喂入logistic regression分类器和随机森林分类器的思路,并对两种方法做性能对比。

基于深度学习的文本分类,这里主要采用CNN对文本分类,考虑到RNN模型相较CNN模型性能差异不大并且耗时还比较久,这里就不多做实验了。

实验过程有些比较有用的small trick分享,包括多进程分词、训练全量tf-idf、python2对中文编码的处理技巧等等,在下文都会仔细介绍。

3 数据集准备

本文采用的数据集是很流行的搜狗新闻数据集,get到的时候已经是经过预处理的了,所以省去了很多数据预处理的麻烦,数据集内容如下

数据集一共包括10类新闻,每类新闻65000条文本数据,训练集50000条,测试集10000条,验证集5000条。

4 经典机器学习方法

4.1 分词、去停用词

使用短文本分类博文中提到的分词工具类,对训练集、测试集、验证集进行多进程分词,以节省时间:

importmultiprocessing tmp_catalog='/home/zhouchengyu/haiNan/textClassifier/data/cnews/'file_list=[tmp_catalog+'cnews.train.txt',tmp_catalog+'cnews.test.txt']write_list=[tmp_catalog+'train_token.txt',tmp_catalog+'test_token.txt']deftokenFile(file_path,write_path):word_divider=WordCut()withopen(write_path,'w')asw:withopen(file_path,'r')asf:forlineinf.readlines():line=line.decode('utf-8').strip()token_sen=word_divider.seg_sentence(line.split('\t')[1])w.write(line.split('\t')[0].encode('utf-8')+'\t'+token_sen.encode('utf-8')+'\n')printfile_path+' has been token and token_file_name is '+write_path pool=multiprocessing.Pool(processes=4)forfile_path,write_pathinzip(file_list,write_list):pool.apply_async(tokenFile,(file_path,write_path,))pool.close()pool.join()# 调用join()之前必须先调用close()print"Sub-process(es) done."

4.2 文本向量化 tf-idf

这里有几点需要注意的,一是计算tf-idf是全量计算,所以需要将train+test+val的所有corpus都相加,再进行计算,二是为了防止文本特征过大,需要去低频词,因为是在jupyter上写的,所以测试代码的时候,先是选择最小的val数据集,成功后,再对test,train数据集迭代操作,希望不要给大家留下代码冗余的影响…[悲伤脸]。实现代码如下:

defconstructDataset(path):""" path: file path rtype: lable_list and corpus_list """label_list=[]corpus_list=[]withopen(path,'r')asp:forlineinp.readlines():label_list.append(line.split('\t')[0])corpus_list.append(line.split('\t')[1])returnlabel_list,corpus_list tmp_catalog='/home/zhouchengyu/haiNan/textClassifier/data/cnews/'file_path='val_token.txt'val_label,val_set=constructDataset(tmp_catalog+file_path)printlen(val_set)fromsklearn.feature_extraction.textimportTfidfTransformerfromsklearn.feature_extraction.textimportCountVectorizer tmp_catalog='/home/zhouchengyu/haiNan/textClassifier/data/cnews/'write_list=[tmp_catalog+'train_token.txt',tmp_catalog+'test_token.txt']tarin_label,train_set=constructDataset(write_list[0])# 50000test_label,test_set=constructDataset(write_list[1])# 10000# 计算tf-idfcorpus_set=train_set+val_set+test_set# 全量计算tf-idfprint"length of corpus is: "+str(len(corpus_set))vectorizer=CountVectorizer(min_df=1e-5)# drop df < 1e-5,去低频词transformer=TfidfTransformer()tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus_set))words=vectorizer.get_feature_names()print"how many words: {0}".format(len(words))print"tf-idf shape: ({0},{1})".format(tfidf.shape[0],tfidf.shape[1])""" length of corpus is: 65000 how many words: 379000 tf-idf shape: (65000,379000) """

4.3 构建训练和测试数据

因为本来文本就是以一定随机性抽取成3份数据集的,所以,这里就不shuffle啦,偷懒一下下。

fromsklearnimportpreprocessing# encode labelcorpus_label=tarin_label+val_label+test_label encoder=preprocessing.LabelEncoder()corpus_encode_label=encoder.fit_transform(corpus_label)train_label=corpus_encode_label[:50000]val_label=corpus_encode_label[50000:55000]test_label=corpus_encode_label[55000:]# get tf-idf datasettrain_set=tfidf[:50000]val_set=tfidf[50000:55000]test_set=tfidf[55000:]

4.4 训练分类器

4.4.1 logistic regression分类器

fromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportclassification_report# from sklearn.metrics import confusion_matrix# LogisticRegression classiy modellr_model=LogisticRegression()lr_model.fit(train_set,train_label)print"val mean accuracy: {0}".format(lr_model.score(val_set,val_label))y_pred=lr_model.predict(test_set)printclassification_report(test_label,y_pred)

分类结果如下(包括准确率、召回率、F1值):

4.5 Random Forest 分类器

# 随机森林分类器fromsklearn.ensembleimportRandomForestClassifier rf_model=RandomForestClassifier(n_estimators=200,random_state=1080)rf_model.fit(train_set,train_label)print"val mean accuracy: {0}".format(rf_model.score(val_set,val_label))y_pred=rf_model.predict(test_set)printclassification_report(test_label,y_pred)

分类结果(包括准确率、召回率、F1值):

4.6 结论

  • 1 上面采用逻辑回归分类器和随机森林分类器做对比:
  • 2 可以发现,除了个别分类随机森林方法有较大进步,大部分都差于逻辑回归分类器
  • 3 并且200棵树的随机森林耗时过长,比起逻辑回归分类器来说,运算效率太低

5 深度学习分类器 - CNN文本分类

5.1 字符级特征提取

这里和前文差异比较大的地方,主要是提取文本特征这一块,这里的CNN模型采用的是字符级特征提取,比如data目录下cnews_loader.py中:

defread_file(filename):"""读取文件数据"""contents,labels=[],[]withopen_file(filename)asf:forlineinf:try:label,content=line.strip().split('\t')contents.append(list(content))# 字符级特征labels.append(label)except:passreturncontents,labelsdefbuild_vocab(train_dir,vocab_dir,vocab_size=5000):"""根据训练集构建词汇表,存储"""data_train,_=read_file(train_dir)all_data=[]forcontentindata_train:all_data.extend(content)counter=Counter(all_data)count_pairs=counter.most_common(vocab_size-1)words,_=list(zip(*count_pairs))# 添加一个 <PAD> 来将所有文本pad为同一长度words=['<PAD>']+list(words)

学长这里做了一下测试:

#! /bin/env python# -*- coding: utf-8 -*-fromcollectionsimportCounter""" 字符级别处理, 对于中文来说,基本不是原意的字,但是也能作为一种统计特征来表征文本 """content1="你好呀大家"content2="你真的好吗?"# content = "abcdefg"all_data=[]all_data.extend(list(content1))all_data.extend(list(content2))# print list(content) # 字符级别处理# print "length: " + str(len(list(content)))counter=Counter(all_data)count_pairs=counter.most_common(5)words,_=list(zip(*count_pairs))words=['<PAD>']+list(words)#['<PAD>', '\xe5', '\xbd', '\xa0', '\xe4', '\xe7']

这种基本不是原意的字符级别的特征,也能从统计意义上表征文本,从而作为特征,这一点需要清楚。

最终,在同一数据集上,得到的分类结果如下:

🧿 项目分享:大家可自取用于参考学习,获取方式见文末!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:55:10

Open-AutoGLM实战指南:5步搭建高效电商评价自动回复系统

第一章&#xff1a;Open-AutoGLM 电商评价自动回复在电商平台运营中&#xff0c;及时、准确地回应用户评价是提升客户满意度的关键环节。Open-AutoGLM 是一款基于开源大语言模型的自动化回复系统&#xff0c;专为处理电商用户评论设计&#xff0c;能够理解语义情感并生成个性化…

作者头像 李华
网站建设 2026/6/10 15:59:13

Open-AutoGLM安全升级指南,如何在2小时内完成MFA全流程集成

第一章&#xff1a;Open-AutoGLM安全升级指南概述随着大语言模型在自动化推理与代码生成场景中的广泛应用&#xff0c;Open-AutoGLM 作为开源智能代理框架&#xff0c;其安全性成为部署过程中的核心关注点。本指南旨在为系统管理员和开发人员提供一套完整的安全加固路径&#x…

作者头像 李华
网站建设 2026/6/10 15:17:22

日志泄露危机频发:Open-AutoGLM加密存储为何成最后防线?

第一章&#xff1a;日志泄露危机频发&#xff1a;安全防护的迫切需求近年来&#xff0c;随着企业数字化转型加速&#xff0c;系统日志成为运维与故障排查的重要依据。然而&#xff0c;日志数据中常包含用户身份信息、会话令牌、API密钥等敏感内容&#xff0c;一旦暴露&#xff…

作者头像 李华
网站建设 2026/6/10 4:21:28

17.5 安全保障机制:控制AI生成内容风险

17.5 安全保障机制:控制AI生成内容风险 在前几节中,我们探讨了模型工程化实施、Agent工作流构建、知识库设计和效果评估体系等关键技术环节。今天,我们将重点关注AI系统安全这一至关重要的主题——如何建立完善的安全保障机制,有效控制AI生成内容的风险,确保系统安全可靠…

作者头像 李华
网站建设 2026/6/10 14:35:01

基于Spring Boot的游戏攻略交流平台毕业设计源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot框架的游戏攻略交流平台&#xff0c;以实现游戏玩家之间的信息共享和互动。具体研究目的如下&#xff1a; 首先&#xff0c;通…

作者头像 李华
网站建设 2026/6/10 14:35:01

5款AI写论文工具大比拼:宏智树AI凭何成为毕业季“学术引擎”?

当毕业论文的DDL如达摩克利斯之剑高悬头顶&#xff0c;熬夜查文献、改框架、降重复率的循环成为学术常态&#xff0c;如何高效完成一篇兼具学术深度与创新性的论文&#xff0c;成了毕业生们最焦虑的命题。如今&#xff0c;AI写作工具如雨后春笋般涌现&#xff0c;但真正能满足“…

作者头像 李华