解析搜狗新闻语料库

最近收到很多要语料的,我把关于这个的都放在百度云盘了。链接: https://pan.baidu.com/s/1tZj8MDiPfCT2SYBvClQbew 提取码: krbd ;大家有需要就从里面找吧!不零碎得回复大家了。

我的天,清明节三天假期,我竟然除了逛街闲游,只做了一件事儿,不过还是很开心,终于把待用的训练文本解析出来了。在这里,非常感谢参考文章的作者们,你们的经验给了我极大的帮助。[捂脸]

1.下载语料资源并转换编码格式

所用的文本是搜狗实验室数据资源,新闻资源中的搜狐新闻数据。下载的是压缩后的完整版(648MB),解压缩之后是一个.dat文件,差不多是2.02GB。同时也下载了精简版,精简版解压缩后是很多的.txt文件。

 下载好待用的资源,后面就是解析了,可是问题来了,这个.dat文件太大了,想用记事本什么的打开根本是不可能的,但是我们必须打开,因为我们在用精简版的.txt做解析时,需要首先将.txt文本的编码格式从ASCII转换为UTF-8,同样这个.dat文件的编码格式一定也是ASCII怎么办呢?只能用vimVim是一个强大的文本编辑器,我们的目的是改变.dat的编码格式。所以打开VIM,执行下面的操作:

:e (用鼠标把文件拖进来就可以)
:set encoding
返回encoding = cp936
:set fileencoding=UTF-8
:w!

 到这里我们就完成了第一步,转换文本编码格式。下一步我们要用Python写个小脚本把.dat分解成几个.txt,这样便于后面的统一操作,就可以按照解析精简版的方法解析这个大文件了。第三步就是将xml文件转换为分类后的.txt文件。

2.分割.dat为几个.txt

#! /usr/bin/env Python3
# -*- coding:utf8 -*- 
import re       #正则表达式

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

    fileWriter = open('./files/0.txt','a',encoding='utf8')  #创建一个写文件的句柄
    #遍历切片后的文本列表
    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',encoding='utf8'); #重新创建一个新的句柄,等待写入下一个切片元素。注意这里文件名的处理技巧。
    fileWriter.close()          #关闭最后创建的那个写文件句柄
    print('finished')

 3.xml文本解析 

#! /usr/bin/env Python3
# -*- encoding:utf-8 -*-  
import os
from xml.dom import minidom  
from urllib.parse import urlparse

def file_fill(file_dir):
    for root, dirs, files in os.walk(file_dir):      #扫描该目录下的文件夹和文件,返回根目录路径,文件夹列表,文件列表
        print(root)
        print(dirs)
        print(files)
        for f in files:
            tmp_dir = '.sougou_after2' + '\' + f  # 加上标签后的文本  
            text_init_dir = file_dir + '\' + f     #原始文本  
            print(text_init_dir)
            print(tmp_dir)
            file_source = open(text_init_dir, 'r', encoding='utf-8') #打开文件,并将字符按照utf-8编码,返回unicode字节流
            print(file_source)
            ok_file = open(tmp_dir, 'a+', encoding='utf-8')  
            start = '<docs>
