情感分类(Sentiment Classification)

来源:Coursera吴恩达深度学习课程

情感分类(sentiment classification)就是看一段文本,然后分辨这个人是否喜欢他们在讨论的东西,这是NLP中最重要的模块之一。情感分类一个最大的挑战就是标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,也可以构建一个不错的情感分类器。

情感分类(Sentiment Classification)_第1张图片

如上图所示,是一个情感分类问题的例子,输入x是一段文本,而输出y是要预测的相应情感。例如一个餐馆评价的星级,

比如"The dessert is excellent."(甜点很棒),四星的评价(review);

"Service was quite slow"(服务太慢),这是两星评价;

"Good for a quick meal but nothing special"(适合吃快餐但没什么亮点),三星评价;

还有比较刁钻的评论,"Completely lacking in good taste, good service and good ambiance."(完全没有好的味道,好的服务,好的氛围),给了一星评价。 

如果你能训练一个从x到y的映射,基于这样的标记的数据集,那么你就了解大家对餐馆的评价。一般而言,可以通过一个情感分类器分析一些社交平台上的评价,然后分析出大家对你的餐馆的评论的情感是正面的还是负面的,这样可以了解餐馆是在蒸蒸日上还是每况愈下。

情感分类一个最大的挑战就是可能标记的训练集没有那么多。对于情感分类任务来说,训练集大小从10,000到100,000个单词都很常见,甚至有时会小于10,000个单词,采用了词嵌入能够带来更好的效果,尤其是只有很小的训练集时。

接下来我们看几个不同的算法。

情感分类(Sentiment Classification)_第2张图片

如上图,这是一个简单的情感分类的模型,看这个句子"The dessert is excellent",我们通常用10,000个词的词汇表(dictionary)。我们要构建一个分类器能够把它映射成输出四个星,对于句子中的4个单词,找到相应的one-hot向量,所以the就是o_8928,乘以嵌入矩阵E,E可以从一个很大的文本集里学习到(它可以从一亿个词或者一百亿个词里学习嵌入),然后提取单词the的嵌入向量e_8928,对dessert、is、excellent做同样的步骤。

如果在很大的训练集上训练E,比如一百亿的单词,这样你就会获得很多知识,甚至从有些不常用的词中获取,然后应用到你的问题上,即使你的标记数据集里没有这些词。我们可以这样构建一个分类器,取这些嵌入向量,比如是300维度的向量。接着把它们求和(sum)或者求平均(mean)。在这里取平均之后会得到一个300维的特征向量,把这个特征向量送进softmax分类器,然后输出y帽。这个softmax能够输出5个可能结果的概率值,从一星到五星,这个就是5个可能输出的softmax结果用来预测y的值。

这里用的平均值运算单元(the average operation here),这个算法适用于任何长短的评论,因为即使你的评论是100个词长,你也可以对这一百个词的特征向量求和或者平均它们,然后得到一个表示一个300维的特征向量表示,然后把它送进你的softmax分类器,所以这个平均值运算效果不错。

这个算法有一个问题就是没考虑词序,尤其是这样一个负面的评价,"Completely lacking in good taste, good service, and good ambiance.",good这个词出现了3次,如果算法忽略词序,只是把所有单词的词嵌入加起来或者平均下来,最后的特征向量会有很多good的表示,分类器很可能认为这是一个好的评论,尽管事实上这是一个差评,一星的评价。

我们有一个更加复杂的模型,不用简单的把所有的词嵌入都加起来,我们用一个RNN来做情感分类。

情感分类(Sentiment Classification)_第3张图片

如上图所示,首先取这条评论,"Completely lacking in good taste, good service, and good ambiance.",用每一个one-hot向量乘以词嵌入矩阵E,得到词嵌入表达e,然后把它们送进RNN里。RNN的工作就是在最后一步计算一个特征表示,用来预测y帽,这是一个多对一(many-to-one)的网络结构的例子。这个算法考虑词的顺序效果就更好了,它就能意识到"things are lacking in good taste",这是个负面的评价,“not good”也是一个负面的评价。而不像原来的算法一样,只是把所有的加在一起得到一个大的向量,根本意识不到“not good”和 “good”不是一个意思,"lacking in good taste"也是如此,等等。

如果你训练一个这样的算法,最后会得到一个很合适的情感分类的算法。由于你的词嵌入是在一个更大的数据集里训练的,这样效果会更好,更好的泛化一些没有见过的新的单词。比如其他人可能会说,"Completely absent of good taste, good service, and good ambiance.",即使absent这个词不在标记的训练集里,如果是在一亿或者一百亿单词集里训练词嵌入,它仍然可以正确判断,并且泛化的很好,甚至这些词是在训练集中用于训练词嵌入的,但是可以不在专门用来做情感分类问题的标记的训练集中。

以上就是情感分类的问题。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

你可能感兴趣的:(吴恩达深度学习笔记,笔记,深度学习知识点储备,算法,机器学习,深度学习,人工智能,python)