前言:
如今小伙伴们对“lst堆叠”大概比较看重,我们都想要分析一些“lst堆叠”的相关资讯。那么小编也在网摘上汇集了一些有关“lst堆叠””的相关资讯,希望咱们能喜欢,兄弟们快快来学习一下吧!我们对150万条语音进行了情感分析 ~
原标题 | Sentiment Analysis of 1.5 Million Audible Reviews
作 者 | Toby Manders
翻 译 | 廖颖、had_in、Jonathan-huang、david95、黛娜•卡特琳
编 辑 | Pita
在这个项目的第一部分中,我们收集和研究了一个数据集,其中包括asin、评级数量和每个单独的有声英语课程的URL。
我们将通过使用这些字段来尽可能多地获取文本评论和附带的评级,从而找到我们离开的地方。然后我们将训练一些LSTM神经网络,将评论分类为正负两种。
查看遍历笔记:
查看数据预处理和情绪分析笔记:
下载所有评论的数据集,可访问:
1. 遍历150万条评论
我们以前研究过音频目录中的分级分布,注意到顶部选择的少数节目的分级的极端集中(标题等级日志和评论数量日志之间的大致线性关系)。
我们今天将利用这种偏斜的优势,以最大限度地提高每小时可获取的评论数量。假设每个标题的书面评论数量与每个标题的评级数量成比例,我们可以预计大约50%的网站评论集中在我们数据集中的前1%的程序中。
从HTML中删除这些评论有一个障碍。大多数最受欢迎的标题的评论都隐藏在“查看更多”按钮下面。
当点击那个显示答案的按钮时,我们要检查网络请求。我们发现一个指向我们刚刚评论过的文章url链接。通过在这个链接向后阅读到末尾,我们能够收集对于给出项目的所有评论。由于这里的页面下载非常快(也因为我们正在使用多线程工作),在一段合理的时间内,我们可以从项目的前6%(26,101)中搜刮到高达80%的评论。
在遍历期间,我们有机会去做少量的家务活。我们将会使用评论内容去训练一个把评论分类成有帮助的(4~5颗星)和无用的(1~3颗星)的机器学习模型。如果在我们先前阅读过的文章中有留下标题和作者,我们的模型很有可能会‘记住它’,也就是说,那个项目有很高的评分了。这意味着对泛化能力有不好的影响,所以我们希望把作者和标题从评论中移除。这样做我们就不需要为每篇评论都储存信息了。
统一都用<unk>,简称‘未知’来代替单词的步骤叫做‘unking’。除了从每篇评论中‘unking’作者和标题外,我们还会用“停止”这个词来代替句号,去掉所有其他标点符号,并将所有文章内容改为小写。这减少了我们数据集中的“单词”数量。
几个小时后,我们会有超过150万的评论。
2.数据的准备
当我们为每篇评论收集评分时,‘overall’、‘story’和‘表现performance’中,我们会以‘overall’列作为标签。另外两列我们将会保存下来用作未来的分析。
为了把数据和目标转换成我们训练模型所需要的形式,我们需要完成接下来的准备工作:
1. 在词汇类型做参数的假设函数中,我们要根据使用频率从高频词汇数据中创建一个词汇表。
2.‘Unk' ——即用‘unk’代替所有数据集存在但词汇表中缺失的词汇。
3. 填补或删减所有条目去统一长度、序列长度和假设函数中的参数。
4. Tokenize(也就是整合)数据集中所有的单词。
5. 从‘overall’列中创建二进制标签。
我们的目标是把数据中的X数组整合成(评论总数 * 序列长度)的形式 和 把矢量y整合成评论总数的长度。
这是前面的部分条目。已经把内容标准化,移除了作者和标题。
为了决定截断更长或更短,让我们看看下面的分类情况。
上面的长度-频率图看起来像是指数图像。96.4%的评论都小于250个单词。我们将把250个单词作为序列长度。
那评论长度下限是什么呢?左边的图表向我们展示了数据集中剩下的绝大多数评论(>98%)都是多于10个单词。我们用10作为评论长度的下限。
按照字符长度排序,我们可以看到超过10个“单词”的最短评论。
大于10个单词的最短的评论。请注意,“单词”是空格之间的所有内容。
我们的下一步工作是根据所有的评论构建一个词汇表。我们将构建一个字典用来统计数据集中每个单词出现的频率,然后我们将使用平率最高的10,000个单词来构建词汇表,并且用“unk”来编码我们的数据集——如用“unk”替换评论中我们词汇表中没有的单词。同时我们还将数据集编码为数字数组——如“tokens”——我们可以在同一个函数中完成这两项任务。
在一些示例文本上测试我们的功能如下:
sample = ‘i really loved dfalkjf especially the introduction’...print(tokenize_text(sample))Unk ID: 24[4, 56, 79, 24, 301, 1, 1190]
注意到,未识别的“dfalkjf”被替换为“unk”,编码为24。其余的单词编码为对应于词汇表中单词的索引。
经过填充、截断和编码之后,我们的数据如下:
array([[ 24, 0, 0, ..., 24, 24, 24], [ 24, 9, 11, ..., 24, 24, 24], [ 149, 149, 149, ..., 24, 24, 24], ..., [ 131, 32, 873, ..., 24, 24, 24], [ 5, 3312, 368, ..., 24, 24, 24], [ 172, 195, 1, ..., 24, 24, 24]])
注意到每一行末尾的24,这就是用'unk'进行填充得到的。
最后,我们根据“overall”评级创建了二进制标签,并发现大约79%的评论获得了4星或5星评级。这个数字很重要,因为它意味着即使是最简单的模型(总是预测1)也能获得79%的准确率,这是必须要超过的数字。
3.训练模型
现在预处理步骤已经完成,我们可以训练我们的模型了。利用TensorFlow和Keras层,我们可以尝试网络结构以及不同的参数。我们所有的模型均将嵌入层作为网络第一层,嵌入层每个单词转换成固定长度的向量,这个长度也是一个超参数。
我们所有的模型都将至少有一个RNN层(特别是长短期记忆单元或称为LSTM层)。这一层将用于向前和向后传播。在每种情况下,LSTM层都将输入一个具有relu激活函数的全连接层和输出一个具有sigmoid激活函数的输出层,后者将得到一个介于0和1之间的值,该值将被阈值化以进行类别预测。
对于其他层,我们加入Dropout层以减少过拟合,其中包括一种特殊类型的Dropout层,该Dropout层接在嵌入层之后,,随机丢弃一维特征图而不是单个单词,以及一个一维卷积层,该卷积层将学习一组滤波器,以提取相邻的词之间的关系特征,我们还将尝试堆叠两层LSTMs。
我们将使用二分类交叉熵损失函数,Adam优化器,并使用early stopping回调函数,当验证集损失开始增加时,该回调函数将停止训练。
我们的最佳模型之一的训练集和验证集的准确性。验证损失在第5个epoch达到最低点,训练提前停止。
4.结果
表现最好的模型确实是最复杂的——在一组未知的测试集上有93.8%的准确率,这个测试集包含大约155,000个评论。然而,值得注意的是,最简单的模型达到了93.1%的准确率。
我们最简单的模型只包含三个隐藏层:嵌入长度只有8的嵌入层、只有8个单元的LSTM层以及一个16个单元的全连接层。网络总共有81k的参数,训练耗时53分钟。
model = tf.keras.Sequential([tf.keras.layers.Embedding(vocab_size, 8), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(8)), tf.keras.layers.Dense(16, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid')])
我们最复杂的模型,也是最终的赢家,除了LSTM层,还有7个隐藏层,包括dropout层、卷积层和pooling层:
对于二分类,受试者工作特征 (ROC)曲线很好地反映了模型的区分能力。它反映了这样一个事实:当您降低最终概率输出的阈值时,您会获得更高的真正率 ,但也会导致更高的误报率 。一个完美的模型会将更高的概率分配给正的样本,而不是负的样本,因此降低阈值将得到更多的正样本而不是更多的负样本。这样,曲线就会紧靠左上角。AUC相当于测量ROC曲线下的面积(越接近1越好) 。这里我们的模型在测试数据上的AUC为0.975.
让我们使用一些例子来测试一下我们的模型。我们会给它四个句子。分数小于0.5代表着负样本(消极情绪),大于0.5代表着正样本(积极情绪)。
这本糟糕的书真让人讨厌,真的,它让真让人难受。
我们的模型正确的给它打了0.01分(尽可能接近0)
我爱这本书,它很杰出、幽默而且新奇。
这一句得到0.99分。如果有歧义的句子会怎么样呢:
这本书很不错,但是它让我觉得难过。
0.52分,我们的模型要被我们玩哭了。那如果积极的词和消极的词同时出现呢:
这个故事真的很棒,但是解说员有点可怕。
0.72,模型给了“真的很棒”更多的权重。可能如果我们重新训练模型,能得到不同的结果。
最终,让我们观察一下我们的模型学习到的词嵌入向量。学到的我们字典里每一个单词的向量代表着关于这个单词的信息,这些信息用于预测词是正向的还是负向的。为了更直观的表示他们的空间关系,有助于我们理解,我们需要将这些词向量降维。
主成分分析(PCA)是一个将含有丰富信息的多维数据(比如包含很多变量)转化为坐标轴对齐(比如数据的第一维)的方法。我们会使用PCA将我们的128维的嵌入向量转化为2维数据,然后我们就可以将单词关系可视化:
如图,一个2D图表,从我们学到的词嵌入向量中选取了两个最主要的维度。
使用主成分分析法将词语表中61个常见词语转化为两维数据生成了上图。主要分为褒义词,比如“迷人的”、“卓越的”,标为蓝色;贬义词像“糟糕的”和“无聊的”,标为红色;还有中性词,比如“行为”和“书本”,标为黑色。
词嵌入清楚地反映了这次词语的词性,甚至可以看出更细致的关系。比如,我们直觉地感知近义词的关系:“单调的”和“单调”、“更糟”和“最差”、“乏味”和“厌倦”、“声音”和“叙述者”、“音频”和“质量”等等。
通过对整个词语表重复这个过程,只看最主要的成分,可以找到最积极和最消极的词语。分数最高的词语是“充分利用”,而分数最低的词语呢,就是“Refund(退款)”。
最后,我们在整个训练集上进行预测,来找“最差”和“最好”的评论。
“最差”评论:
浪费,浪费,浪费,买这本书就是浪费,省点钱吧。
什么可以使<标题>更好呢?
没有什么可以使这本书更好了。温馨提醒,这本书不像有些人说的那么有趣,谁会买一本有趣的吸血鬼的书呢?
你认为下一个会听到什么呢?
不确定,读者会对吸血鬼或天启发表评论,而不是对作者或书籍朗读者。
你为什么不喜欢<朗读者>的的表现呢?
因为她的音色,她读每一个角色感觉都是一样的。
你不喜欢这本书,但它有没有什么优点呢?
没有...甚至更糟糕,因为它是数字媒体而不是实体书,我都不能把它拷贝下来回顾。我之前读/听过比这本书好太多的产品。
还有什么补充的吗?
我是对任意题材吸血鬼和天启故事的真爱粉,这本书就不该写出来更别说...
“最好”评论:
太棒了
太棒了太棒了太棒了太棒了太棒了太棒了...(此处省略N个“太棒了”)太棒了太棒了太棒了太棒了太棒了太棒了太棒了
via
封面图来源:
标签: #lst堆叠