TextCNN在文本分类的应用
郭同
任务定义-文本分类
• 输入:一句话[W_1, W_2, W_3, …, W_n]
• 输出:这句话的类别
比如,
我想听歌 音乐类,
今天天气? 天气类,
打开电灯 控制类,
文本分类整体模型:
1,将句子的每个词初始化成一个向量,一般100-300维,即:
W_1 = [0.1, 0.2, 0.9, 0.4, 0.5, …]
W_2 = [0.3, 0.4, 0.2, 0.1, 0.8, …]
W_3 = [0.7, 0.3, 0.5, 0.6, 0.2, …]
…
W_n = [0.8, 0.9, 0.9, 0.5, 0.5, …]
2,过TextCNN进行特征提取。
3,过MLP然后输出label。
一层CNN,多个filter:宽度有2,3,4,5,6…每个高度为embedding_dim
W_1, W_2, W_3, … W_n W_1, W_2, W_3, … W_n W_1, W_2, W_3, … W_n
W_1, W_2, W_3, … W_n W_1, W_2, W_3, … W_n W_1, W_2, W_3, … W_n
• CNN_input: [batch, in_height, in_width, in_channel]
• Text_input: [32, 20, 100, 1]
• CNN_filter: [filter_height, filter_width, in_channel, out_channel]
• Text_filter_1: [3, 100, 1, 200]
• Text_filter_2: [4, 100, 1, 200]
• Text_filter_3: [5, 100, 1, 200]
• CNN_output: [batch, out_height, out_width, out_channel]
• Text_output: [32, 20, 1, 200] * 3
• Pooling output:[32, 1, 1, 200] * 3
整体的输入输出
• 输入:[32, 20, 100, 1]
[batch_size, sequence_len, embedding_dim]
• 输出:[32, 1, 1, 200*3]
[batch_size, feature_dim * filter_num]
之后可以过MLP做分类
其他经典文本分类模型
1,RNN:
输入[batch_size, sequence_len, embedding_dim]
然后取RNN的最后一个state:
[batch_size, hidden_dim]
最后过MLP输出。
2,TextCNN优势:
就是卷积的优势,对整个句子进行特征提取。
比RNN在大多数据集准确率要高,可以说在文本分类任务基本淘汰了
RNN。
CNN在NLP其他应用
1,Pooling之前:[32, 20, 1, 200 * 3]
可以看作句子过CNN之后的表示。
2,将char-level过CNN(with pooling)卷成word-level:
输入[batch_size, sequence_len, word_len, char_emb_dim]
输出[batch_size, sequence_len, word_hidden_dim]
认为这过CNN之后的word包含它所有char的信息。
3,在transformer结构中,在self-attention之前和embedding层之后加入,作为MLP补充,提升了速度和
效果。
4,纯CNN做机器翻译:
Convolutional Sequence to Sequence Learning
A Convolutional Encoder Model for Neural Machine Translation