3000篇搜狐新闻语料数据预处理器的python实现

1 搜狐新闻语料获取和编码规范


简介:本文训练的新闻语料是从搜狐官网下载的10类3000篇新闻真实语料,具体如下图,其中每类下面是300篇新闻文章。其中:C000007 汽车,C000008 财经,C000010 IT,C000013 健康,C000014 体育,C000016 旅游,C000020 教育,C000022 招聘,C000023 文化,C000024 军事

这个语料开始不能使用,主要是编码问题。如果少量尚可以采用Notepad++进行编码转换,如此的文本量手动就那么费时费力,更不必说更大规模语料了。故而本文采用批量格式转码器进行处理【BatUTF8Conv,读者可以自行下载】。本文的10类3000篇新闻语料共计16.4M,经过编码处理后,读者可以到:【链接: https://pan.baidu.com/s/1jIJrGKu 密码: kksp】下载使用即可

2 开发环境和程序结构介绍


开发环境

本文使用的开发环境是sublime Text +anaconda集成的运行环境,其中(1)如果使用结巴分词,需要下载结巴分词并在本地安装.(2)如果使用hanLp,需要下载jar和hanLP进行安装并配置。

具体配置读者可以参照:【Python开发工具:Anaconda+Sublime】一文进行配置

标记1:经过编码处理后的新闻语料数据

标记2:经过分词等预处理后的熟语料数据

标记3:分别是1892字的中文停用词表、891字的英文停用词表、哈工大的767字的中文停用词表(下载链接: https://pan.baidu.com/s/1c1QFpcs 密码: zsek)

标记4:自定义词典

标记5:中文预处理程序和相关分词工具代码展示

3 单个文件的预处理


3.1 测试单个文件原路径和保存路径及停用词路径

# 测试单个文件
dealpath="../Database/SogouC/FileTest/1.txt"
savepath="../Database/SogouCCut/FileTest/1.txt"
stopwordspath='../Database/stopwords/CH_stopWords.txt'

查看下测试文件如下:

测试处理结果:

3.2 加载自定义结巴词典

sys.path.append("../")
jieba.load_userdict("../Database/userdict.txt") # 加载自定义分词词典

3.3 单文本处理主函数介绍

'''
分词.词性标注以及去停用词
stopwordspath: 停用词路径
dealpath:中文数据预处理文件的路径
savepath:中文数据预处理结果的保存路径
'''
def cutTxtWord(dealpath,savepath,stopwordspath):
    stopwords = {}.fromkeys([ line.rstrip() for line in open(stopwordspath,"r",encoding='utf-8')]) # 停用词表
    with open(dealpath,"r",encoding='utf-8') as f:
        txtlist=f.read() # 读取待处理的文本
    words =pseg.cut(txtlist) # 带词性标注的分词结果
    cutresult=""# 获取去除停用词后的分词结果
    for word, flag in words:
        if word not in stopwords:
            cutresult += word+"/"+flag+" " #去停用词
            getFlag(cutresult,savepath) #

4 批量文件的预处理

语料预处理器的核心:目的是通过用户传输预处理文本文件夹即可,其后面的所有子文件夹自动处理,且将处理结果单独按照原语料结构格式进行归一化保存。这里面涉及几个问题:(1)支持停用词的处理;(2)采用结巴分词,支持自定义词典和词语合并拆分功能;(3)支持词性筛选;(4)支持标准化规约化语料集的形成

随机查看批量预处理中C000024 军事的0.txt文件

处理后的结果:

4.1 批量处理文件路径

if __name__ == '__main__' :
    t1=time.time()
    stopwordspath='../Database/stopwords/CH_stopWords.txt'
    # 批量处理文件夹下的文件
    rfolder_path = '../Database/SogouC/FileNews/'
    # 分词处理后保存根路径
    wfolder_path = '../Database/SogouCCut/'
 
    # 中文语料预处理器
     cutFileWord(rfolder_path,wfolder_path,stopwordspath) # 多文本预处理器
 
    t2=time.time()
    print("中文语料语处理完成,耗时:"+str(t2-t1)+"秒。") #反馈结果

4.2 分词.词性标注以及去停用词

'''
分词.词性标注以及去停用词
stopwordspath: 停用词路径
read_folder_path :中文数据预处理文件的路径
write_folder_path :中文数据预处理结果的保存路径
filescount=300 #设置文件夹下文件最多多少个
'''
 
def cutFileWord(read_folder_path,write_folder_path,stopwordspath):
    # 停用词表
    stopwords = {}.fromkeys([ line.rstrip() for line in open(stopwordspath,"r",encoding='utf-8')])
 
    # 获取待处理根目录下的所有类别
    folder_list = os.listdir(read_folder_path)
    # 类间循环
    for folder in folder_list:
        #某类下的路径
        new_folder_path = os.path.join(read_folder_path, folder)
 
        # 创建保存文件目录
        path=write_folder_path+folder #保存文件的子文件
        isExists=os.path.exists(path)
        if not isExists:
            os.makedirs(path)
            print(path+' 创建成功')
        else: pass
        save_folder_path = os.path.join(write_folder_path, folder)#某类下的保存路径
        print('--> 请稍等,正在处理中...')
 
        # 类内循环
        files = os.listdir(new_folder_path)
        j = 1
        for file in files:
            if j > len(files): break
            dealpath = os.path.join(new_folder_path, file) #处理单个文件的路径
            with open(dealpath,"r",encoding='utf-8') as f:
                txtlist=f.read()
                # python 过滤中文、英文标点特殊符号
                # txtlist1 = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "",txtlist)
            words =pseg.cut(txtlist) # 带词性标注的分词结果
            cutresult="" # 单个文本:分词后经停用词处理后的结果
            for word, flag in words:
                if word not in stopwords:
                    cutresult += word+"/"+flag+" " #去停用词
            savepath = os.path.join(save_folder_path,file)
            getFlag(cutresult,savepath)
            j += 1

其中:

1) # 停用词表: stopwords = {}.fromkeys([ line.rstrip() for line in open(stopwordspath,"r",encoding='utf-8')])

