前言

使用BBC Sport数据集的新闻文本分类,这个数据集比较古老,又是英文数据集,且不需要进行文本处理,之前在网络上并没有找到使用这个数据集的中文资料。所以写了一篇博客。本人初学者,有些方面掌握的也并不是很好,请多多指教。

有关数据集

数据集下载自http://mlg.ucd.ie/datasets/bbc.html
raw text files为原始的新闻文本,已经按类放在不同的文件夹下
pre-processed dataset为经过分词,停止词剔除后的数据,共有四种,具体内容链接网站内有详细介绍。
我使用这些数据时,将前者的根文件夹命名为bbcsport_raw,后者命名为bbcsport。

代码部分1

from sys import path
from numpy.core.fromnumeric import size
import pandas as pd
import numpy as np
import mathdic = {'0':'athletics','1':'cricket','2':'football','3':'rugby','4':'tennis'}
# print(dic['0'])df_mtx = pd.read_table('D:\\DATA_PYTHON\\bbcsport\\bbcsportmtx.txt',sep=' ',header=None,index_col=None,skiprows=2)
# print(df_mtx)
# print(df_mtx.dtypes)
# df_mtx = df_mtx.astype(int)
# print(df_mtx[:5])
# print(df_mtx.dtypes)
df_classes = pd.read_table('D:\\DATA_PYTHON\\bbcsport\\bbcsportclasses.txt',sep=' ',header=None,index_col=0,skiprows=4,names=[0])
# print(df_classes)
df_terms = pd.read_table('D:\\DATA_PYTHON\\bbcsport\\bbcsportterms.txt',header=None)
df_terms.index = range(1,len(df_terms)+1)
# print(df_terms[0:5])

对于所读取的数据的说明: df_mtx为稀疏矩阵的市场矩阵term频次数据分布。
市场矩阵的前两列为某term的频次信息在稀疏矩阵的第几行第几列(从1开始) .第三列为 频次信息。
稀疏矩阵的行代表terms序号(从1开始),列代表文章的序号(从001开始) 。
df_classes对应编号的新闻所对应的运动种类 df_termsterm,从1开始,与df_mtx对应。
有关矩阵市场,稀疏矩阵的内容百度即可。

如何根据每篇文章的单词词频构建出特征是文本分类最重要的一步.这里已经有了经过分词和停止词筛选后的数据集,若是使用其他原始的文本数据,则需要进行相似处理。
我采用的是使用VSM模型和TF-IDF构建文本的特征向量最后采用SVM进行分类,有关VSM的知识参考自:
https://blog.csdn.net/weixin_42398658/article/details/85063004
TF-IDF:某词语在一篇文章中出现的频次越高,出现的文章数量越少,则TF-IDF的值越大,TF-IDF反映了term对于某篇document的辨识度:
https://blog.csdn.net/zhaomengszu/article/details/81452907

doc_range = list(range(1,738))
term_range = list(range(1,4615))
VSM = pd.DataFrame(index=doc_range,columns=term_range)
# 计划用行向量储存每篇文章的特征向量
# print(VSM)
def word_count(file_path): with open(file_path,'r',encoding='gb18030', errors='ignore') as f:content = f.read()# print(content,type(content))n = content.count(' ')+math.ceil(content.count('\n')/2)f.close()return n
# word_count统计文本中的单词总数(采用的是数' '的方式,一般与实际的词数差距不会太大,并且简单明了)
path_prefix = 'D:\\DATA_PYTHON\\bbcsport_raw\\'
# print(word_count(path_prefix+dic['0']+'\\001.txt'))
def TF_IDF(doc_index,file_path,term):a = df_terms[(df_terms[0]==term)].index.values[0]b = word_count(file_path)e = df_mtx[(df_mtx[0]==a)&(df_mtx[1]==doc_index)].index.valuesif e.size > 0:c = df_mtx[2][df_mtx[(df_mtx[0]==a)&(df_mtx[1]==doc_index)].index.values[0]]else:return 0TF = c/b# return TFd = len((df_mtx[df_mtx[0]==a]).index.values)+1IDF = math.log(737/d)# return IDFtf_idf = TF*IDFreturn tf_idf
# print(TF_IDF(1,path_prefix+dic['0']+'\\001.txt','hunt'))
# TF_IDF用于计算某一term在某一document中的TF-IDF值VSM.at[1,1] = TF_IDF(1,path_prefix+dic['1']+'\\'+str(102-101).zfill(3)+'.txt',df_terms.at[1,0])
print(VSM)for i in range(1,738):for j in range(1,4614):if i <= 101:VSM.at[i,j] = TF_IDF(i,path_prefix+dic['0']+'\\'+str(i).zfill(3)+'.txt',df_terms.at[j,0])VSM.at[i,4614] = 0print(i,j)elif i <= 225:VSM.at[i,j] = TF_IDF(i,path_prefix+dic['1']+'\\'+str(i-101).zfill(3)+'.txt',df_terms.at[j,0])VSM.at[i,4614] = 1print(i,j)elif i <= 490:VSM.at[i,j] = TF_IDF(i,path_prefix+dic['2']+'\\'+str(i-225).zfill(3)+'.txt',df_terms.at[j,0])VSM.at[i,4614] = 2print(i,j)elif i <= 637:VSM.at[i,j] = TF_IDF(i,path_prefix+dic['3']+'\\'+str(i-490).zfill(3)+'.txt',df_terms.at[j,0])VSM.at[i,4614] = 3print(i,j)else:VSM.at[i,j] = TF_IDF(i,path_prefix+dic['4']+'\\'+str(i-637).zfill(3)+'.txt',df_terms.at[j,0])VSM.at[i,4614] = 4print(i,j)
VSM.to_csv('VSM.csv')
# 双循环的64位浮点运算很慢,慢到难以忍受(全程大概90分钟);事后舍友说采用pandas自带的transform方法或许会变快,有兴趣的话可以尝试一下.

