TextCNN

  • 原理:核心点在于使用卷积来捕捉局部相关性,在文本分类任务中可以利用CNN提取句子中类似n-gram的关键信息。

    textcnn

  • textcnn详细过程:第一层是图中最左边的7乘5的句子矩阵,每行是词向量,维度=5。然后经过不同 filter_size的一维卷积层(这里是2,3,4),每个filter_size 有filter_num(这里是2)个输出 channel。第三层是一个1-max pooling层,这样不同长度句子经过pooling层之后都能变成定长的表示了,最后接一层全连接的 softmax 层,输出每个类别的概率。

  • 一维卷积(conv-1d):经过词向量表达的文本为一维数据,因此在TextCNN卷积用的是一维卷积。

使用数据集:CNEWS

pytorch代码实现:textcnn_baseline

TextCNN网络

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class TextCNN(nn.Module):
"""CNN模型"""

def __init__(self):
super(TextCNN, self).__init__()
self.embedding = nn.Embedding(5000, 64)
self.conv = nn.Sequential(nn.Conv1d(in_channels=64, out_channels=256, kernel_size=5),
nn.ReLU(),
nn.MaxPool1d(kernel_size=596))
self.f1 = nn.Linear(256, 10)

def forward(self, x):
x = self.embedding(x) # batch_size,length,embedding_size 64*600*64
x = x.permute(0, 2, 1) # 将tensor的维度换位。64*64*600

# batch_size,卷积核个数out_channels,(句子长度-kernel_size)/步长+1
x = self.conv(x) # Conv1后64*256*596,ReLU后不变,MaxPool1d后64*256*1;

x = x.view(-1, x.size(1)) # 64*256
x = F.dropout(x, 0.8)
x = self.f1(x) # 64*10 batch_size * class_num
return x

参考

  1. Convolutional Neural Networks for Sentence Classification
  2. https://github.com/Alic-yuan/nlp-beginner-finish/