CNN也能用于NLP任务,一文简述文本分类任务的7个模型
作者:网友投稿 时间:2018-07-06 21:02
本文是我之前写过的一篇基于推特数据进行情感分析的文章(https://ahmedbesbes.com/sentiment-analysis-on-twitter-using-word2vec-and-keras.html)的延伸内容。那时我建立了一个简单的模型:基于 keras 训练的两层前馈神经网络。用组成推文的词嵌入的加权平均值作为文档向量来表示输入推文。
我用的嵌入是用 gensim 基于语料库从头训练出来的 word2vec 模型。该是一个二分类任务,准确率能达到 79%。
本文目标在于探索其他在相同数据集上训练出来的 NLP 模型,然后在给定的测试集上对这些模型的性能进行评估。
我们将通过不同的模型(从依赖于词袋表征的简单模型到部署了卷积/循环网络的复杂模型)了解能否得到高于 79% 的准确率!

首先,将从简单的模型开始,逐步增加模型的复杂度。这项工作是为了说明简单的模型也能很有效。
我会进行这些尝试:
用词级的 ngram 做 logistic 回归
用字符级的 ngram 做 logistic 回归
用词级的 ngram 和字符级的 ngram 做 Logistic 回归
在没有对词嵌入进行预训练的情况下训练循环神经网络(双向 GRU)
用 GloVe 对词嵌入进行预训练,然后训练循环神经网络
多通道卷积神经网络
RNN(双向 GRU)+ CNN 模型
文末附有这些 NLP 技术的样板代码。这些代码可以帮助你开启自己的 NLP 项目并获得最优结果(这些模型中有一些非常强大)。
我们还可以提供一个综合基准,我们可以利用该基准分辨哪个模型最适合预测推文中的情绪。
在相关的 GitHub 库中还有不同的模型、这些模型的预测结果以及测试集。你可以自己尝试并得到可信的结果。
import os
import re
import warnings
warnings.simplefilter("ignore", UserWarning)
from matplotlib import pyplot as plt
%matplotlib inline
import pandas as pd
pd.options.mode.chained_assignment = None
import numpy as np
from string import punctuation
from nltk.tokenize import word_tokenize
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, auc, roc_auc_score
from sklearn.externals import joblib
import scipy
from scipy.sparse import hstack
一、数据预处理
你可以从该链接()下载数据集。
加载数据并提取所需变量(情感及情感文本)。
该数据集包含 1,578,614 个分好类的推文,每一行都用 1(积极情绪)和 0(消极情绪)进行了标记。
作者建议用 1/10 的数据进行测试,其余数据用于训练。
data = pd.read_csv('./data/tweets.csv', encoding='latin1', usecols=['Sentiment', 'SentimentText'])
data.columns = ['sentiment', 'text']
datadata = data.sample(frac=1, random_state=42)
print(data.shape)
(1578614, 2)
for row in data.head(10).iterrows():
print(row[1]['sentiment'], row[1]['text'])
1 keep voting for robert pattinson in the popsugar100 as well!!
1 @GamrothTaylor I am starting to worry about you, only I have Navy Seal type sleep hours.
0 sunburned...no sunbaked! ow. it hurts to sit.




