本文介绍了如何构建情感分类器, 从介绍自然语言处理开始, 一步一步讲述构建过程. 我们将使用亚马逊产品评论, IMDB 电影评论和 Yelp 评论来构建情感分析模型.
本文介绍了如何构建情感分类器, 从介绍自然语言处理开始, 一步一步讲述构建过程.
自然语言处理简介
语言把人类联系在一起. 语言是一种工具, 它既可以让我们把想法和感受传达给另一个人, 也能让我们理解别人的想法和感受. 我们大多数人从 1 岁半到 2 岁开始说话. 人脑是如何在如此年幼的时候掌握如此大量知识的, 这仍是未解之谜. 但是, 人们已经发现大部分语言处理功能发生在大脑皮层内.
情感分析背后的动机
人类自己无法理解语言是如何被大脑处理的. 那么, 我们能教一台机器学习我们的语言吗? 通过广泛研究, 人们已经开发了许多方法来帮助机器理解语言. 自然语言处理 (NLP) 是研究人类语言与计算机交互的领域. 自然语言处理的一个子问题是情感分析, 即把一个语句分类为积极或消极. 把语句分类为积极或消极有什么用呢? 以亚马逊网站为例. 在亚马逊上, 用户可以对一个产品发表评论, 说明它是好是坏, 甚至可以是中性的. 然而, 使用人工阅读所有评论并获得客户对产品的总体反馈既昂贵又耗时. 再说说我们的机器学习模型. 机器学习模型可以通过大量数据进行推断, 对评论进行分类. 利用这种机器学习模型, 亚马逊可以通过客户评论改进其产品, 从而为公司带来更多收入.
情感分析并不像看起来那么简单. 如果你认为含有好的,很棒等词的评论可归为积极评论, 而含有坏的,苦恼的等词的评论可归为消极评论, 那你需要三思. 例如,完全没有好味道和一份好的快餐, 但没有什么特别的分别代表消极和中立的反馈, 即使都有好字. 因此, 这项任务可能没有看起来那么简单. 接下来让我们看看即将使用的数据.
数据集
我们将使用亚马逊产品评论, IMDB 电影评论和 Yelp 评论来构建情感分析模型.
数据下载链接: https://www.kaggle.com/marklvl/sentiment-labelled-sentences-data-set/data
所有数据都已经过注释, 0 表示消极反馈, 1 表示积极反馈. 亚马逊的数据与下图相似.
代码
我们可以写一些代码:
数据存储于不同的文本文件中. 我们打开每个文件并阅读所有的文本行, 文本行还包括每个文本的标签. 然后我们将其存储在一个名为lines的列表中.
数据集的每一行都包含文本, 文本后是四个字符空间, 还有该文本的标签(0 或 1). 因此, 我们先将包含文本的第一部分添加到 features(x) 中, 然后获取标签, 标签的末尾有\n. 所以标签被移除, 然后添加到我们的标签列表 labels(y).
keras 有一个内置的 API, 使得准备计算文本变得更容易. tokenizer 类共有 4 个属性, 可用于特征准备. 请看下面的示例, 了解 tokenizer 的实际功能.
tokenizer 为句子中的每个单词分配索引值, 并且可以使用该索引值表示新句子. 由于我们使用的文本语料库包含大量不同的单词, 因此我们设置了一个上限, 只使用最经常出现的 2500 个单词.
现在, 我们将文本转换为如上所示的数字序列, 并填充数字序列. 因为句子可以有不同的长度, 它们的序列长度也会不同. 因此, pad_sequences 会找出最长的句子, 并用 0 填充其他较短语句以匹配该长度.
我们将标签转换为 one hot 编码, 这有助于 LSTM 网络预测文本的标签. 现在, 我们已经准备好了文本数据, 可以把它分为训练样本和测试样本. 将 80% 的数据用于训练, 20% 的数据用于测试模型.
我们现在建立了模型, 并对其进行编译, 训练和测试. 该模型具有嵌入层. 输入序列是文本的稀疏表征, 因为词汇表巨大, 并且给定单词将由大向量表示. 如果我们能够构建序列的某种密集表征, 那么网络将更容易进行预测. 2500 个单词的词嵌入 / 密集表征是通过嵌入层对模型进行训练获得的. 然后, 我们将 LSTM 和密集层添加到模型中. LSTM 单元负责进行上下文推断, 并帮助预测句子是否积极. 密集层输出每个类的概率. 本文不详细介绍 LSTM, 若想了解其更多信息, 请参阅此博客: http://colah.github.io/posts/2015-08-Understanding-LSTMs/.
输出
训练
测试
完成! 你刚刚用 50 行代码构建了一个情感分类器~
来源: http://bigdata.51cto.com/art/201806/576446.htm