此格式将文本列表进行字典化处理,具体查看fromkeys()方法的使用

2)# 获取根目录下的子文件夹集合: folder_list = os.listdir(read_folder_path)

3)#某类(子文件夹)下的所有文件:new_folder_path = os.path.join(read_folder_path, folder)

4)#创建文件:

# 创建保存文件目录
        path=write_folder_path+folder #保存文件的子文件
        isExists=os.path.exists(path)
        if not isExists:
            os.makedirs(path)
            print(path+' 创建成功')
        else: pass

5) # python 过滤中文、英文标点特殊符号: txtlist1 = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "",txtlist)

6)过滤停用词:

for word, flag in words:
     if word not in stopwords:
           cutresult += word+"/"+flag+" " #去停用词

4.3 词性筛选

'''
做词性筛选
cutresult:str类型,初切分的结果
savepath: 保存文件路径
'''
def getFlag(cutresult,savepath):
    txtlist=[] #过滤掉的词性后的结果
    #词列表为自己定义要过滤掉的词性
    cixing=["/x","/zg","/uj","/ul","/e","/d","/uz","/y"]
    for line in cutresult.split('\n'):
        line_list2=re.split('[ ]', line)
        line_list2.append("\n") # 保持原段落格式存在
        line_list=line_list2[:]
        for segs in line_list2:
            for K in cixing:
                if K in segs:
                    line_list.remove(segs)
                    break
                else:
                    pass
        txtlist.extend(line_list)
 
    # 去除词性标签
    resultlist=txtlist[:]
    flagresult=""
    for v in txtlist:
        if "/" in v:
            slope=v.index("/")
            letter=v[0:slope]+" "
            flagresult+= letter
        else:
            flagresult+= v
    standdata(flagresult,savepath)

其中:词性问题参加结巴分词官网文档

4.4 标准化处理

'''
标准化处理,去除空行,空白字符等。
flagresult:筛选过的结果
'''
def standdata(flagresult,savepath):
    f2=open(savepath,"w",encoding='utf-8')
    for line in flagresult.split('\n'):
        if len(line)>=2:
            line_clean="/ ".join(line.split())
            lines=line_clean+" "+"\n"
            f2.write(lines)
        else: pass
    f2.close()

5 python调用java实现的HanLP工具


1 安装jar包,并通过查看其是否安装配置成功。(此处环境变量配置省略)

java命令

javac命令

2 在c盘下创建hanlp文件下,并将下面的hanlp.jar包下载复制到hanlp文件夹下:

链接: https://pan.baidu.com/s/1qYmB0XQ 密码: hz9v

3) 启动java虚拟机

startJVM(getDefaultJVMPath(), "-Djava.class.path=C:\hanlp\hanlp-1.3.2.jar;C:\hanlp", "-Xms1g", "-Xmx1g") # 启动JVM,Linux需替换分号;为冒号:

4)具体代码和执行结果如下:

+ View Code

执行结果:

原文发布于微信公众号 - 机器学习和自然语言处理(datathinks)

原文发表时间:2017-09-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Albert陈凯

理解zookeeper选举机制

zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点...

7765
来自专栏涂小刚的专栏

从 PageRank Example 谈 Spark 应用程序调优

在做PageRank测试时,发现有很多有趣的调优点,想到这些调优点可能对用户来说是普遍有效的,现把它整理出来一一分析,以供大家参考。

1.3K3
来自专栏hanlp学习笔记

汉语言处理包Hanlp的使用

本来想通过python调用Java实现Hanlp的使用,参考文章:http://t.cn/RUrIF7z

1432
来自专栏Gaussic

【译文】MapReduce:大型集群上的简化数据处理

MapReduce是一个编程模型,以及处理和生成大型数据集的一个相关实现,它适合各种各样的现实任务。用户指定计算的map和reduce函数。底层运行系统自动地...

1221
来自专栏漏斗社区

黑客游戏| Owasp juice shop (一)

0x01 前言 最近看到一篇关于owasp juice shop的文章,觉的很有意思,斗哥就自己撸了个环境,上手后深深觉的这是一个很棒的漏洞靶场,所以就把该...

5058
来自专栏hanlp学习笔记

汉语言处理包Hanlp的使用

本来想通过python调用Java实现Hanlp的使用,参考文章:http://t.cn/RUrIF7z

520
来自专栏窗户

如何设计一个电子计算器

  首先,不要误解,我这里的计算器是指硬件的计算器,至于纯软件的计算程序,乃至有高级功能的,比如可以求解方程甚至可编程之类,我以后找个时间来说说。这两天看到有人...

2366
来自专栏塔奇克马敲代码

Windows平台下源码分析工具

2233
来自专栏杨建荣的学习笔记

system表空间不足的问题分析(r6笔记第66天)

很多事情见多了也就有了麻木的感觉,报警短信就是如此,每天总能收到不少的报警短信,可能很多时候就扫一眼,如果没有严重的问题自己是不会情愿打开电脑处理的。 对于此,...

2794
来自专栏鸿的学习笔记

两种主要列存储方式的区别

Bigtable,HBase,Hypertable和Cassandra都被称为列存储,因为它们能够单独存储和访问列族。 这使它们看起来与列存储(如Sybase ...

1101

扫码关注云+社区

领取腾讯云代金券