1.格式转换
原始数据集是只读的xml格式文件(news_sohusite_xml.dat)。首先是编码问题,需要将文件转换为UTF-8编码;然后是标签问题,原始XML格式文件缺少根标签,需要自行添加。本次格式转换部分用java语言实现,逐行读取内容,然后写入目标文件,并在目标文件的首尾加上自定义的根标签,最终得到格式转换后的文件news_sohusite_xml.txt。格式转换代码如GBK2UTF8.java,实现了GBK向UTF-8格式的转换
2.XML解析
搜狐新闻文件的格式为XML文件,需要对XML文件进行解析,格式如下: 本次需要解析出url地址,用于判断新闻对应的类别;需要解析出docno,作为存储文件的名称,需要解析出content,作文单个文本的内容。
XML解析的三种方案
正则表达式:正则表达式可以解析任意格式的文本,但正则表达式适用于对满足指定条件的文件内容进行查找或搜索,而本次需要将url、docno、content同时解析出,正则表达式不擅长这种结构化文本的解析;
BeautifulSoup:一个python的XML解析库,beautifulsoup的容错能力优于正则表达式,但beautifulsoup需要一次性读取全部文件才能够解析出数据,这种机制使得它的解析速度较慢,而且不能处理大文件;本次的原始文件比较大,beautifulsoup无法使用;
SAX:一个基于事件的XML解析库,java、python均内置这种库。由于SAX基于事件,可以边读取边解析,不需要一次性读取全部文件,所以该方法能很好地支持大文件解析。本次选用该方法。
SAX解析XML文件的代码在saxparser包中,解析完毕后,输出文件在dataout路径下:
3.数据集的挑选
本次按服务器主机名分类,类别比较多;同时,大部分类别中的文档数目太少,样本容量不足。所以,本次决定初步筛选出文档数目排名前50的类别。
4.数据集的精选
为了使数据集的类别区分度明显,本次从排名前50的数据集中选出有代表性的8个类别;为了使样本类别均衡,每个类别中挑出1000个文档;将每个类别的文档分为两份——600和400,分别用于训练和测试。这样,就得到了8*600的训练集和8*400的测试集。
转码处理在python平台分别对训练集traindata和测试集testdata进行转码,从GBK转为UTF-8编码,得到转码后的训练集train_raw和测试集test_raw。实现转码的代码文件为CodeChange.py 注意:转码过程中要decode()函数要加上”ignore”选项,忽略非GBK字符 page = page.decode("GBK",'ignore').encode('utf-8')
分词处理本次分词采用python平台的jieba分词工具,将训练集train_raw内容分词,分词后的文档存储在train_seg目录下;用同样的方法对测试集test_raw进行分词,保存在test_seg路径下。实现分词的代码文件为WordSeg.py 注意:读取文本时需要将换行符替换掉,并将空白字符替换掉;切分文本时,应该使cut_all选项为False,不采用全切分模式。构建文本的Bunch对象将分词完毕的文本train_seg/train_seg生成Bunch对象,Bunch对象中将每个文档的filelabel、filepath、content按对应次序保存起来,并保存所有类别targetlabels。训练集train_seg生成的Bunch对象序列化到磁盘文件train_seg_bunch.dat;用同样的方法将测试集test_seg生成Bunch对象,并序列化到磁盘文件test_seg_bunch.dat。该部分的实现代码为Seg2Bunch.py。 注意:在整合bunch_list过程中,需要把已经使用完毕的bunch手动删除,回收内存。 生成TF-IDF词向量空间对象反序列化train_seg_bunch.dat,读取停用词文件得到停用词列表stop_words,通过train_seg_bunch与stop_words构建train_tfidfspace对象,并序列化到文件train_tfidfspace.dat;通过test_seg_bunch、stop_words、train_tfidfspace构建test_tfidfspace对象,并序列化到文件test_tfidfspace.dat。该部分的实现代码见文件filebunch2TFIDF.py执行预测反序列化训练集词向量空间train_tfidfspace与测试集词向量空间test_tfidfspace。用train_tfidfspace训练分类器,然后用训练好的分类器进行预测,最后计算错误率。该部分的实现代码见文件bayes.py。相关地址搜狗实验室新闻数据java语言数据集获取部分python语言部分精选后的数据集新闻热点
疑难解答