数据预处理
- 机器学习中,最为基础也是最为耗时的一项工作就是数据预处理。如何将海量数据进行预处理,进而得到数据处理和机器学习阶段所需要的有效素材是一项非常重要的工作。
- 此文将以海量新闻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('&', '&')
# 添加'</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