搜狗新闻语料库解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010122972/article/details/79543061

搜集语料,考虑使用搜狗新闻语料库。但其采用了gbk编码,在ubuntu下打开为乱码,需要将编码格式转换为utf。
直接采用shell命令进行转码:

cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>"  > a.txt

但得到的txt文件中会有些许乱码

想尝试在windows下打开(windows默认gbk编码格式)后转码保存,但文件解压后接近1.5G,记事本、写字板和word等都无法打开。又想直接使用转码工具进行转码,但文件是.dat格式,不能直接转码。

于是,先将.dat格式的文件分割为多个.txt文件,再使用小工具进行批量转码:

# -*- coding:utf8 -*- 
import re       
def split():
    p = re.compile('</doc>',re.S)
    end = '</doc>'
    fileContent = open('news_tensite_xml.dat','r').read();  #读文件内容
    paraList = p.split(fileContent)     #根据</doc>对文本进行切片
    #print(len(paraList))

    fileWriter = open('files/0.txt','a')  #创建一个写文件的句柄
    #遍历切片后的文本列表
    for paraIndex in range(len(paraList)):
        #print(paraList[paraIndex])
        fileWriter.write(paraList[paraIndex])   #先将列表中第一个元素写入文件中
        if(paraIndex != len(paraList)):         #不加if这两行的运行结果是所有的</doc>都没有了,除了最后分割的文本
            fileWriter.write(end)
        if((paraIndex+1)%5000==0):              #5000个切片合成一个.txt文本
            fileWriter.close()
            fileWriter = open('files/'+str((paraIndex+1)/5000)+'.txt','a'); #重新创建一个新的句柄,等待写入下一个切片元素。注意这里文件名的处理技巧。
    fileWriter.close()          #关闭最后创建的那个写文件句柄
    print('finished')

split()

这样files文件夹下就包含了250+个分裂开的txt文件,使用批量转码小工具(网上一搜一大堆)将这些txt文件由gbk转化为utf,就得到了utf编码格式的txt文件,此时在ubuntu下打开这些txt文件,不再是乱码。

最后,需要将txt里面的content即正文部分提取出来,合并为一个txt:

# coding: utf8 

import os  
from xml.dom import minidom  
from urlparse import urlparse  
import codecs  
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

def file_fill(file_dir):   
    for root, dirs, files in os.walk(file_dir):  
        for f in files:  
            tmp_dir = 'decodes' + '/' + f  # 加上标签后的文本  
            text_init_dir = file_dir + '/' + f  #原始文本  
            # print text_init_dir  
            file_source = codecs.open(text_init_dir, 'r')  
            ok_file = codecs.open(tmp_dir, 'w','utf-8')  
            start = '<docs>\n'  
            end = '</docs>'  
            line_content = file_source.readlines()  
            ok_file.write(start)  
            for lines in line_content:  
                text1 = lines.replace('', '') 
                text=text1.replace('&', '&amp;') 
                ok_file.write(text)  
            ok_file.write(end)  

            file_source.close()  
            ok_file.close()  

def file_read(file_dir):   
    b=codecs.open('final.txt','w','utf-8')
    for root, dirs, files in os.walk(file_dir):  
        for f in files:  
            doc = minidom.parse(file_dir + "/" + f)  
            root = doc.documentElement  
            claimtext = root.getElementsByTagName("content")   
            for index in range(0, len(claimtext)):  
                if (claimtext[index].firstChild == None):  
                    continue  
                b.write((claimtext[index].firstChild.data).encode('utf8'))
    b.close()



if __name__=="__main__":  
    file_fill("files")  
    file_read("decodes")

注:对于文件读写,默认是unicode,所以需要加入

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

来将编码格式转化为utf-8,否则,file_read时

doc = minidom.parse(file_dir + "/" + f)  

这句会报错

猜你喜欢

转载自blog.csdn.net/u010122972/article/details/79543061