如何有效地进行文本分类——数据预处理

数据预处理

  • 机器学习中,最为基础也是最为耗时的一项工作就是数据预处理。如何将海量数据进行预处理,进而得到数据处理和机器学习阶段所需要的有效素材是一项非常重要的工作。
  • 此文将以海量新闻xml原始数据处理为例,展示如何有效第进行数据预处理工作。
原始数据特征
  • 该数据来源于“搜狗实验室数据库”的“全网新闻数据”http://www.sogou.com/labs/resource/cs.php
  • 该数据是直接爬取的网页xml格式信息,存在大量的格式标签文件(见下图)
  • 因此,第一步就是提取xml格式中‘’标签内的有效数据
    在这里插入图片描述
1、xml格式有效信息提取
  • xml格式信息的标签缺失,首先需要补齐
  • 利用urllib工具进行xml文件解析,获取url(域名)和content(正文)标签信息
  • url中的"&“要用”&"替换才能解析url
# 导入所需的工具包
import os,random
from xml.dom import minidom
from urllib.parse import urlparse
import codecs
# 预处理xml文件,解决docs,url,content标签问题
def file_fill(file_dir,half_dir):
    # 查看half_dir文件夹下的文件夹和文件目录
    for _,_,files in os.walk(file_dir):
        # 判断是否存在half_dir,如果没有则创建
        if not os.path.exists(half_dir):
            os.makedirs(half_dir)
        for f in files:
            tmp_dir = half_dir+'/'+f
            text_init_dir = file_dir+'/'+f
            # 遍历文件夹下的每一篇xml文件
            with open(text_init_dir, 'r', encoding='gb18030') as source_file:
                start,end = '<docs>\n','</docs>'
                line_content = source_file.readlines()
                # 在目标文件夹中创建新文件保存预处理后的文件
                with open(tmp_dir, 'w+', encoding='utf-8') as handle_file:
                    # 添加'<docs>'头标签
                    handle_file.write(start)
                    for line in line_content:
                        # 处理url中的‘&’符号
                        text = line.replace('&', '&amp;')
                        # 添加'</docs>'头标签
                        handle_file.write(text)
                    handle_file.write(end)
2、定义labels和check_class分类判别函数
  • labels为url与文章类别的映射字典
  • check_class则直接判断url是否在分类字典中
# 建立url和类别的映射字典
labels = {'auto':'汽车','tech':'科技',
          'health':'健康','sports':'体育',
          'house':'房产','edu':'教育',
          'lady':'女人','eladies':'女人',
          'mil':'军事','military':'军事',
          'money':'财经','finance':'财经',
          'cul':'文化','culture':'文化',
          'fun':'娱乐','2008':'奥运'
         }
# 检查url对应的文章是否在分类字典中
def check_class(url_lb,labels):
    if url_lb in labels:
        return True
    return False
3、运行程序,获取预处理后的数据
  • 获取预处理后的xml文件
file_dir = './SogouCA.reduced'
half_dir = './sougou_half'
file_fill(file_dir,half_dir)
4、获取部分样本文件
  • 由于数据量太大,进行简化处理,
  • 从half_dir中随机选取n个文件存入after_dir文件夹中
# 部分样本获取函数
def choice_files(half_dir,choice_dir,n):
    if not os.path.exists(choice_dir):
        os.makedirs(choice_dir)
    for _,_,files in os.walk(half_dir):
        file_list = random.sample(files,n)
        for file in file_list:
            with open(half_dir+'./'+file,'r',encoding='utf-8') as f1:
                doc = f1.read()
                path = './'+choice_dir+'./'+file
                with open(path,'a+',encoding='utf-8') as f2:
                    f2.write(doc)
    print('文件存储完毕')
    return file_list
# 随机抽取10个文件进行深加工
choice_dir = './sougou_choice'
file_list = choice_files(half_dir,choice_dir,10)
5、提取文档文本内容
  • 遍历预处理好的xml文件,提取content标签中的文本并重新保存
# 定义文本提取函数
def file_read(file_dir,labels,path):
	
    for _,_,files in os.walk(file_dir):
        for f in files:
            filename = file_dir+'/'+f
            doc = minidom.parse(filename)
            root = doc.documentElement
            claimtext = root.getElementsByTagName('content')
            claimurl = root.getElementsByTagName('url')
            for ind in range(len(claimurl)):
                if claimtext[ind].firstChild == None:
                    continue 
                url = urlparse(claimurl[ind].firstChild.data)
                url_lb = url.hostname.strip().split('.')[0]
                if check_class(url_lb,labels):              
                    if not os.path.exists(path):
                        os.makedirs(path)
                    if not os.path.exists(path+'./'+labels[url_lb]):
                        os.makedirs(path+'./'+labels[url_lb])
                    file_name = path+'./'+labels[url_lb]+'./'+"{}.txt".format(labels[url_lb])
                    with open(file_name,"a+",encoding='utf-8') as file_in:
                        file_in.write(claimtext[ind].firstChild.data+'\n')
# 定义存放最后文件的文件夹地址
path = "./sougou_after"
# 将选好的文件进行纯文本提取和分类存储
file_dir = 'sougou_choice'
file_read(file_dir,labels,path)

参考网址:https://blog.csdn.net/sgfmby1994/article/details/53436228

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值