其他分享
首页 > 其他分享> > Tensorflow的TextCNN在搜狗新闻数据的文本分类

Tensorflow的TextCNN在搜狗新闻数据的文本分类

作者:互联网

开发环境:

数据集准备和处理:

  本文用到的数据集来自搜狗实验室提供的新闻数据,涵盖了国内,国际,体育,社会,娱乐等 18 个频道的新闻数据,不过数据集的质量不是特别高,存在大量的分类不清晰、文不对题数据。限于单机的性能我只下载了精简版的一个月数据,大约 347M。用Notepad打开可以看到文本的样式如下:

是xml格式,基于中文的GB2313编码,每一个<doc></doc>之间是一篇单独的新闻,包含 URL、文档编号、标题和正文,其中新闻的分类类别在 URL 的子域名中,如 sports 代表体育,house 代表房产等等,所以本文只需要拿到 URL 和 content 之间的内容就行,接下来就要进行对数据的清理,提取出我们需要的数据(URL中的categories和content)。

  下载下来的原始数据分为 128 个 TXT 文件,每个文件中包含有不同类别的新闻数据,我要做的是遍历每个文件,然后把相同类别的新闻提取出来并写入新的文件中。读取中文 txt 文档乱码是个比较麻烦的问题,要弄清其编码的格式才能保证读出来的不是乱码,否则没法对数据进行后续分类操作(但即便这样,我读出来还是有很多乱码,看来python对中文编码的支持还是存在一些问题),这里用到了一个叫做chatdet的python库,通过这个库可以查看我们文档的编码格式是什么样的,先可以写一个测试代码测试该txt数据的编码格式,代码如下:

import os
import chardet

cur_dir = os.getcwd()
list_dirs = os.listdir('data')
for file in  list_dirs:
    file_path = os.path.join('data',file)
    f = open(file_path, 'rb')
    f_read = f.read()
    f_charInfo = chardet.detect(f_read)
    print(f_charInfo)

 

  可以看出,该库对文本的编码预测是GB2312(当置信度大于90%时我觉得是可信的)。知道了编码后,我们就可以提出 URL 和 content,需要用正则表达式把子域名拿出来,最后得到 15 个按类别分好的文件,除去一些乱码较多的文件,最终留下了 11 个类别,留下的类别如下:

数据处理代码:

#!/user/bin/python
# -*- coding: utf-8 -*-

import os
import re

def _read_file(txt_file):
    # 读取txt文件
    return open(txt_file,"rb").read().decode("GB2312","ignore")

def extract_class_content(doc):
    # 提取分类和内容    url = doc.split('<url>')[1].split('</url>')[0]
    content = doc.split('<content>')[1].split('</content>')[0]
    category = re.findall(r"http://(.*?).sohu.com/",url)
    return category[0],content

def file_writer(category,content):
    dir_name = 'category_datas'
    # os.path.join(path, name) 连接目录和文件名
    path = os.path.join(dir_name,category)
    f = open(path,'a',encoding='utf-8')
    f.write(category + '\t' + content + '\n')
    f.close()


def category_data(txt_file):
    # 将每个文件中不同类别的新闻分别存储
    f = _read_file(txt_file)
    docs_xmls = f.split('<doc>\n')
    for doc in docs_xmls:
        if doc:
            category,content = extract_class_content(doc)
            file_writer(category,content)

if __name__ == '__main__':
    # os.listdir() 指定所有目录下所有的文件和目录名
    for file in os.listdir('data'):
        file_path = os.path.join('data',file)
        category_data(file_path)

  然后,看看各个类别下数据量的分布,发现体育、商业、新闻的数量较多,文化类的比较少,数据分布不太平衡,但这并不影响,因为我们并不会用到全部的数据,而是从每个类别中抽取一部分来训练模型。

参考文章:

1.解决python读取txt文件乱码问题

 

标签:category,搜狗,TextCNN,content,file,path,Tensorflow,txt,os
来源: https://www.cnblogs.com/yunkaiL/p/10496635.html