Tensorflow的TextCNN在搜狗新闻数据的文本分类
作者:互联网
开发环境:
- python环境:python3
- 编译器:pycharm
- 文本编辑器:Notepad++
- 开发框架:Tensorflow
- 系统环境:Windows10
数据集准备和处理:
本文用到的数据集来自搜狗实验室提供的新闻数据,涵盖了国内,国际,体育,社会,娱乐等 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)
然后,看看各个类别下数据量的分布,发现体育、商业、新闻的数量较多,文化类的比较少,数据分布不太平衡,但这并不影响,因为我们并不会用到全部的数据,而是从每个类别中抽取一部分来训练模型。
参考文章:
标签:category,搜狗,TextCNN,content,file,path,Tensorflow,txt,os 来源: https://www.cnblogs.com/yunkaiL/p/10496635.html