本文主要是介绍基于word2vec和TextCNN的新闻标题分类器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、背景
本人做新闻爬虫工作,由于工作需要,经常需要将一个列表页中的a标签链接进行提前并进行抓取,但问题是,如何确定一个列表页大概率是新闻页面那?
起初,通过一些规则的方法,比如新闻高频词来确定是否是新闻列表页,但由于热词更新的滞后以及无热词页面,规则匹配的效果变得很差,故放弃了该方案。后期,通过总结新闻标题的模式发现,
新闻和非新闻的标题内容在用词以及语义上存在明显的区别,如果规则解决不了的问题,也许可以借助NLP来解这个问题。经过调研,发现有很多通过NLP来实现对评论进行情感分类的项目,
都是二分类的问题,自己目前面临的问题也是二分类,这坚定了我趟这条路的信心。
二、技术路线
由于面临的问题是一个文本二分类问题,所以有两个问题需要解决:
- 如何将标题向量化,以喂给模型训练。
- 选择什么模型来训练数据。
通过调研,问题1可通过Word2vec将词的语义嵌入到一个低维向量中。问题2解决方法很多,由于时下正是深度学习大红大紫之时,因此选择了TextCNN,它是一种卷积神经网络,在文本分类领域表现非常抢眼。
三、Word2vec
Word2vec是非常流行的词嵌入(将一个词表示成一个向量)方法之一而Word2vec是其中的佼佼者,其主要优点是:
- 可以将文本在低维空间中进行稠密表示,克服了one-shot的表示稀疏性。
- 可以很好的表达词与词之间的语义相似性,如 “国王” 和 "女王",“男人” 和 “女人”,但是one-shot表示是体现不出这种相似性的。
Word2vec的流行实现有Skip和CBOW,在此不做详述,感兴趣的可以参考 秒懂词向量Word2vec 。
词向量的问题解决之后,便可以将不同词的词向量表示成二维矩阵输入给TextCNN进行训练。
四、TextCNN
TextCNN是一个基于卷积神经网络的文本分类模型,在众多应用领域表现非常出色,原始论文是Convolutional Neural Networks for Sentence Classification。本文的工作均参考了
How to Develop a Multichannel CNN Model for Text Classification 文中的实现。同图像分类一样,TextCNN的输入也是一个 的二维矩阵,然后通过卷积层和池化层进行特征提取,
最后展平卷积部分的输出到一个全连接层,最后输出层给出分类结果。其中, 表示词汇表的大小, 表示词嵌入的维度,表示我们希望将一个词嵌入到一个多少维的向量空间中。
TextCNN的基本思想是实现了一个多通道的卷积神经网络,并通过融合不同通道的信息进行文本分类。
具体的,通过设定多组尺寸不同的卷积核,每组卷积核对应不同大小的滑动窗口。比如,可以分别设定核尺寸大小为1、2、4的三组卷积核,每组的数量自行设定,这样,
每组卷积核可在不同大小的滑动窗口中提取语义特征,最后融合不同组的卷积核所提取的特征(通过concatenate实现),并将融合后的特征向量送入全连接层层,输出层最后给出最终的分类,
大体的思想是这样,细节方面可以参考原始论文。下图很好的阐述了其基本实现过程。
五、 训练词向量
由于本人是做爬虫工作,训练数据收集可谓是近水楼台先得月。收集了新闻标题(正样本)5834363例,非新闻标题(负样本)5108778。
为了训练词向量,将正负样本中的每个标题通过jieba进行了分词,并去掉了停用词。同时将所有的词用空格分隔,同时,为了在滑窗过程中,不同标题之间的数据产生关联,
在不同标题的分词结果之间插入了6个UNK标识,因为本人选择的窗口大小是3,所以6个UNK标识刚好了隔离不同标题的分词结果。如下图所示。
如图,“获刑” 和 “黑白” 属于不同标题的首尾词,因为UNK标识,在训练过程中不会因为大小为3的滑窗而组成训练样本,不会干扰最终的训练结果。word2vec的内部实现好像并没有提及这样的处理细节。
但个人认为这么做是有必要的,不然会将不同标题的首部和尾部的词进行关联,而这些词本身可能并无关联。
这里选择了开源的gensim来
这篇关于基于word2vec和TextCNN的新闻标题分类器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!