雷锋网按:本文作者张庆恒,原文载于作者个人博客,雷锋网(公众号:雷锋网)已获授权。
由于需要学习语音识别,期间接触了深度学习的算法。利用空闲时间,想用神经网络做一个文本分类的应用, 目的是从头到尾完成一次机器学习的应用,学习模型的优化方法,同时学会使用主流的深度学习框架(这里选择tensorflow)。
文章分为两部分,本文仅实现流程,用简单的softmax回归对文本进行分类,后面一篇文章再从流程的各个方面对模型进行优化,达到比较好的效果。
收集数据
该部分不是这里的重点,数据从各大新闻网站爬取新闻文本,分十类保存到本地,包括科技、生活、体育、娱乐等。文本分别保存到training_set和testing_set目录下,如:$ tree -L 1 training_set/
training_set/
├── 10_hel
├── 1_ent
├── 2_fin
├── 3_spo
├── 4_tec
├── 5_mil
├── 6_soc
├── 7_lif
├── 8_cul
└── 9_car
文本以text_id.txt的格式保存在不同类的目录下(如text_1234.txt)。本例保存了共113673个训练文本和等数量的测试文本(暂时按1:1的比例)。
预处理文本
step0
为方便后面处理,预处理文本首先要分别针对训练文本和测试文本生成唯一的文本ID, 这里用{class_id}{text_type}{text_id}.txt来标示唯一文本,class_id为类的id,这里为1-10;text_type为数据类型包括train和test;text_id为类文件夹下的文本id,实现函数:def get_unique_id(self, data_dir):
"""
get flie unique id famate as {class_id}_type_{text_id}.txt.
data_dir is the full path of file
e.g ./training_set/4_tec/4_tec_text/text_2001.txt
where "training" is type, "4" is file class, and "2001" is text id.
modify this function to adapt your data dir fomate
"""
dir_list = data_dir.split("/")
class_id = dir_list[2].split("_")[0]
text_id = dir_list[4].split(".")[0]
type_id = dir_list[1].split("_")[0]
return class_id + "_" + type_id + "_" + text_id
step1: 分词
通俗来讲,文本分类的主要思想,是构建各类文本的汉语词典,通过对文本进行分析,观察文本中哪类词汇比较多,由此判断文本所属类