'  
            end = '</docs>'  
            line_content = file_source.readlines()  #按行读取
            ok_file.write(start)  
            for lines in line_content:  
                text_temp = lines.replace('&', '.')    #替换:replace(old,new,[max]) max最多替换的次数
                text = text_temp.replace('', '')
                ok_file.write(text)  
            ok_file.write('
' + end)  
  
            file_source.close()  
            ok_file.close()
    print('finished!')

def file_read(file_dir):
    #建立url和类别的映射词典,可以参考搜狗实验室的对照.txt,有18类,这里增加了奥运,减少了社会、国内和国际新闻
    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'} 
    path = ".sougou_all\"     
    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 url.hostname in dicurl:  
                    if not os.path.exists(path + dicurl[url.hostname]):  
                        os.makedirs(path + dicurl[url.hostname])  
                    fp_in = open(path + dicurl[url.hostname] + "\%d.txt" % (len(os.listdir(path + dicurl[url.hostname])) + 1),"w")  
                    temp_bytescontent = (claimtext[index].firstChild.data).encode('GBK','ignore')   #这里的ignore是说,如果编码过程中有GBK不认识的字符可以忽略
                    fp_in.write(temp_bytescontent.decode('GBK','ignore'))
    print('finished!')

def test():
    file_fill('.sougou_before2')
    file_read(".sougou_after2")

 #!/usr/bin/python3 的作用

这是脚本语言共同遵守的规则:当第一行为 #!/path/to/script/interpreter时,指定了用来执行本脚本的解释器。注意:

1、必须是文件的第一行

2#!开头的,说明是脚本

3/path/to/script/interpreter是脚本解释器的全路径名。

例如:

#!/bin/sh           shell脚本

#!/usr/bin/perl     perl脚本

#!/usr/bin/python   python脚本

#!/usr/bin/python2  python2脚本

#!/usr/bin/python3  python3脚本

而有时不太清楚脚本解释器的具体全路径名;或者开发环境与运行环境的安装路径不同。为了保证兼容性,也可以写作:

#!/usr/bin/env python3

这样运行时会自动搜索脚本解释器的绝对路径

4.关于字符串以及编码的学习

在这一次的文本解析中,真是体会到了不同编码带来的巨大影响,各种编码和解码错误,所以在这里记录一下学习大神们的笔记的一点点心得。

任何东西要存储在计算机中都要编码,视频,音频,文本,所以有时候,我们在打开一个视频的时候会遇到解码错误,不能播放,就是因为我们要将存储在计算机中的东西解码还原成我们开始存储时它的形式,但是中间出现了解码失败的错误,自然就不能还原播放了。

 Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。UTF-8UTF-16UTF-32都是将数字转换到程序数据的编码方案。这是什么意思呢?每一个字符都对应一个数字,这个数字再转成电脑中要存储的编码格式。

UTF-8 8-bit Unicode Transformation Format)是最流行的一种对 Unicode 进行传播和存储的编码方式。它用不同的 bytes 来表示每一个代码点。ASCII 字符每个只需要用一个 byte,与 ASCII 的编码是一样的。所以说 ASCII UTF-8 的一个子集。

字符——>数字——>电脑中存储的程序数据

Unicode            UTF-8/ UTF-16 /UTF-32

我们看到的上面这个过程就是编码encode,与之相对应的就是解码,decode

Encode:将“文本”转换成“字节流”

Decode:将“字节流”转换成“文本”

python内部使用的是unicode编码,在python3中:

bytes ——> str (Unicode字符数组) ——> bytes

     Decode                   encode

# -*- coding: utf-8 -*-

这就是告知python我这个文件里的文本是用utf-8编码的,这样,python就会依照utf-8的编码形式解读其中的字符,然后转换成unicode编码内部处理使用。在这里,python作为一门语言,它能理解的就是Unicode,就像我们人看英文和中文一样,或者通俗一点说,Python也看不懂字节流,只能看懂Unicode,我们人只能看懂解码出来的视频,看不懂字节流里面演的是什么情节。这都是一个道理。

有时候,在Windows控制台下运行python程序,还是会遇到编码错误。这是由于python编码与控制台编码的不一致造成的。Windows下控制台中的编码使用的是gbk,而在代码中使用的utf-8python按照utf-8编码打印到gbk编码的控制台下自然就会不一致而不能打印出正确的汉字。所以这时候要用GBK编码。

5.捡拾小知识

5.1 怎么判断TXT文件内容的编码类型?

打开记事本  文件>另存为—>看弹出的对话框最下面,有个编码类型。

5.2 Python3.4及以上版本

Import一个模块后,如果调试bug,改动了一些地方,怎么办呢?重新加载:

import importlib

importlib.reload(module)

5.3 open()中的参数

路径+文件名

Moder,w,a,+,b

encoding表示的是返回的数据采用何种编码,一般采用utf8或者gbk

 

参考文章:

http://blog.csdn.net/sgfmby1994/article/details/53436228

http://blog.csdn.net/laoyaotask/article/details/46797717

http://www.cnblogs.com/fnng/p/5008884.html

http://www.crifan.com/unicodeencodeerror_gbk_codec_can_not_encode_character_in_position_illegal_multibyte_sequence/

http://blog.csdn.net/gexiaobaohelloworld/article/details/7963646

http://blog.csdn.net/shenjie12345678/article/details/43228159

http://blog.csdn.net/fym0121/article/details/7578016

还有一些忘记记录网址了,谢谢你们,爱心~

原文地址:https://www.cnblogs.com/wangyuxia/p/6667598.html