一步抓住客户的心——使用Apache API进行用户分析!
社交媒体、电子邮件、支持票据、聊天、产品评论和推荐的文本挖掘和分析已成为几乎所有行业研究数据模式的宝贵资源,以帮助企业了解客户,预测和增强客户体验,量身定制营销方案。
情绪分析使用机器学习算法来判断文本内容的好坏。情绪分析的例子用例包括:
- 迅速理解客户评论的语气
了解客户对产品或服务的喜好
了解可能影响新客户购买决定的因素
提高企业的市场意识
尽早处理问题
- 了解股票市场情绪,以预测金融信号
- 决定人们如何看待客户支持
- 社交媒体监测
- 人气品牌/产品/公司/声誉感知监测
- 不满意的客户检测、监视和警报
- 营销活动监控/分析
- 客户服务意见监控/分析
- 品牌情感态度分析
- 客户反馈分析
- 竞争分析
- 品牌影响力的监控
人工分析客户或潜在客户生成的大量文本非常耗时,机器学习会让效率更高。
本篇讨论将流数据与机器学习和快速存储相结合的数据管道的体系结构。在第一部分中,我们将探索使用Spark机器学习数据管道进行情感分析。我们将使用一个Amazon产品评论数据集,并构建一个机器学习模型来将评论分为正面和负面。
在这篇文章中,我们将讨论以下内容:
- 分类和情感分析概念概述
- 从文本文档构建特征向量
- 训练机器学习模型,使用逻辑回归对正面和负面评论进行分类
- 评估和保存机器学习模型
分类
分类是受监督的机器学习算法,其基于标记数据(诸如电子邮件主题和消息文本)来识别项目属于哪个类别(例如电子邮件是否是垃圾邮件)。 用于分类的一些常见用例包括信用卡欺诈检测,电子邮件垃圾邮件检测和情绪分析。
分类采用具有已知标签和预定特征的一组数据,并基于该信息学习如何标记新记录。可用于进行预测的属性。要构建分类器模型,您需要使用最有助于分类的功能。
让我们通过一个案例来分析正面或负面的文本分类。
- 我们想要预测什么?
在此示例中,客户评论评级用于将评论标记为肯定评论。 4-5星的评论被认为是积极的评论,1-2星的评论被认为是负面评论。
- 您可以使用哪些属性进行预测?
审核文本单词用作发现正面或负面相似性的功能,以便将客户文本情绪分类为正面或负面。
机器学习工作流程
1、使用机器学习是一个迭代过程,涉及:
- 数据发现和模型创建
- 分析历史数据
- 根据格式、大小或结构确定传统分析或数据库没有使用的新数据源
- 跨多个数据源收集,关联和分析数据
- 了解并应用正确类型的机器学习算法以从数据中获取价值
- 训练、测试和评估机器学习算法的结果以构建模型
2、在生产中使用模型进行预测
3、数据发掘和使用新数据更新模型
特征提取
特征提取是数据中有趣的属性,可以用来进行预测。是将原始数据转换为机器学习算法的输入的过程。为了在Spark机器学习算法中得到应用,必须将特征放入特征向量中,特征向量是表示每个特征值的数字向量。要构建分类器模型,您需要提取和测试以找到对分类最有贡献的感兴趣的特性。
Apache Spark用于文本特征提取
SparkMLlib中的TF-IDF(Term Frequency- reverse Document Frequency)特征提取器可用于将文本词转换为特征向量。与文档集合相比,TF-IDF计算单个文档中最重要的单词。对于文档集合中的每个单词,它计算:
- 词频(TF),是一个单词在特定文档中出现的次数文档频率
- 文档频率(DF),即一个单词在文档集合中出现的次数
- Term Frequency- reverse Document Frequency (TF-IDF),衡量文档中某个单词的重要性(该单词在该文档中出现频率很高,但在文档集合中很少见)
例如,如果您有关于自行车配件的评论集合,那么评论中的“returned”一词对于该文档而言比“bike”这个词更重要。 在下面的简单示例中,有一个正面文本文档和一个负面文本文档,其中包含令牌“'love”,“bike”和“returned”(在过滤后删除无关紧要的单词,如“this”和“I”)。 显示了TF、DF和TF-IDF计算。 单词'bike'的TF为1:2文档(每个文档中的字数),文档频率为2(文档集中的字数),TF-IDF为½(TF除以DF)。
逻辑回归
逻辑回归是预测二元响应的常用方法。这是广义线性模型的一个特例,它可以预测结果的概率。逻辑回归通过使用逻辑函数估计概率来测量Y“标签”和X“特征”之间的关系。该模型用于预测标签类。
在我们的文本分类案例中,给定TF-IDF值的标签和特征向量,逻辑回归试图预测文本为正或负的概率。逻辑回归通过将每个TF-IDF特征乘以权重并将总和通过sigmoid函数来找到文本集合中每个单词的最佳拟合权重,该函数将输入x转换为输出y,即0到1之间的数字。换句话说,逻辑回归可以理解为找到最适合的参数:
逻辑回归具有以下优点:
- 可以处理散落数据
- 快速训练
- 权重可以解释
正权重将对应于积极的词
负权重将对应于否定的词
数据分析和特征提取
我们将使用亚马逊体育和户外产品评论数据的数据集,您可以在此处下载:http://jmcauley.ucsd.edu/data/amazon/。 数据集具有以下模式,我们将使用部分字段进行情绪分析:
reviewerID - 评论者的ID,例如,A2SUAM1J3GNN3B
asin - 产品的ID,例如,0000013714
reviewerName - 评论者的名称
有用性-评论的有用性评级,例如2/3
reviewText - 评论文本
overall - 产品评级
summary -审查摘要
unixReviewTime - 审查时间(Unix时间)
reviewTime - 审查时间(原始)
数据集具有以下JSON格式:
在这种情况下,我们将使用逻辑回归来预测正面或反面的标签,基于以下内容:
标签:
总体而言 - 产品评级4-5 = 1正面
总体而言 - 产品评级1-2 = 0否定
特征:
审查文本+评论摘要→TF-IDF特征
使用Spark ML包
Spark ML提供了一套基于数据框的统一高级API,旨在使机器学习变得简单易用。在数据框上构建ML API可以提供分区数据处理的可扩展性,并且易于使用SQL进行数据操作。
我们将使用ML 管道通过转换器传递数据以提取特征和估计器来生成模型。
转换器:转换器是一种将一个数据框转换为另一个数据框的算法。 我们将使用转换器来获取具有特征向量列的数据。
估算器:估算器是一种算法,可以适合数据框生成变压器。我们将使用估算器来训练模型,该模型可以转换输入数据以获得预测。
管道:管道将多个转换器和估算器链接在一起以指定ML工作流程。
将文件中的数据加载到数据框中
第一步是将数据加载到数据框中。 下面,我们指定数据源格式和加载到数据框的路径。 接下来,我们使用withColumn方法添加一个将审阅摘要与审阅文本相结合的列,然后删除不需要的列。
数据框架构显示模式:
该方法显示前20行或指定的行数:
摘要统计
Spark 数据框包含一些用于统计处理的内置函数。 describe()函数对所有数字列执行汇总统计和计算,并将它们作为数据框反馈。 下面,我们来分析产品评级整体:
在下面的代码中,我们过滤中性评级(= 3),然后使用Spark Bucketizer将标签0/1列添加到数据集中为正面(总评级> = 4)而不是正数(总评级<4) )评论。然后,对显示结果进行总计数。通过标签列对数据进行分组并计算每个组中的实例数量表明,正样本的数量大约是非正样本的13倍。
分层抽样
为了确保我们的模式对负样本敏感,我们可以使用分层抽样得出两个样品类型。数据框sampleBy()函数在提供要反馈的每个样本类型的分数时执行此操作。在这里,保留所有负面实例,但将负面实例采样10%,然后显示结果。
下面,数据被分成训练数据集和测试数据集:80%的数据用于训练模型,20%用于测试。
特征提取与管道
ML包需要将标签和特征向量作为列添加到输入数据框中。为了提取特征和标签,我们设置了一个管道将数据通过转换器传递。
正则表达式测试器接受一个输入文本列,并反馈一个数据框,其中包含一个附加的文本列,通过使用提供的正则模式将其拆分为一个单词数组。关键词过滤器过滤掉应该被排除的单词,因为这些单词经常出现但没有太多的含义。例如,“I”、“is”、“The”。
在下面的代码中,正则表达式测试器会将带有审查和摘要文本的列分割为一个包含单词数组的列,然后关键词过滤器会过滤该列:
正则表达式测试器和关键词过滤器的结果示例如下:
计数向量程序用于将前一步骤中的单词标记数组转换为单词标记计数向量,执行TF-IDF特征提取的TF部分。
计数向量程序的结果示例,作为输入列检查命令并添加向量化单词计数的cvcolumn,如下所示。 在cv列中:56004是TF词汇词汇的大小; 第二个数组是词语词汇中词语的位置,该词汇词汇按语料库中的术语频率排序; 第三个数组是检查命令文本中单词(TF)的计数。
下面的cv列,由计数向量程序(TF-IDF特征提取的TF一部分)创建,用于IDF输入。 IDF采用从计数向量和向下权重特征创建的特征向量,这些特征向量经常出现在文本集合中(TF-IDF特征提取的IDF部分)。 输出要素列是TF-IDF要素向量,逻辑回归函数将使用该向量。
以下示出了IDF的结果的示例,其作为输入列cv并且添加了矢量化TF-IDF的特征列。 在cv列中,56004是单词词汇的大小; 第二个数组是词语词汇中词语的位置,该词汇、按语料库中的术语频率排序; 第三个数组是检查命令文本中单词的TF-IDF。
最后一个元素是估算器,一个逻辑回归分类器,它将训练标签和特征向量并返回(转换器)模型。
下面,我们将测试器、计数向量程序、IDF和逻辑回归分类器放在管道中。 管道将多个变换器和估算器连接在一起,以指定用于训练和使用模型的ML工作流程。
训练模型
接下来,我们用弹性网络正则化训练逻辑回归模型。通过在输入特性和与这些特性关联的标记输出之间建立关联来训练模型。用pipeline.fit方法返回一个拟合的管道模型。
注意:训练模型的另一个选项是使用网格搜索调优参数,并选择最佳模型,使用带有Spark交叉验证器和帕拉姆网格生成器的k-fold交叉验证,您可以在附带的MapR电子书《从Spark 2.x开始》中了解更多。
其次,我们可以从拟合的管道模型中得到计数向量和逻辑回归模型,以便打印出文本词汇表中单词的系数权重(单词特征重要性)。
回想一下,逻辑回归生成一个公式的系数权重,该公式用于预测特征x(在本例中是一个单词)出现的概率,以最大化结果Y、1或0的概率(在本例中是正面或负面的文本情绪)。权重可以解释为:
正权重将对应于正面单词
负权重对应于负面单词
下面,我们按降序排列权重,以显示最积极的单词。结果显示,“great”、“perfect”、“easy”、“works”和“excellent”是最重要的积极词汇。
下面,我们按升序排列权重,以显示最负面的单词。结果显示,“return”、“poor”、“waste”和“useless”是最重要的负面词汇。
预测和模型评估
可以使用尚未用于任何训练的测试数据集来确定模型的性能。我们将使用管道模型转换测试,管道模型将根据管道步骤传递测试数据,通过特征提取阶段,使用逻辑回归模型进行估计,然后将标签预测返回到新的列中。
二进制分类评估器提供了一个度量标准来度量一个拟合模型对测试数据的处理效果。这个评估的默认指标是ROC曲线下的面积。该区域测量测试正确区分真阳性和假阳性的能力。随机预测值是5。值越接近1,它的预测就越好。
下面,我们将预测数据框(具有原始预测列和标签列)传递给二进制分类评估器,后者输出内容为ROC曲线下的区域。
下面,我们计算更多的指标。正面和负面预测的数据也很有用:
真正的积极因素是模型正确预测积极情绪的频率。
误报是模型错误地预测积极情绪的频率。
真实的否定表明模型正确预测负面情绪的频率。
错误的否定表示模型错误地预测负面情绪的频率。
下面,我们打印出摘要并查看数据,其中负面情绪的概率最高:
下面,我们打印出摘要并审核具有正面情绪概率最高的评论数据:
保存模型
我们现在可以将适合的管道模型保存到分布式文件存储中,以便以后在生产中使用。 这样可以在管道中保存特征提取阶段和逻辑回归模型。
保存管道模型的结果是用于元数据的JSON文件和用于模型数据的Parquet文件。 我们可以使用load命令重新加载模型; 原始和重新加载的模型是相同的:
总结
有很多很棒的工具来构建分类模型。 Apache Spark提供了一个出色的框架,用于构建可以从大量分布式数据集中提取价值的业务问题的解决方案。
机器学习算法无法完美地回答所有问题。 但是,它们确实为人类在解释结果时提供了证据,假设首先要问正确的问题。
代码
使用Apache Spark训练模型并做出自己的结论的所有数据和代码都位于GitHub中, 有关运行代码的更多信息,请参阅GitHub“README”。GitHub - caroljmcdonald/mapr-sparkml-sentiment-classification
Zeppelin浏览器:
https//www.zepl.com/viewer/github/caroljmcdonald/mapr-sparkml-sentiment- classification/blob/master/notebooks/TextClassificationSentimentAnalysis.json
张晓艺编译