专栏首页AI小白入门【NLP实战】文本分类之 TextCNN

【NLP实战】文本分类之 TextCNN

上面一篇文章中,我介绍了一篇利用RNN via Attention解决有毒评论文本分类问题。然而,在工业生产中,RNN、LSTM、GRU等循环神经网络不能并行计算,尽管研究者提出了一些其他的模型,如SRU等。CNN尽管效果在某些时候会稍逊RNN以及RNN的变体,但是CNN在速度方面却有着无可比拟的效果,且由于它的可并行性广被工业界喜爱。

在本文中,我将借助有毒评论分类比赛数据https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge, 介绍TextCNN算法,帮助有需要的朋友入门深度自然语言处理。

关于TextCNN算法,有两篇不错的paper可供参考:

(1) Convolutional Neural Networks for Sentence Classification

(2) A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification

TextCNN简介

CNN,做过图像的朋友们都知道,比如图像分类、目标检测、分割等,很多都是利用CNN提取图像的深层次图像表征,并且取得了state-of-the-art performance,在图像领域大放异彩。那么在文本领域是否也可以提取文本的特征呢。2014年Yoon Kim这位大佬揭晓了答案,完全可以,而且也可以取得不错的效果。在文本中,并不是所有的文本都是全部依赖,正如我们在之前一篇文章中利用TFIDF+LR来解决这个问题一样,我们利用ngram信息,捕捉文本的局部相关性特征。CNN的原理也是如此,我们可以通过卷积核,来补捉文本的局部相关性特征。同时,我们也可以使用多个不同的卷积核,来捕捉多个ngram信息。

TextCNN原理

下面我以一张经典的图来简单介绍了以下TextCNN模型。在2014年提出,Yoon Kim使用了卷积 + 最大池化这两个在图像领域非常成功的好基友组合。我们先看一下他的结构。如下图所示,示意图中第一层输入为7*5的词向量矩阵,其中词向量维度为5,句子长度为7,然后第二层使用了3组宽度分别为2、3、4的卷积核,图中每种宽度的卷积核使用了两个。其中每个卷积核在整个句子长度上滑动,得到n个激活值,图中卷积核滑动的过程中没有使用padding,因此宽度为4的卷积核在长度为7的句子上滑动得到4个特征值。然后出场的就是卷积的好基友全局池化了,每一个卷积核输出的特征值列向量通过在整个句子长度上取最大值得到了6个特征值组成的feature map来供后级分类器作为分类的依据。

TextCNN实现

上面简单介绍了下TextCNN的结构,我们来利用TextCNN来解决我们的有毒评论问题吧。有毒评论问题我们在上几篇文章中已经分析了文本的一些特征,这里我就不下详细描述了,大家有兴趣的化,可以看我之前的几篇文章。本文的主要动机是为了解决RNN的不可并行性,利用CNN的高速并行性。因此,在performance上可以会有些差。话不多说,下面就是我们TextCNN的架构,采用keras简单实现了下,和原始论文的模型有些不一样。

def TextCNN(maxlen):
    inp = Input(shape=(maxlen,))
    x = Embedding(max_features, embed_size, weights=[embedding_matrix])(inp)

    conv1 = Conv1D(filters=64, kernel_size=1, padding=same)(x)
    conv1 = MaxPool1D(pool_size=32)(conv1)


    conv2 = Conv1D(filters=64, kernel_size=2, padding=same)(x)
    conv2 = MaxPool1D(pool_size=32)(conv2)

    conv3 = Conv1D(filters=64, kernel_size=3, padding=same)(x)
    conv3 = MaxPool1D(pool_size=32)(conv3)

    conv4 = Conv1D(filters=64, kernel_size=4, padding=same)(x)
    conv4 = MaxPool1D(pool_size=32)(conv4)

    cnn = concatenate([conv1, conv2, conv3, conv4], axis=-1)
    flat = Flatten()(cnn)

    x = Dense(50, activation=relu)(flat)
    x = Dropout(0.1)(x)
    x = Dense(6, activation=sigmoid)(x)
    model = Model(inputs=inp, outputs=x)
    model.compile(loss=binary_crossentropy, optimizer=adam, metrics=[accuracy])
    model.summary()
    return model
model=TextCNN(maxlen)
model.fit(X_t, y, batch_size=32, epochs=2, validation_split=0.1)
submission = pd.DataFrame.from_dict({id: test[id]})
y_test = model.predict([X_te], batch_size=1024, verbose=1)
submission[list_classes] = pd.DataFrame(y_test)

上面就是一个非常粗糙的TextCNN模型,我提交了下,效果有点不太理想。如果想要提升下模型效果,可以考虑增加多层卷积,或者残差卷积等等。这仅仅作为入门的一个baseline。

如果你想要运行完整代码可以参考我的github: https://github.com/hecongqing/TextClassification

本文分享自微信公众号 - AI小白入门(StudyForAI),作者:何从庆

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【NLP实战】手把手带你RCNN文本分类

    之前介绍的都是属于深度神经网络框架的,那么在Deep Learning出现或者风靡之前,文本分类是怎么做的呢?

    yuquanle
  • 【机器学习】模型聚类

    本文介绍了混合高斯聚类算法。首先介绍了混合高斯的类表示是一个高斯模型,相似性度量定义为服从类参数为高斯分布,其是一种典型的基于模型的密度聚类算法。然后介绍了混合...

    yuquanle
  • 【NLP】如何匹配两段文本的语义?

    一年前在知乎上关注过这么一个问题: 如何判断两段文本说的是「同一件事情」?- 知乎 https://www.zhihu.com/question/5675107...

    yuquanle
  • Python开发 常见异常和解决办法

    SQLAlchemy是Python编程语言下的一款开源软件,提供了SQL工具包及对象关系映射(ORM)工具,使得在Python中操作MySQL更加简单。在给两个...

    cutercorley
  • 【Java】基础11:什么叫方法 ?

    在程序里,将一个功能抽取出来,把代码单独定义在一个大括号里面,形成单独的功能,就叫方法。

    刘小爱
  • IM开源示例——Seatalk

    用户1907613
  • [Java 基础]方法

    方法的定义 Java方法是语句的集合,它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 ...

    静默虚空
  • 【Rust日报】2019-09-11:Cloud Hypervisor - Intel 旗下的虚拟机监视器

    Read More: https://www.techrepublic.com/article/the-rising-programming-languages...

    MikeLoveRust
  • 阿里UC合并,不看资本看业务

    UC终于还是下嫁了,UC和阿里十分默契地采取了“合并”一词。人们第一反应是,这是阿里要为IPO讲故事,要提高故事,增加筹码——这是废话。除却在资本层面的影响,我...

    罗超频道
  • [喵咪BELK实战(3)] logstash+filebeat搭建

    [喵咪BELK实战(3)] logstash+filebeat搭建 ? 前言 在上节我们已经把elasticsearch+kibana已经搭建起来了,可以正常的...

    喵了个咪233

扫码关注云+社区

领取腾讯云代金券