搜狗新闻原始数据处理

时间:2021-08-21 10:51:11

简介:

下载的是搜狗新闻一个月版本的SogouCS.reduced,大约698M,包含128个txt文件

主要处理包括:转码,提取content和URL

处理之前:

每个文件中每条内容如下xml格式:

<doc>
<url>http://sports.sohu.com/20080627/n257795172_4.shtml</url>
<docno>215799a267c29427-71013306c0bb3300</docno>
<contenttitle>组图:蕊蕊拦网薛明暴扣 陈忠和发布会笑逐颜开</contenttitle>
<content>跳转至:R常担26N依此盗骄潺1本┦奔洌对拢玻啡眨2008年世界女排大奖赛第二周比赛继续进行,在中国香港站的一场焦点大战中,中国女排苦战五局,以3-2(25-18、25-27、21-25、25-21、15-13)击败了不久前在瑞士女排精英赛3-1战胜过自己的古巴女排,赢得中国香港站开门红。图为比赛精彩画面。#ㄔ鹑伪嗉:王燕芳)>彩图片</content>
</doc>

处理之后:

搜狗新闻原始数据处理

共:15类别。数据分布不均匀,猜测和各类新闻热度有关。

后续分析:

待补充

代码如下:

(1)包括转码和提取数据

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

'''
该脚本用于将搜狗语料库新闻语料
转化为按照URL作为类别名、
content作为内容的txt文件存储
'''
import os
import re
    
'''字符数小于这个数目的content将不被保存'''
threh = 30

'''获取原始语料文件夹下文件列表'''
def listdir_get(path, list_name):
    """
    :desc: get data of raw data
    :input: data of dir, list of slice data path
    """
    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            listdir_get(file_path, list_name)
        else:
            list_name.append(file_path)


'''
#修改文件编码为utf-8
from chardet import detect
def code_transfer(list_name):
    for fn in list_name: 
        with open(fn, 'rb+') as fp:
            content = fp.read()
            codeType = detect(content)['encoding']
            content = content.decode(codeType, "ignore").encode("utf8")
            fp.seek(0)
            fp.write(content)
            print(fn, ":已修改为utf8编码")
'''
def processing(list_name):
    
    '''对每个语料'''
    for path in list_name:
        print(path+'---start---')
        file = open(path, 'rb').read().decode("utf8")

        '''
        正则匹配出url和content
        '''
        patternURL = re.compile(r'<url>(.*?)</url>', re.S)
        patternCtt = re.compile(r'<content>(.*?)</content>', re.S)

        classes = patternURL.findall(file)
        contents = patternCtt.findall(file)

        '''将内容小于30的去除'''
        for i in reversed(range(contents.__len__())): 
            #如果是reversed (len(range(5))),这种索引是按从大到小的顺序排列,
            #列表不要随便删除,python会自动增补,导致索引变少
            if len(contents[i]) < threh:
                contents.pop(i)
                classes.pop(i) 

        '''进一步取出URL作为样本标签'''
        for i in range(classes.__len__()):
            patterClass = re.compile(r'http://(.*?).sohu.com/', re.S)
            classi = patterClass.findall(classes[i])
            classes[i] = classi[0]
            
        '''按照URL作为类别存储到处理后文件夹'''
        for i in range(len(classes)):
            file = data_original_path + '\\processed\\' + classes[i] + '.txt'
            with open(file, 'a+', encoding='utf-8')as f:
                f.write(contents[i]+'\n')
        print(path+'---success---')
   
if __name__=='__main__':
    print("----tast start----")
    #原始语料路径
    data_original_path = "D:\\software_study\\nlp_data\\SogouCS.reduced\\"
    #data_original_path = './SogouCS.reduced/'

    #获取文件路径
    list_name = []
    listdir_get(data_original_path,list_name)
    
    #修改编码
    #code_transfer(listname)
    processing(list_name)
    
    print('----task success----')

 (2)主要是转码,本人在实际中分开进行的

#-*- coding:utf-8 -*-
import os
from chardet import detect

data_original_path = "D:\\software_study\\nlp_data\\SogouCS.reduced"

'''生成原始语料文件夹下文件列表'''
def listdir(path, list_name):
    """
    :desc: get data of raw data
    :input: data of dir, list of slice data path
    """
    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            listdir(file_path, list_name)
        else:
            list_name.append(file_path)

'''获取所有语料'''
list_name = []

listdir('D:\\software_study\\nlp_data\\SogouCS.reduced\\',list_name)
print(list_name)
for fn in list_name:
    with open(fn, 'rb+') as fp:
        content = fp.read()
        codeType = detect(content)['encoding']
        content = content.decode(codeType, "ignore").encode("utf8")
        fp.seek(0)
        fp.write(content)
        print(fn, ":已修改为utf8编码")