基于朴素贝叶斯的新闻分类实现方案(附完整代码与数据集)
本资源提供新闻分类项目所需完整代码和训练数据,已通过严格测试,保证可正常运行。适用于毕业设计、课程作业等场景,尤其适合人工智能、计算机科学等专业学生。下载后可先查看README.md文件,本项目仅限交流学习,请勿用于商业用途。
核心思路
基于朴素贝叶斯算法实现新闻自动分类。该算法利用贝叶斯定理,通过计算特征条件概率来预测类别,虽然假设特征间相互独立,但在文本分类中仍表现稳定。
新闻分类处理流程
- 数据采集:收集已标注类别的新闻样本,例如政治、体育、娱乐等。
- 文本预处理:包括分词、删除停用词、词干提取等步骤。
- 特征工程:使用词袋模型或TF-IDF方法将文本转为数值特征。
- 模型训练:利用训练数据计算每个类别下各特征的条件概率。
- 模型评估:用测试集评估准确率、精确率、召回率等指标。
- 优化迭代:根据评估调整预处理、特征选择或模型参数。
朴素贝叶斯特点
- 计算效率高,实现简单。
- 能处理部分缺失数据。
- 独立性假设虽不完美,但经验证明多数场景下仍有效。
实际应用场景
朴素贝叶斯在新闻分类、垃圾邮件过滤、情感判断等任务中广泛使用。本项目示例中,将新闻自动归属到预设类别,助力信息检索。
工具支持
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))