科大讯飞2021学术论文分类挑战赛暨SGDClassifier分类器构建

需要登录后才允许下载文件包。登录
合集:AI案例-NLP-传媒业
赛题:学术论文分类挑战赛
主办方:科大讯飞 x Datawhale
主页:http://challenge.xfyun.cn/topic/info?type=academic-paper-classification
AI问题:文本分类
数据集:5万篇论文训练集,每篇论文都包含论文id、标题、摘要和类别四个字段。
数据集价值:构建论文分类模型。
解决方案:SGDClassifier分类器

一、赛题描述

背景

随着人工智能技术不断发展,每周都有非常多的论文公开发布。现如今对论文进行分类逐渐成为非常现实的问题,这也是研究人员和研究机构每天都面临的问题。现在希望选手能构建一个论文分类模型。

任务

本次赛题希望参赛选手利用论文信息:论文id、标题、摘要,划分论文具体类别。

二、数据集描述

数据说明

训练数据和测试集以csv文件给出,其中:

  • 训练集5万篇论文。其中每篇论文都包含论文id、标题、摘要和类别四个字段。
  • 测试集1万篇论文。其中每篇论文都包含论文id、标题、摘要,不包含论文类别字段。

数据集版权许可协议

BY-NC-SA 4.0
https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans

三、解决方案样例

源码:NLP_Academic_Papers_Classification.ipynb。该源码实现了一个学术论文分类系统,使用了 TF-IDF 特征提取和 SGDClassifier 分类器。

  • TF-IDF 全称是 Term Frequency-Inverse Document Frequency,TF是词频,IDF是逆文档频率结合起来,TF-IDF 能够反映一个词在文档中的重要程度,同时减少常见词的权重TfidfVectorizer() 是 Scikit-learn 中用于将文本数据转换为 TF-IDF 特征向量,目标是将原始文本转化为数值型矩阵,供机器学习模型(如分类器、聚类算法)使用。
  • SGDClassifier 是 Scikit-learn 中基于随机梯度下降(Stochastic Gradient Descent)的线性分类器。它通过迭代优化损失函数来训练模型,适用于大规模数据集和高维特征空间。

导入相关系统库

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import cross_val_score

【本样例运行环境的关键版本信息】

python 3.12.3

sklearn-compat 0.1.3

关键组件

TF-IDF 向量化

  • 将文本转换为反映词语重要性的数值向量
  • TF (词频): 词语在当前文档中的出现频率
  • IDF (逆文档频率): 降低常见词的权重,提高稀有词的重要性
  • 最终 TF-IDF = TF × IDF

SGDClassifier

  • 随机梯度下降优化的线性分类器
  • 优点:高效,适合大规模数据
  • 默认参数使用 hinge loss + L2 正则化
  • 适合高维稀疏数据(如文本特征)

交叉验证

  • 使用5折交叉验证评估模型性能
  • 将数据分成5份,轮流用4份训练,1份测试
  • 最终取5次测试结果的平均作为性能估计

工作流程

1. 数据加载与探索

首先加载了训练集(train.csv)和测试集(test.csv):

  • 训练集:50,000 篇论文,包含 paperid, title, abstract, categories 四个字段
  • 测试集:10,000 篇论文,缺少 categories 字段

数据示例显示论文类别是类似”cs.CL”(计算机科学-计算语言学)的学科分类代码。

train_df = pd.read_csv('./data/train.csv', sep='\t')
test_df = pd.read_csv('./data/test.csv', sep='\t')

train_df.shape, test_df.shape

输出:((50000, 4), (10000, 3))

2. 特征工程

使用了 TF-IDF (Term Frequency-Inverse Document Frequency) 方法将文本转换为数值特征:

  • TfidfVectorizer(max_features=500) 创建转换器,限制最多使用500个特征词
  • 分别测试了三种文本输入方式:
    1. 仅使用标题(title):交叉验证准确率约48.5%
    2. 仅使用摘要(abstract):准确率约61.2%
    3. 标题+摘要组合:准确率最高,约62.6%
# TF-IDF 全称是 Term Frequency-Inverse Document Frequency,TF是词频,IDF是逆文档频率
# 结合起来,TF-IDF 能够反映一个词在文档中的重要程度,同时减少常见词的权重
# TfidfVectorizer() 是 Scikit-learn 中用于将文本数据转换为 TF-IDF 特征向量,目标是将原始文本转化为数值型矩阵,供机器学习模型(如分类器、聚类算法)使用
tfidf = TfidfVectorizer(max_features=500) # max_features=500 限制生成的词汇表大小,仅保留前 500 个高频词作为特征

# 将“标题”转换为 •TF-IDF 特征矩阵,用于后续机器学习模型的训练
train_tfidf = tfidf.fit_transform(train_df['title'])

# 初始化一个•随机梯度下降分类器 (SGD Classifier)•,用于文本分类任务
clf = SGDClassifier()
# 通过 •5 折交叉验证 (Cross-Validation) ••评估 SGDC 分类器的性能
cross_val_score(clf, train_tfidf, train_df['categories'], cv=5)

# 将“摘要”转换为 •TF-IDF 特征矩阵,用于后续机器学习模型的训练
train_tfidf = tfidf.fit_transform(train_df['abstract'])

clf = SGDClassifier()
cross_val_score(clf, train_tfidf, train_df['categories'], cv=5)

3. 模型训练

选择了 SGDClassifier (随机梯度下降分类器):

  • 线性分类器,适合大规模数据
  • 默认使用 hinge loss (等价于线性SVM)
  • 通过fit()方法在组合特征(标题+摘要)上训练
clf = SGDClassifier()
# fit() 是 Scikit-learn 模型训练的接口,其作用是通过输入数据•学习模型参数,使模型能够对未知数据进行预测
# fit() 参数 X: 特征矩阵,如 train_tfidf,其形状为 (n_samples, n_features)
# fit() 参数 y: 目标标签向量,如 train_df['categories'],其形状为 (categories)
clf.fit(train_tfidf, train_df['categories'])

4. 预测与输出

对测试集同样处理:

  1. 组合标题和摘要
  2. 用相同的 TF-IDF 转换器转换为特征
  3. 用训练好的模型预测类别
  4. 输出包含 paperid 和预测类别的 CSV 文件
test_df['title_abstract'] = test_df['title'] + ' ' + test_df['abstract']
test_tfidf = tfidf.transform(test_df['title_abstract'])

test_df['categories'] = clf.predict(test_tfidf)
test_df[['paperid', 'categories']].to_csv('submit.csv', index=None)

运行结果

输出文件数据样例:submit.csv

paperid categories
test_00000 cs.OH
test_00001 cs.SE
test_00002 cs.SE
test_00003 cs.CC
test_00004 cs.LO
test_00005 cs.DS
test_00006 cs.SY
test_00007 cs.SE
test_00008 cs.CV

源码开源协议

GPL-v3

四、获取案例套装

需要登录后才允许下载文件包。登录

发表评论