【数据挖掘实验】利用朴素贝叶斯方法对百万搜狐新闻文本数据进行分类

一、概述

本实验做的是一个很常见的数据挖掘任务:新闻文本分类。
语料库来自于搜狗实验室2008年和2012年的搜狐新闻数据,
下载地址:https://www.sogou.com/labs/resource/cs.php
实验工作主要包括以下几步:
1)语料库的数据预处理;
2)文本建模;
3)训练分类器;
4)对测试集文本分类;
5)结果评估。

二、实验环境搭建

本实验在Google Drive平台进行,利用平台免费的运算资源以及存储空间,使用Colaboratory实验环境完成。
不过Colab分配的环境是临时环境,文件不会一直保存,所以实验的第一步是连接Google Drive, 将相关文件保存在Drive里,便于访问和保存。

!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
!mkdir -p drive
!google-drive-ocamlfuse drive
import os
os.chdir("drive")
!ls

三、语料库的构建

本实验所采用的语料库是来自于搜狗实验室的搜狐新闻数据,包括2008年和2012年的新闻数据,我并从中选取了11种新闻分类的数据作为实验所需的训练和测试数据。
2012年新闻数据的文件格式是dat,编码格式为gb2312,数据组织形式为xml。
2008年的新闻数据解压后则是若干个txt文件,不过编码格式也是gb2312,数据组织形式也是xml,格式一致。
从精简版的示例数据,下图可以看到数据的格式。

处理步骤如下:
1)将文件编码格式转为utf-8;
2)用正则表达式匹配出其中的url和content部分;
3)从url中抽取出二级域名字段作为该文本的类别标签(content为文本内容);
4)忽略过长或过短的文本,统计阈值[30, 3000]内各类别下的文本数量,并排序展示;
5)从中选取适合做分类任务的11种分类:科技,汽车,股票,娱乐,体育,财经,健康,教育,女性,旅游,房地产,共计137万篇文本数据;
6)最后将所需要的数据保存为pkl文件。

# 以下实验所需要的包
import os
import re
import math
import operator
import chardet
import pickle
import jieba
import random
import datetime
from collections import defaultdict
from chardet import detect
import numpy as np
import pandas as pd
from sklearn.metrics import confusion_matrix,precision_score,recall_score,f1_score
1. 2012年新闻数据的处理
#转换2012年新闻数据的文件格式及编码格式
!cat news_sohusite_xml.dat | iconv -f gbk -t utf-8 -c > corpus.txt
#各类别文章统计
def cate_statistics(path):
  classfiy = {} #各类别下的文章数
  total = 0 #文章总数
  cnt_gt = 0 #大于阈值长度的文章数
  cnt_lt = 0 #小于阈值长度的文章数

  f = open(path)
  articles = f.readlines()
  f.close()

  for i in range(len(articles)//6):
    line = articles[i*6+1]
    content = articles[i*6+4]
    line = re.sub('<url>|</url>','',line)
    content = re.sub('<content>|</content>', '', content)
    url_split = line.replace('http://', '').split('.')
    sohu_index = url_split.index('sohu')
    
    if len(content) > 30 and len(content) < 3000:
      if url_split[sohu_index-1] not in classfiy.keys():
        classfiy[url_split[sohu_index-1]] = 1
      else:
        cl
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值