完整源码、训练数据获取
点击下载完整资源
1、资源项目源码均已通过严格测试验证,保证能够正常运行;
2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;
3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;
4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
基本概述
基于朴素贝叶斯(Naive Bayes)的新闻分类问题是一个典型的文本分类任务。朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器,它假设特征之间相互独立(尽管在现实中这一假设往往不成立,但朴素贝叶斯分类器在很多情况下仍然表现出色)。
新闻分类的基本步骤
数据收集:首先,你需要收集新闻文章的数据集,这些文章应该已经被预先分类,比如分为“政治”、“体育”、“娱乐”等类别。
文本预处理:
分词:将新闻文章分割成单词或词组(tokens)。
去除停用词:去除对分类没有帮助的常见词汇,如“的”、“了”等。
词干提取/词形还原:将单词还原到其基本形式,如将“running”还原为“run”。
特征选择:选择对分类有用的特征,通常是通过构建一个词汇表(vocabulary),每个词汇在词汇表中都有一个索引。
特征提取:将文本数据转换为数值型特征。常用的方法是使用词袋模型(Bag of Words)或TF-IDF(Term Frequency-Inverse Document Frequency)权重来表示文本。
模型训练:
使用预处理后的数据训练朴素贝叶斯分类器。
朴素贝叶斯分类器会计算每个类别下每个特征的条件概率。
模型评估:使用未参与训练的数据集(测试集)来评估模型的性能。常用的评估指标包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1分数(F1 Score)等。
模型优化:根据评估结果调整预处理步骤、特征提取方法或分类器的参数,以提高模型的性能。
朴素贝叶斯分类器的特点
简单高效:朴素贝叶斯分类器具有计算效率高、易于实现的特点。
对缺失数据不敏感:即使某些特征缺失,朴素贝叶斯分类器也能进行预测。
独立性假设:尽管特征独立性的假设在现实中可能不成立,但朴素贝叶斯分类器在很多情况下仍然表现出色。
实际应用
朴素贝叶斯分类器广泛应用于文本分类、垃圾邮件检测、情感分析等领域。在新闻分类问题中,它可以有效地将新闻文章分为不同的类别,帮助用户快速找到他们感兴趣的内容。
工具和库
Python:使用Python进行新闻分类时,可以利用scikit-learn库中的MultinomialNB(多项式朴素贝叶斯)或BernoulliNB(伯努利朴素贝叶斯)等分类器。
NLP库:NLTK(自然语言工具包)和spaCy等库可以帮助进行文本预处理和特征提取。
详细内容
大致分为以下几个工作内容:
- 新闻数据集处理
爬取的新闻数据,需要我们对文本数据进行很多预处理才能使用
- 文本分词
通常我们处理的都是词而不是一篇文章
- 去停用词
停用词会对结果产生不好的影响,所以一定得把他们去剔除掉
- 构建文本特征
如何构建合适特征是自然语言处理中最重要的一步,这俩我们选择两种方案来进行对比
- 贝叶斯分类
基于贝叶斯算法来完成最终的分类任务
import pandas as pd
import jieba
#pip install jieba
这回我们要做的是一个新闻分类任务,也就是根据新闻的内容来判断它属于哪一个类别,先来看一下数据长什么样子把:
df_news = pd.read_table('./data/data.txt',names=['category','theme','URL','content'],encoding='utf-8')
df_news = df_news.dropna()
df_news.tail()
于原始数据都是由爬虫爬下来的,所以看起来有些不整洁,一会我们还需要清洗一番。这里我们自己定义个字段:
- Category:当前新闻所属的类别,一会我们要进行分别任务,这就是标签了。
- Theme:新闻的主题,这个咱们先暂时不用,大家在练习的时候也可以把它当作特征。
- URL:爬取的界面的链接,方便检验爬取数据是不是完整的,这个咱们暂时也不需要。
- Content:新闻的内容,这些就是一篇文章了,里面的内容还是很丰富的。
看看现在的数据规模:
df_news.shape
(5000, 4)
任务已经很明确了,根据文章的内容来进行类别的划分。那如何做这个事呢?咱们之前看到的数据都是数值的,直接传入到算法中求解参数就可以了。这份数据就有些特别了,都是文本,计算机可不认识这些文字呀,所以我们需要把这些文字转换成特征,比如说将一篇文章转换成一个向量,这样就可以玩起来了。
对于一篇文章来说,里面的内容还是有点太多了,如果直接把它转换成向量,有一串数字来表示这篇文章,一方面来说难度有些大,另一方面这些表示的效果也不尽如人意。通常的做法都是先把文章进行分词,然后在词的层面上去做文章。先拿到一篇文章,然后我们再看看其分词的结果:
中文分词
对于文本分类来说,直接对一篇完整的文章来建模有些难度,一般情况下我们都是先把文章进行分词,然后在词上做文章,先拿一篇新闻看看长什么样
content = df_news.content.values.tolist() #将每一篇文章转换成一个list
print (content[1000]) #随便选择其中一个看看
阿里巴巴集团昨日宣布,将在集团管理层面设立首席数据官岗位(Chief Data Officer),阿里巴巴B2B公司CEO陆兆禧将会出任上述职务,向集团CEO马云直接汇报。>菹ぃ和6月初的首席风险官职务任命相同,首席数据官亦为阿里巴巴集团在完成与雅虎股权谈判,推进“one company”目标后,在集团决策层面新增的管理岗位。0⒗锛团昨日表示,“变成一家真正意义上的数据公司”已是战略共识。记者刘夏
使用结巴分词:
content_S = []
for line in content:
current_segment = jieba.lcut(line) #对每一篇文章进行分词
if len(current_segment) > 1 and current_segment != '\r\n': #换行符
content_S.append(current_segment) #保存分词的结果
看看其中一条的分词结果
content_S[1000]
[‘阿里巴巴’,
‘集团’,
‘昨日’,
‘宣布’,
‘,’,
‘将’,
‘在’,
‘集团’,
‘管理’,
‘层面’,
‘设立’,
‘首席’,
‘数据’,
‘官’,
‘岗位’,
‘(’,
‘C’,
‘h’,
‘i’,
‘e’,
‘f’,
‘\u3000’,
‘D’,
‘a’,
‘t’,
…
‘战略’,
‘共识’,
‘。’,
‘记者’,
‘刘夏’]
df_content=pd.DataFrame({
'content_S':content_S}) #专门展示分词后的结果
df_content.head()
完成了分词任务之后,我们要处理的对象就是其中每一个词了,但是这里我们得先考虑一个问题,一篇文章是什么主题应该是由其内容中的一些关键词来决定的,比如这里的‘车展’,‘跑车’,‘发动机’等,这些词我们一看就知道跟汽车相关的。但是另一类词,‘今天’,‘在’,‘3月份’等,这些词给我们的感觉好像既可以在汽车相关的文章中使用,也可以在其他类型的文章使用,就把它们称作停用词,也就是我们一会要过滤的目标。
首先需要选择一个合适的停用词库,这些网上有很多现成的,但是都没那么完整,所以当大家在进行数据清洗任务的时候还需要自己添加一些,先来看看停用词表长什么样子吧:
stopwords=pd.read_csv("stopwords.txt",index_col=False,sep="\t",quoting=3,names=['stopword'], encoding<