1.视频网站:mooc慕课https://mooc./university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-/dl/
3.github课件+作业+答案:/stormstone/deeplearning.ai
2.9 情绪分类 Sentiment Classification
情感分类任务就是看一段文本,然后分辨这个人是否喜欢他们在讨论的这个东西,这是NLP中最重要的模块之一,经常用在许多应用中。
情感分类一个最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,你也能构建一个不错的情感分类器,让我们看看是怎么做到的。
如上图,这是一个情感分类问题的一个例子,输入 x x x是一段文本,而输出 y y y是你要预测的相应情感。比如说是一个餐馆评价的星级,
比如有人说,“The dessert is excellent.”(甜点很棒),并给出了四星的评价;“Service was quite slow”(服务太慢),两星评价;“Good for a quick meal but nothing special”(适合吃快餐但没什么亮点),三星评价;还有比较刁钻的评论,“Completely lacking in good taste, good service and good ambiance.”(完全没有好的味道,好的服务,好的氛围),给出一星评价。
如果你能训练一个从 x x x到 y y y的映射,基于这样的标记的数据集,那么你就可以用来搜集大家对你运营的餐馆的评价。一些人可能会把你的餐馆信息放到一些社交媒体上,Twitter、Facebook、Instagram或者其他的社交媒体,如果你有一个情感分类器,那么它就可以看一段文本然后分析出这个人对你的餐馆的评论的情感是正面的还是负面的,这样你就可以一直记录是否存在一些什么问题,或者你的餐馆是在蒸蒸日上还是每况愈下。
情感分类一个最大的挑战就是可能标记的训练集没有那么多。对于情感分类任务来说,训练集大小从10,000到100,000个单词都很常见,甚至有时会小于10,000个单词,采用了词嵌入能够带来更好的效果,尤其是只有很小的训练集时。
接下来你可以这样做,这节我们会讲几个不同的算法。
1-简单的情感分类的模型-采用平均值,但是没有考虑词序
这是一个简单的情感分类的模型,假设有一个句子"dessert is excellent",然后在词典里找这些词,我们通常用10,000个词的词汇表。我们要构建一个分类器能够把它映射成输出四个星,给定这四个词(“dessert is excellent”),我们取这些词,找到相应的one-hot向量,所以这里单词The就是 O 8928 O_{8928} O8928,乘以嵌入矩阵 E E E, E E E可以从一个很大的文本集里学习到,比如它可以从一亿个词或者一百亿个词里学习嵌入,然后用来提取单词The的嵌入向量 e 8928 e_{8928} e8928,对dessert、is、excellent做同样的步骤。
如果在很大的训练集上训练 E E E,比如一百亿的单词,这样你就会获得很多知识,甚至从有些不常用的词中获取,然后应用到你的问题上,即使你的标记数据集里没有这些词。我们可以这样构建一个分类器,取这些嵌入向量 e e e,比如是300维度的向量。然后把它们求和或者求平均,这里我画一个大点的平均值计算单元(上图Avg),你也可以用求和或者平均。这个单元(上图Avg)会得到一个300维的特征向量,把这个特征向量送进softmax分类器,然后输出 y ^ \hat y y^。这个softmax能够输出5个可能结果的概率值,从一星到五星,这个就是5个可能输出的softmax结果用来预测 y y y的值。
这里用的平均值运算单元(Avg),这个算法适用于任何长短的评论,因为即使你的评论是100个词长,你也可以对这一百个词的特征向量求和或者平均它们,然后得到一个表示一个300维的特征向量表示,然后把它送进你的softmax分类器,所以这个平均值运算效果不错。它实际上会把所有单词的意思给平均起来,或者把你的例子中所有单词的意思加起来就可以用了。
这个算法有一个问题就是没考虑词序,尤其是这样一个负面的评价,“Completely lacking in good taste, good service, and good ambiance.”,但是good这个词出现了很多次,有3个good,如果你用的算法跟这个一样,忽略词序,仅仅把所有单词的词嵌入加起来或者平均下来,你最后的特征向量会有很多good的表示,你的分类器很可能认为这是一个好的评论,尽管事实上这是一个差评,只有一星的评价。
2-更加复杂的模型-使用RNN,考虑词序
我们有一个更加复杂的模型,不用简单的把所有的词嵌入都加起来,我们用一个RNN来做情感分类。
我们这样做,首先取这条评论,“Completely lacking in good taste, good service, and good ambiance.”,找出每一个one-hot向量,这里我跳过去每一个one-hot向量的表示。用每一个one-hot向量乘以词嵌入矩阵 E E E,得到词嵌入表达 e e e,然后把它们送进RNN里。
RNN的工作就是在最后一步(上图最右所示)计算一个特征表示,用来预测 y ^ \hat y y^,这是一个多对一的网络结构的例子,我们之前已经见过了。有了这样的算法,考虑词的顺序效果就更好了,它就能意识到"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这个词不在标记的训练集里,如果是在一亿或者一百亿单词集里训练词嵌入,它仍然可以正确判断,并且泛化的很好,甚至这些词是在训练集中用于训练词嵌入的,但是可以不在专门用来做情感分类问题的标记的训练集中。
以上就是情感分类的问题,我希望你能大体了解。一旦你学习到或者从网上下载词嵌入,你就可以很快构建一个很有效的NLP系统。
-11-11 吴恩达DL学习-C5 序列模型-W2 自然语言处理与词嵌入(2.9 情绪分类-使用RNN模型 考虑词序)