使用NLP检测不良客户评论
介绍
情感分析是自然语言处理(NLP)技术的一部分,其中包括提取与某些原始文本相关的情绪。这通常用于社交媒体帖子和客户评论,以便自动了解哪些些用户是积极的哪些是消极的以及为什么。本研究的目的是展示如何使用python执行情感分析。以下是我们将使用的一些主要库:
- NLTK:NLP技术最著名的python模块
- Gensim:主题建模和向量空间建模工具包
Gensim模块
- Scikit-learn:最常用的python机器学习库
Scikit-learn模块
我们将在这里使用一些酒店评论数据。每个观察包括一个酒店的一个客户评论。每个客户评论都包含客户在酒店体验的文本反馈和总体评级。
对于每个文本评论,我们想要预测它是对应于良好评论(客户是否满意)还是对应于不良评论(客户不满意)。评论总体评分可以从2.5 / 10到10/10。为了简化问题,我们将这些分为两类:
- 差评的整体评分<5
- 好的评论总体评分> = 5
这里的选择是能够仅使用来自评论的原始文本数据来预测该信息。
加载数据
我们首先加载原始数据。每篇文本评论都分为正面部分和负面部分。我们将它们组合在一起,以便仅从原始文本数据开始,而不是其他信息。
初始数据集
样本数据
我们对数据进行采样以加快计算速度。
干净的数据
如果用户未留下任何负面反馈评论,则在我们的数据中显示为“无否定”。对于具有默认值“No Positive”的正面评论,这是相同的。我们必须从我们的文本中删除这些部分。
下一步是使用各种操作清理文本数据:
为了清理文本数据,我们调用自定义的'clean_text'函数来执行多个转换:
- 降低文字
- 标记文本并删除标点符号
- 删除包含数字的无用词
- 删除无用的词。
- 词性(POS)标记:使用WordNet词汇数据库为每个单词分配标签以定义它是否对应于名词,动词等
- 文本解释:将每个单词转换为根形式(例如Room - >room,Sleep - >sleep)
现在我们已经清理了数据,我们可以为模型化部分做一些特征工程。
特征工程
我们首先添加情绪分析功能,因为我们可以猜测客户评论与他们在酒店住宿的感受密切相关。我们使用Vader,它是为情绪分析而设计的NLTK模块的一部分。维达使用单词词典来查找哪些是正面或负面的。它还考虑了句子的上下文来确定情绪分数。对于每个文本,Vader返回4个值:
- 中立分数
- 积极性得分
- 消极性得分
- 总分,总结了以前的分数
我们将这4个值集成为数据集中的特征。
接下来,我们为每个文本添加一些简单的指标:
- 文本中的字符数
- 文字中的单词数量
下一步是为每个评论提取矢量表示。模块Gensim通过使用它们出现的上下文(Word2Vec)创建语料库中每个单词的数字向量表示。这是使用浅层神经网络进行的。有趣的是,类似的单词将具有相似的表示向量。
每个文本也可以使用单词向量(Doc2Vec)转换为数字向量。相同的文本也将具有相似的表示,这就是我们可以将这些向量用作训练特征的原因。
我们首先必须通过输入我们的文本数据来训练Doc2Vec模型。通过在我们的评论中应用此模型,我们可以获得这些表示向量。
最后,我们为每个单词和每个文档添加TF-IDF(术语频率 - 反向文档频率)值。
但为什么不简单地计算每个单词出现在每个文档中的次数?这种方法的问题在于它没有考虑文本中单词的相对重要性。几乎每篇文章中都出现的一个词不太可能为分析带来有用的信息。相反,罕见的词可能有更多的含义。
TF-IDF指标解决了这个问题:
- TF计算单词在文本中出现的经典次数
- IDF计算这个单词的相对重要性,这取决于可以找到单词的文本数量
我们为至少10个不同文本中出现的每个单词添加TF-IDF列,以过滤其中的一些并减小最终输出的大小。
探索性数据分析
0 0.956761 1 0.043239 Name: is_bad_review, dtype: float64
我们的数据集非常不平衡,因为我们的评论中只有不到5%被视为负面评价。此信息对于建模部分非常有用。
现在让我们打印一些wordcloud来瞥见我们的评论中有哪些单词:
来自客户评论的WordCloud
大多数的话确实与酒店有关:房间,员工,早餐等。有些话与酒店住宿的客户体验更相关:完美,喜爱,昂贵,不喜欢等。
最积极的情绪评论
最积极的评论确实对应于一些好的反馈。
最负面的情绪评论
在最负面的评论中可以找到一些错误:Vader有时会将“no”或“nothing”解释为否定词,而有时候他们会说酒店没有问题。但是,大多数评论确实很糟糕。
感情分发
上图显示了好评和差评中评论情绪的分布。我们可以看到,Vader对大多数人认为非常积极的好评。相反,糟糕的评论倾向于降低复合情绪评分。
这向我们展示了先前计算的情感特征在我们的建模部分中将非常重要。
建模is_bad_review
我们首先选择我们想要使用哪些功能来训练我们的模型。然后我们将数据分成两部分:
- 一个训练我们的模型
- 一个评估其表现
接下来我们将使用随机森林(RF)分类器进行预测。
最重要的特征确实来自之前的情绪分析。文本的矢量表示在我们的训练中也很重要。有些词似乎也有相当重要的意义。
ROC曲线
ROC(接收器运行特性)曲线通常是一个很好的图表,用于总结分类器的质量。曲线越高于对角线基线,预测越好。尽管AUC ROC非常好,但我们不应该使用ROC曲线来评估模型的质量。
为什么?首先让我们提醒假阳性率公式,它对应于ROC曲线的x轴:FPR(假阳性率)= #False Positives /#Negatives。
在这里,#Negatives对应于我们的好评数量,这是非常高的,因为我们的数据集是不平衡的。这意味着即使有一些误报,我们的FPR也会保持很低的水平。我们的模型将能够做出大量假阳性预测,并且仍然具有较低的假阳性率,同时增加真阳性率,从而人为地增加AUC ROC度量。
PR曲线
在这种不平衡情况下,更好的指标是AUC PR(曲线精度回收区域),或者也称为AP(平均精度)。
我们可以看到,当我们增加回报忆时,精度会降低。这告诉我们,我们必须选择适合我们需求的预测门槛。如果我们的目标是高回报率,我们应该设置一个低预测阈值,这将允许我们检测正类的大部分观测值,但精度较低。相反,如果我们想要对我们的预测非常有信心但是不介意没有找到所有积极的观察结果,我们应该设置一个高阶段,这将使我们获得高精度和低召回率。
为了知道我们的模型是否比另一个分类器表现更好,我们可以简单地使用AP度量。为了评估模型的质量,我们可以将其与简单的决策基线进行比较。让我们将随机分类器作为基线,这将预测标签的一半时间1和一半时间0。
这样的分类器将具有4.3%的精度,其对应于正观察的比例。对于每个召回值,精度将保持不变,这将导致我们的AP为0.043。我们模型的AP约为0.35,比随机方法的AP高8倍以上。这意味着我们的模型具有良好的预测能力。
结论
完全可以仅使用原始文本作为进行预测的输入。最重要的是能够从这个原始数据源中提取相关功能。这种数据通常可以作为数据科学项目的良好补充来源,以便提取更多的学习功能并提高模型的预测能力。