当前位置:首页 > 技术 > 正文内容

基于朴素贝叶斯的新闻分类实现方案(附完整代码与数据集)

访客 技术 2026年6月14日 1

本资源提供新闻分类项目所需完整代码和训练数据,已通过严格测试,保证可正常运行。适用于毕业设计、课程作业等场景,尤其适合人工智能、计算机科学等专业学生。下载后可先查看README.md文件,本项目仅限交流学习,请勿用于商业用途。

核心思路

基于朴素贝叶斯算法实现新闻自动分类。该算法利用贝叶斯定理,通过计算特征条件概率来预测类别,虽然假设特征间相互独立,但在文本分类中仍表现稳定。

新闻分类处理流程

  1. 数据采集:收集已标注类别的新闻样本,例如政治、体育、娱乐等。
  2. 文本预处理:包括分词、删除停用词、词干提取等步骤。
  3. 特征工程:使用词袋模型或TF-IDF方法将文本转为数值特征。
  4. 模型训练:利用训练数据计算每个类别下各特征的条件概率。
  5. 模型评估:用测试集评估准确率、精确率、召回率等指标。
  6. 优化迭代:根据评估调整预处理、特征选择或模型参数。

朴素贝叶斯特点

  • 计算效率高,实现简单。
  • 能处理部分缺失数据。
  • 独立性假设虽不完美,但经验证明多数场景下仍有效。

实际应用场景

朴素贝叶斯在新闻分类、垃圾邮件过滤、情感判断等任务中广泛使用。本项目示例中,将新闻自动归属到预设类别,助力信息检索。

工具支持

Python 环境搭配 scikit-learn 的 MultinomialNB 或 BernoulliNB 分类器。NLP 处理可借助 jieba(中文分词)、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()
print(content[1000])

输出示例: "阿里巴巴集团昨日宣布,将在集团管理层面设立首席数据官岗位(Chief Data Officer)……"

使用 jieba 进行分词:

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)

# 查看一条结果
print(content_S[1000])

分词结果包含词序列,如"阿里巴巴"、"集团"、"宣布"等。

df_content = pd.DataFrame({'content_S': content_S})
df_content.head()

分词后,需过滤停用词。停用词指对类别判断贡献小的常用词,如"今天"、"在"、"的"等。这些词在多种类别中均可能出现,应当剔除。

加载停用词表:

stopwords = pd.read_csv("stopwords.txt", 
                        index_col=False, sep="\t", 
                        quoting=3, names=['stopword'], 
                        encoding='utf-8')
stopwords.head(20)

构建停用词过滤函数:

def drop_stopwords(contents, stopwords):
    # 实现过滤逻辑
    contents_clean = []
    for content in contents:
        clean = [word for word in content if word not in stopwords['stopword'].values]
        contents_clean.append(clean)
    return contents_clean

# 应用过滤并生成特征
clean_content = drop_stopwords(content_S, stopwords)

后续步骤包括使用 TF-IDF 或词袋模型进行特征提取,然后训练朴素贝叶斯分类器。建议使用 scikit-learn 的 TfidfVectorizer 和 MultinomialNB 完成。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB

# 将清洗后的词列表转换为字符串形式(以空格分隔)
clean_docs = [' '.join(doc) for doc in clean_content]

# TF-IDF 特征转换
vectorizer = TfidfVectorizer(max_features=5000)
X = vectorizer.fit_transform(clean_docs)

# 对应标签
y = df_news['category']

# 训练模型
model = MultinomialNB()
model.fit(X, y)

完成训练后,评估模型效果:

from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。