文本分类是什么
文本分类就是为文本分配一组预定义类别的过程,即根据文本内容将文本归为不同的类别,是自然语言处理(NLP)中的一项基本任务,具有广泛的应用,例如情感分析,垃圾邮件检测和新闻分类等。通常是用有监督学习的方法来做,其大致的过程如下图:
文本的特征提取以及文本的标注质量和数量都是影响文本分类效果的因素,文本的长短不同可能会导致文本可抽取的特征上的略微差异,而在数据标注的质量和数量合适的前提下,特征选的好,分类效果也会大幅提高。特征工程决定效果的下限,数据的好坏决定效果的上限。
做文本分类的方法有很多,卷积神经网络(CNN),长短期记忆(LSTM),多层感知机(MLP),朴素贝叶斯(Naive Bayes),支持向量机(SVM)等等。本文就LSTM方法来做一个新闻分类的小实验。
LSTM是什么
LSTM是一种特殊的循环神经网络(RNN)。所以说LSTM也要稍微说下RNN,RNN的结构图如下:
在上图就是循环神经网络,给网络A输入一个 Xt 然后得到输出值ht,并将当前的网络信息传递到下一状态 。下图可以更好展示这个信息传递的结构。
上图左边展开就是右边的部分。下图是循环模块的内部细节:
LSTM和RNN有同样的链式结构,只不过对循环模块做了修改,从一个单一的网络层变成了四个,以某种的方式连接:
LSTM中的各个部分的作用如下:
细胞状态(cell state),就是下图这条横穿的水平线。在传递过程中只进行简单的线性修改,然后传递给下一个状态。
这里要引入一个LSTM中的结构:门(gate),是一种选择性地让信息通过的结构,如下图,其输出是一个0-1之间的数,表示让信息通过的多少。LSTM对细胞状态的线性修改通过门来操作。
遗忘门(forget gate),如下图,我们首先要考虑丢掉一些东西,其输入是当前的输入xt和上一个状态ht-1,输出结果在0和1之间(sigmoid函数),并与上一状态Ct-1传来的信息相乘决定信息通过的多少,0表示完全丢掉,1表示全部接收。
下图结构的作用是要从输入的数据里面得到些信息,并保存到细胞状态中。这一步由两部分组成,两部分的输入和遗忘门的一样,。第一部分是输入门(input gate),使用sigmoid函数激活,第二部分使用tanh函数激活,两部分的结果相乘在下一步添加到细胞状态中。
然后是细胞状态的更新,就是用遗忘门和输入门的输出对Ct-1做简单的线性变换。如下图:
最后是输出门(output gate),决定当前状态的输出ht。
而用LSTM做文本分类其实就是在最后一个状态输出一个各个类别的概率分布,最大值就是该文本的分类。例如三分类的最后输出是[0.2, 0.6, 0.2],那么第二类就是该分类结果。
具体实验细节
01数据集
页面URL
页面ID
页面标题
页面内容
03数据处理
将原始数据的GBK编码转为UTF-8编码。
数据没直接给出分类信息,而是隐含在页面url中,如下图中的gongyi就表示"公益"类,所以需要根据url中的信息给数据打标签。
最后统计出来一共是15类但是这15类的数据量也不是均匀的。数据分布是这样的。分类8和分类11没有文章。
可以看到,有4个类别的数据量不是特别多(3000以下)有两个为空,这里为了使得数据量不至于太少同时又分布均匀,以3000为界,数据量少于3000的类别丢掉,多于3000的只取3000条。最后得到了9个类别。
04文章拼接和截取
将新闻标题和正文拼接在一起,同时利用标题和正文的内容,因为标题中通常包含重要信息,所以要利用上。然后对文章进行截取是为了使文本在字数上大致相同,对分类效果可能会有提升。
05根据url给文本打标签
略。
06分词
由于文本是由一个一个的词组成的,处理文本首先要考虑从词入手,而中文文本和英文文本不同,英文文本的词本来就是用空格隔开的,处理起来相对简单,所以要把中文文本切割成一个一个的词(或字),分词的效果会对后续任务影响很大。
一些专业性非常强,专业名词非常多的行业,如法律行业,可能需要根据自身需求去训练分词器,或者在已有的分词器中加入自定义的词典,以满足任务需求。下一步就是去掉停用词,这些词与其他词相比,没有实际的含义,如英文中的 the、at、a 等等,中文中有 的、是、了 等等。这样,预处理阶段就完成了。
实验使用jieba结巴分词,过滤掉停用词和标点。
07词向量
使用词向量其实就是将文本用数学语言的形式表示,使得文本能参与模型的数学运算。实验中使用的词向量是word2vec。
08部分代码
model=Sequential()
model.add(embedding)
model.add(LSTM(units=200,dropout=0.2,recurrent_dropout=0.2))
model.add(Dropout(rate=0.2))
model.add(Dense(units=labels.shape[1], activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(x=x_train,
y=y_train,
validation_data=(x_val, y_val),
epochs=Epochs,
batch_size=BatchSize)
model.save('lstm.h5')
print(model.evaluate(x=x_test, y=y_test, batch_size=BatchSize))
09实验结果
训练了3个epoch就开始收敛了,当然可能多训练几个epoch效果会有提升,最终测试的正确率是0.882。
法律相关新闻的分类
法律相关新闻分类其实和上述实验方法相似。首先要有质量较好的数量较多的已标注数据作为训练数据(有监督方法)。之后对数据进行预处理,将需要的部分提取出来,对语料分词,过滤停用词等。之后使用词向量表示文本,词向量部分可以使用别人预训练好的,也可以自行训练,或者根据任务对已有词向量进行fine-tune。最后就是选择一个合适的分类模型(算法)给文本分类。
作者:中科院深圳先进院-得理法律人工智能联合实验室Wenorm