文章目录
文章目录
论文《Character-level Convolutional Networks for Text Classification》
论文总览
学习目标
第一课:论文导读
卷积神经网络的发展
卷积神经网络用于图像特征提取
卷积神经网络用于声音特征提取
卷积神经网络用于文本特征提取
字符信息用于生成词表示
论文背景
- 文本分类是自然语言处理的基础任务之一,目前大多数文本分类任务都是基于词的。
- 卷积神经网络能够成功提取出原始信息中的特征,如图像和语音,于是本文在字符级别的数据上使用卷积神经网络来提取特征。
- 在文本上使用卷积神经网络已经很常见了,而且使用字符级别的特征来提高自然语言处理任务的性能也有很多研究。
- 本文首次使用纯字符级别的卷积神经网络,我们发现我们的卷积神经网络不需要单词级别的信息就能够在大规模预料上得到很好的结果。
研究成果及意义
研究成果
- 构造了几个大的文本分类数据集,这些数据集成为了文本分类最常用的一些数据集。
- 提出的CharTextCnn模型在多个数据集上能够取得最好的或者非常有竞争力的结果。
研究意义
- 构建了多个文本分类数据集,极大地推动了文本分类的研究工作。
- 提出的CharTextCNN方法因为只使用的字符信息,所以可以用于多种语言中。
第二课:论文精读
摘要
- 本文从实验角度探索了字符级别卷积神经网络用于文本分类的有效性。
- 我们构造了几个大规模的文本分类数据集,实验结果表明我们的字符级别文本分类模型能够取得最好的或者非常有竞争力的结果。
- 对比模型包括传统的词袋模型、n-grams模型以及他们的tf-idf变体,还有一些基于深度学习的模型,包括基于卷积神经网络和循环神经网络的文本分类模型。
CharTextCNN模型
卷积神经网络公式
CharTextCNN Model
缺点 :
- 字符级别的文本长度特别长, 不利于处理长文本的分类。
- 只使用字符级别信息, 所以模型学习到的语义方面的信息较少
- 在小语料上效果较差
优点 :
- 模型结构简单,并且在大语料上效果很好。
- 可以用于各种语言, 不需要做分词处理。
- 在噪音比较多文本上表现较好,因为基本不存在OOV问题。
实验结果分析
数据集介绍
和多种对比模型在多个数据集上的效果对比。
和对比模型的相对错误率比较
论文总结
关键点 :
- 卷积神经网络能够有效地提取关键的特征
- 字符级别的特征对于自然语言处理的有效性
- CharTextCNN模型
创新点 :
- 提出了一种新的文本分类模型—CharTextCNN
- 提出了多个的大规模的文本分类数据集
- 在多个文本分类数据集上取得最好或者非常有竞争力的结果
启发点 :
-
基于卷积神经网络的文本分类不需要语言的语法和语义结构的知识。
ConvNets do not require the knowledge about the syntactic or semantic structure of a language(Introduction P6)
-
实验结果告诉我们没有一个机器学习模型能够在各种数据集上都能表现的很好。
Our experiments once again verifies that there is not a single machine learning model that can work for all kinds of datasets(5 Discussion P8)
- 本文从实验的角度分析了字符级别卷积神经网络在文本分类任务上的适用性。
This article offers an empirical study on character-level convolutional networks for text classification. (6 Conclusion and Outlook P1)
代码实现
数据预处理:
#coding:utf-8
from torch.utils import data
import os
import torch
import json
import csv
import numpy as np
class AG_Data(data.DataLoader):
def __init__(self,data_path,l0 = 1014):
self.path = os.path.abspath('.')
if "data" not in self.path:
self.path += "/data"
self.data_path = data_path
self.l0 = l0
self.load_Alphabet()
self.load(self.data_path)
def __getitem__(self, idx):
X = self.oneHotEncode(idx)
y = self.y[idx]
return X, y
def __len__(self):
return len(self.label)
def load_Alphabet(self):
with open(self.path+"/alphabet.json") as f:
self.alphabet = "".join(json.load(f))
def load(self,data_path,lowercase=True):
self.label = []
self.data = []
with open(self.path+data_path,"r") as f:
datas = list(csv.reader(f,delimiter=',', quotechar='"'))
for row in datas:
self.label.append(int(row[0])-1)
txt = " ".join(row[1:])
if lowercase:
txt = txt.lower