NLP基础实验②:TextCNN实现THUCNews新闻文本分类

本文深入解析TextCNN模型,从CNN特性出发,介绍其在文本分类任务中的应用,包括输入层、卷积层、池化层及全连接层的工作原理。并通过THUCNews数据集示例,展示TextCNN在新闻文本分类中的高效表现。

一、TextCNN

CNN本质特性和作用

  1. 稀疏交互:输出神经元仅与前一层局部区域的神经元存在连接权重,学习到局部特征结构。作用:参数量减少,时间复杂度小。边缘特征(底层)—》五官特征—》人脸特征(上层)
  2. 参数共享:同一模型的不同模块使用相同的参数。卷积层具有平移不变性。作用:训练较快

 

preview

(1)输入层:N* K 二维矩阵,单词总数 N * 每个词对应的表示向量维度 K,可以是预训练的词嵌入(训练过程不变),也可以是当前网络训练的词向量(训练过程改变)

  • 数据预处理:一句话【wait for the video and don't rent it】。首先将一句话分词为9个词语,分别为【wait, for, the, video, and, do, n't rent, it】,接着将词语转换为数字,代表该词在词典中的词索引。
  • 嵌入层: 通过word2vec或者GLOV 等embedding 方式将每个词成映射到一个低维空间中,本质上是特征提取器,在指定维度中编码语义特征。例如用长度为6的一维向量来表示每个词语(即词向量的维度为6),wait可以表示为[1,0,0,0,0,0,0],以此类推,这句话就可以用9*6的二维矩阵表示。

(2)卷积层:一维卷积。卷积核的宽度和词向量的维度一致,高度可以自行设置。

以将卷积核的大小设置为[2,3]为例,设置了2个卷积核,得到两个向量,得到的向量大小分别为T1:8*1和T2:7*1,向量大小计算过程分别为(9-2+1)=8,(9-3+1)=7

  • 一维卷积(词的长度-卷积核大小+1)。
  • 二维卷积[(N - F + 2pad)/stride]+1, 其中N是输入的height和width。

(3)池化层:效果是将不同长度的句子通过池化,得到一个定长的向量表示

通过不同高度的卷积核卷积之后,输出的向量维度不同,采用1-Max-pooling(还有k-Max池化,平均池化)将每个特征向量池化成一个值,即抽取每个特征向量的最大值表示该特征。池化完成后还需要将每个值拼接起来,得到池化层最终的特征向量为2*1。

(4)全连接层,并使用softmax输出每个类别的概率

与CNN模型一样,先对输出池化层输出进行平坦化,再输入全连接层。为了防止过拟合,在输出层之前加上dropout防止过拟合,输出结果就为预测的文本种类。

# 情感分析, 0消极 or 1积极
import tensorflow as tf
import numpy as np

tf.reset_default_graph()

# Text-CNN Parameter
embedding_size = 2 # n-gram
sequence_length = 3
num_classes = 2 # 0 or 1
filter_sizes = [2,2,2] # n-gram window
num_filters = 3

# 3 words sentences (=sequence_length is 3)
sentences = ["i love you","he loves me", "she likes baseball", "i hate you","sorry for that", "this is awful"]
labels = [1,1,1,0,0,0] # 1 is good, 0 is not good.

word_list = " ".join(sentences).split()
word_list = list(set(word_list))
word_dict = {w: i for i, w in enumerate(word_list)}  # word2id
vocab_size = len(word_dict)

inputs = []
for sen in sentences:
    inputs.append(np.asarray([word_dict[n] for n in sen.split()]))

outputs = []
for out in labels:
    outputs.append(np.eye(num_classes)[out]) # ONE-HOT : To using Tensor Softmax Loss function

# Model————————————————————————————
# 计算图输入
X = tf.placeholder(tf.int32, [None, sequence_length])
Y = tf.placeholder(tf.int32, [None, num_classes])

# 模型参数
W = tf.Variable(tf.random_uni
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值