Keras情感分析(Sentiment Analysis)实战---自然语言处理技术(2)

《Keras情感分析(Sentiment Analysis)实战---自然语言处理技术(2)》

简介

情感分析(Sentiment Analysis)是自然语言处理里面比较高阶的任务之一。仔细思考一下,这个任务的究极目标其实是想让计算机理解人类的情感世界。我们自己都不一定能完全控制和了解自己的情感,更别说机器了。

不过在人工智能的认知智能阶段(人工智能三阶段——计算智能,认知智能,感知智能),商家还是可以用它来做一些商品或服务的评论分析,继而有效地去优化商品或服务,为消费者们提供更好用户体验。

情感分析任务简介

情感分析任务其实是个分类任务,给模型输入一句话,让它判断这句话的情感是积极的,消极的,还是中性的。例子如下:
输入:的确是专业,用心做,出品方面都给好评。
输出:2
输出可以是 [0,1,2] 其中一个,0表示情感消极,1表示情感中性,2表示情感积极。

情感分析这个任务还有一个升级版——细腻度的情感分析。升级版希望模型不仅能识别出情感的好坏,而且还希望模型能识别出是由于什么原因导致这种情感发生。举个例子,”这家餐厅的地理位置不错,可惜菜不怎么好吃”,我们就需要识别出,在地理位置这个aspect上情感是积极的,而在菜的味道这个aspect上情感是消极的。是不是很难,所以实战部分我只简单介绍一下麻瓜版的情感分析任务——简单的分类。

情感分析算法简介

分类任务的算法,想必大家都很熟悉:SVM,Logistic,Tree等。可是对于文本分类来说,最重要的是如何将一句话的映射到向量空间,同时保持其语义特征。所以文本的向量化表示是最最重要的一个环节。而文本的向量化就是涉及到Word Embedding技术和深度学习(Deep Learning)技术。

Word Embedding指的是把文本转换成计算机能处理的向量,而其中难点的是:将文本向量化时如何保持句子原有的语义。早期word embedding使用的是Bag of Words,TF-IDF等,这些算法有个共同的特点:就是没有考虑语序以及上下文关系。而后来出现了更为先进Word2Vector ,Glove等考虑上下文关系的,今年NLP领域大放异彩的BERT就是在文本向量化上做出了很大的突破。

深度学习模型可以将特征工程自动化,模型自动寻找特征,毕竟人工特征是个费脑费时的过程。在NLP当中的运用也司空见惯了,RNN(LSTM,GRU),CNNTransformer等各路神仙也在各显神通。深度学习模型凭借其强大的表示能力,在很多任务中都吊打人工特征(吹得 有些夸张了,没收住)。

本次的项目实战:

  1. 采用Word2Vector技术去训练词向量;
  2. 采用BiLSTM去做特征的表示学习。

其项目架构如下图所示:

《Keras情感分析(Sentiment Analysis)实战---自然语言处理技术(2)》

项目实战

数据读取

数据格式如下:一句评论后面标记一个label,0表示消极情感,1表示中性情感,2表示积极情感。

《Keras情感分析(Sentiment Analysis)实战---自然语言处理技术(2)》

这里针对笔者自己的数据集定义了一个数据读入函数。

数据读入之后,得到一个所有评论的sentences列表 ,和一个与之一一对应的labels列表。
sentences[1] :烤鸭还是不错的,别的菜没什么特殊的
labels[1] :1

训练词向量

将所有的评论文本数据用来训练词向量,这里使用的gensim中的Word2Vec,原理是的Skip-gram。这里对词向量的原理不多介绍,总之,这一步将一个词映射成一个100维的向量,并且考虑到了上下文的语义。这里直接将上一部得到的句子列表传给train_word2vec函数就可以了,同时需要定义一个词向量文件保存路径。模型保存后,以后使用就不需要再次训练,直接加载保存好的模型就可以啦。

数据预处理

这里定义了一些数据处理和变换方法。

获取词向量矩阵和词典

这一步主要是为了拿到传给后续情感分析模型的词典(w2id)和词向量矩阵embedding_weights,
w2id格式如下:{

‘一两天’: 454,
‘一两年’: 455,
‘一两次’: 456,
‘一个’: 457,
‘一个个’: 458,
‘一个劲’: 459,

‘不一会’: 984,
‘不上’: 985,
‘不下’: 986,
‘不严’: 987,
‘不为过’: 988,
‘不久’: 989,
}

embedding_weights格式如下:
[[ 0. , 0. , 0. , …, 0. ,
0. , 0. ],
[-1.1513499 , -0.00520114, 1.65645397, …, 0.50586915,
-0.03466858, 0.84113288],
[ 0.01824509, -0.23613754, -0.47191045, …, -0.16491373,
-0.25222906, -0.00384654],
…,
[ 0.10879639, 0.05459598, -0.02946772, …, -0.17389177,
0.10144144, 0.21539673]]

这个矩阵保存了上面通过Word2Vector方法训练的词向量,每个词通过其在词典(w2id)中的index索引到对应得词向量,此矩阵将作为参数传给后续的情感分析模型。

数据变换

将数据变换成模型能够处理的格式。
原始数据格式如下:
sen :不错,品种齐全,上菜很快,味道也不错
label :2

执行上面代码后句子数据变成如下格式:
输入: [000......,31,43,12,4,65,12,233,11,1391,131,4923,1233]
输出: [001]

构建模型

这里定义了一个Sentiment类,封装了模型的构建,训练和预测方法。

构建模型,同时传人词典和词向量矩阵。

《Keras情感分析(Sentiment Analysis)实战---自然语言处理技术(2)》

模型训练

运行上述代码让模型跑起来,笔者只是做个实验,所以只让模型训练了一个epoch。

《Keras情感分析(Sentiment Analysis)实战---自然语言处理技术(2)》

模型预测

模型训练完之后,接下来就是见证奇迹的时刻了。

《Keras情感分析(Sentiment Analysis)实战---自然语言处理技术(2)》

笔者输入一句评论让模型去预测,结果如上图所示,只训练了一个epoch,就有这样的功力,不得不承认词向量+深度学习真是强。

结语

至此,我们通过深度学习技术让计算机学会人类世界中一些简单的情感判断。有没有觉得有那么一丝丝可怕,会不会真有一天,你在和一个计算机进行情感交流呢?
(想着想着,笔者先跑了)

参考:
https://github.com/Edward1Chou/SentimentAnalysis

点赞
  1. kun说道:

    文中的数据去哪获取?

    1. admin说道:

      github别人的数据

  2. 栗子说道:

    可以给下数据的GitHub地址??非常感谢。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

3 × 3 =