最近一个都在整数据挖掘课程的大作业,终于告一段落,也有时间来更新一些博客。第一次接触文本分类,一个月内学到了太多,期间涉及到的一些处理上的主要部分需要总结一下,以便之后查阅。
这次主要总结搜过语料库的获取,因为老师要求20万数据,而我自己只爬了2万多,所以用到了搜狗的语料库,链接推送门点击这里
在这个页面中,我选择的是一个月的数据,别小看一个月,我从里面只用了24万,这24万可能在这一个月里都不算什么........做个实验还是很够用的。
下载下来是这个样子......
其中每个txt文本是这个样子.....
很明显,是xml格式,但是这一个txt里就包含了很多doc文档的内容,怎样把这些文档一篇篇提取出来,并且分到不同的类别去呢??这就需要接下来的处理。
首先,我们知道,像上文这样的txt的xml格式是无法解析的,因为不完整,缺啥?<docs></docs>
但是!我们不可能一个txt一个txt的手工加吧(有128个txt),还是需要遍历一下用程序加的。python用提供了一个解析xml很好用的minidom.parse函数,这个函数的用法比较简单,可以通过root.getElementsByTagName()来获取xml中需要的部分(可以查下这个函数的用法,比较好理解),这里我获取的是url和content,获取url的目的是为了获取域名,这样就可以根据域名来判断这篇文章属于什么类别里啦~对了,忘 了说一点,这样做运行时会出现bug,问题是因为有的url中出现了无法解析的&,所以在给每个txt加<docs></docs>的同时,别忘了把出现的&替换成&;这样就能正常解析了。
程序如下:
#!/usr/bin/python
# -*- encoding:utf-8 -*-
import os
from xml.dom import minidom
from urlparse import urlparse
import codecs
# import importlib,sys
# default_encoding = 'utf-8'
# if sys.getdefaultencoding() != default_encoding:
# importlib.reload(sys)
# sys.setdefaultencoding(default_encoding)
def file_fill(file_dir): #得到文本.txt的路径
for root, dirs, files in os.walk(file_dir):
for f in files:
tmp_dir = '.\sougou_after2' + '\\' + f # 加上标签后的文本
text_init_dir = file_dir + '\\' + f #原始文本
# print text_init_dir
file_source = open(text_init_dir, 'r')
ok_file = open(tmp_dir, 'a+')
start = '<docs>\n'
end = '</docs>'
line_content = file_source.readlines()
ok_file.write(start)
for lines in line_content:
text = lines.replace('&', '&')
ok_file.write(text)
ok_file.write(end)
file_source.close()
ok_file.close()
def file_read(file_dir): #得到文本.txt的路径
for root, dirs, files in os.walk(file_dir):
for f in files:
print f
doc = minidom.parse(file_dir + "\\" + f)
root = doc.documentElement
claimtext = root.getElementsByTagName("content")
claimurl = root.getElementsByTagName("url")
for index in range(0, len(claimurl)):
if (claimtext[index].firstChild == None):
continue
url = urlparse(claimurl[index].firstChild.data)
if dicurl.has_key(url.hostname):
if not os.path.exists(path + dicurl[url.hostname]):
os.makedirs(path + dicurl[url.hostname])
fp_in = file(path + dicurl[url.hostname] + "\%d.txt" % (len(os.listdir(path + dicurl[url.hostname])) + 1),"w")
fp_in.write((claimtext[index].firstChild.data).encode('utf8'))
# has_key(url.hostname)
# break
if __name__=="__main__":
# folder = file_fill(".\sougou_before2")
path = ".\sougou_all\\"
#建立url和类别的映射词典
dicurl = {'auto.sohu.com':'qiche','it.sohu.com':'hulianwang','health.sohu.com':'jiankang',\
'sports.sohu.com':'tiyu','travel.sohu.com':'lvyou','learning.sohu.com':'jiaoyu',\
'career.sohu.com':'zhaopin','cul.sohu.com':'wenhua','mil.news.sohu.com':'junshi',\
'house.sohu.com':'fangchan','yule.sohu.com':'yule','women.sohu.com':'shishang',\
'media.sohu.com':'chuanmei','gongyi.sohu.com':'gongyi','2008.sohu.com':'aoyun', \
'business.sohu.com': 'shangye'}
#
file_read(".\sougou_after2")
说明一下几个目录:
sougou_before2:存放原始的txt
sougou_after2:存放加上<docs></docs>且处理了&的txt
sougou_all:存放分好类的文档们
sougou_all的目录结构如下:这样就得到了文本分类所需要的数据集
这样,我得到了10个分类,供24万多篇文章。(其实我只用到了96个txt,如果用整个的128个txt的话,感觉会有将近50万篇文章吧)