版权声明:本文为博主原创文章,未经博主允许不得转载。 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('&', '&')
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)
这句会报错