代码部分2

以下为简单地调用sklearn中的SVC进行的分类:

import pandas as pd
import numpy
from sklearn.model_selection import train_test_split
from sklearn.svm import SVCVSM = pd.read_csv('D:\\Python_Work\\VSM.csv',index_col=0)
# print(VSM)
x = VSM.iloc[:,:4613].values
y = VSM[['4614']].values
train_data,test_data,train_label,test_label = train_test_split(x,y,random_state=1,train_size=0.7,test_size=0.3)model = SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovo')
model.fit(train_data,train_label.ravel())train_score = model.score(train_data,train_label)
print("训练集:",train_score)
test_score = model.score(test_data,test_label)
print("测试集:",test_score)

有关SVC的使用,请阅读sklearn的手册或百度查询。

最终结果

训练集: 1.0
测试集: 0.9684684684684685

使用BBC Datasets中的BBCSport数据集进行文本分类(新闻分类)相关推荐

  1. sklearn库中的标准数据集及基本功能

    [sklearn库] sklearn是scikit-learn的简称,是一个基于Python的第三方模块.sklearn库集成了一些常用的机器学习方法,在进行机器学习任务是,并不需要实现算法,只需要简 ...

  2. Pytorch:NLP 迁移学习、NLP中的标准数据集、NLP中的常用预训练模型、加载和使用预训练模型、huggingface的transfomers微调脚本文件

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) run_glue.py微调脚本代码 python命令执行run ...

  3. Huggingface datasets库读取yelp_review_full数据集时下载失败的解决方法

    Huggingface datasets库读取yelp_review_full数据集时下载失败的解决方法 问题:datasets.load_dataset()下载失败 解决方法 方法一:修改数据集下载 ...

  4. RecSys Datasets 推荐系统实验常用数据集大全

    目录 Shopping Advertising Check-in Movies Music Books Games Anime Pictures Jokes Exercises Websites Ad ...

  5. R语言基于MASS包中的shuttle数据集以及neuralnet包构建神经网络模型

    R语言基于MASS包中的shuttle数据集以及neuralnet包构建神经网络模型 目录 R语言基于MASS包中的shuttle数据集以及neuralnet包构建神经网络模型

  6. 【沃顿商学院学习笔记】商业分析——Customer Analytics:05 营销中的新兴数据集:营销科学的未来 EMERGING DATA SETS IN MARKETING

    商业进阶--营销科学的未来 本章主要从当今营销领域的五大分析应用领域:数据Data.探索数据Data Explorer.预测模型Predictive Model.优化Optimization和决策De ...

  7. coco数据集(yoloV5格式)中生成子类数据集

    从coco数据集(yoloV5格式)中生成子类数据集. import os from tqdm import tqdmnames = ['person', 'bicycle', 'car', 'mot ...

  8. LIBSVM实验-在matlab中使用heart_scale数据集

    目录 LIBSVM实验-在matlab中使用heart_scale数据集 0运行环境 1实验结果 2配置环境 3数据集测试 LIBSVM实验-在matlab中使用heart_scale数据集 这是阿诚 ...

  9. 使用TSA包中的 beersales 数据集建立TAR模型

    )使用TSA包中的 beersales 数据集建立TAR模型 library(TSA) data("beersales") prey.tar.1=tar(y=beersales,p ...

最新文章

  1. 服务端如何识别是selenium在访问以及解决方案参考二
  2. Nova Conductor 与 Versioned Object Model 机制
  3. MySQL 不落地迁移、导入 PostgreSQL - 推荐 rds_dbsync
  4. jq第一天(1.83里面的属性)属性-》属性
  5. angular 使用data-bs-datepicker时的一个小问题及解决
  6. 如何通过数据分析鉴别假微博大V?
  7. Spring boot (1)--- 第一个应用程序helloworld
  8. STM8单片机低功耗---停机(Halt)模式实现
  9. Python网页抓取
  10. 《SQL高级应用和数据仓库基础(MySQL版)》作业v2 ·001【MySQL50题】
  11. android markdown 框架,Android Studio MarkDown风格README的正确打开姿势
  12. Linux例行性工作排程 (crontab)
  13. php无法调用shell脚本文件,php调用shell脚本--126错误
  14. 安卓 实现一个简单的计算器
  15. cocosBuilder使用总结
  16. 计算机网络视频信号怎么传,如何将摄像机视频信号通过NDI传输到Zoom会议软件...
  17. IGV web 工具部署
  18. ie浏览器 “嗯...无法访问页面 尝试此操作...”的解决办法
  19. 深入详解python高级特性——函数柯里化(Currying)与反柯里化
  20. 什么是Cherry-Pick IDEA中怎么使用Cherry-Pick

热门文章

  1. 推荐26个GitHub上好玩又有挑战的前端项目(涵盖初中高阶)
  2. 神经网络算法的关键参数,神经网络输入输出计算
  3. 《华为研发》 张利华
  4. 必读!速卖通欧盟VAT税改政策解读!必做6件事!
  5. 基于asp.net723久久婚庆网站
  6. python初学者爬取数据完整教程
  7. FFmpeg的远程视频监控系统编解码
  8. 大数据分析对供应链的影响
  9. 怎么选择EDIUS和VEGAS
  10. 阿里云25端口解封教程完美解决25端口封禁的方法