sklearn数据挖掘之评论舆情分析
sklearn数据挖掘之评论舆情分析提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录sklearn数据挖掘之评论舆情分析前言一、pandas和数据清洗二、使用步骤1.引入库2.读入数据2.读入数据总结本次分享前言从数据清洗到数据舆情分析模型建立的小尝试,会写的比较详细基础。一、pandas和数据清洗示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任
sklearn数据挖掘之评论舆情分析
前言
从数据清洗到数据舆情分析模型建立的小尝试,会写的比较详细基础。爬虫部分就会另外单独写,这边主要是处理拿到了的原始数据,基于对旅店住宿的综合情况。一、pandas和数据清洗
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、使用步骤
1.引入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings #忽略警告
warnings.filterwarnings('ignore')
2.数据预处理
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/2628/1-1.csv')
print(data.head())
print(data.shape)
每列情况:order_id是主键也就是自增的索引,crawf_datatime是数据采集时间,url是数据原始链接,hotel_name是旅店名字,user_level是用户等级。user_name是用户名字。后面依次是评论内容和评分。好的接下去我们先对整体情况看一看,pandas提供的内置函数descrebe()和 info()。
data.describe()
可以发现竟然只有主键有数据,其他项的数据类型或者存在空值或者不是整数和浮点数,通过data.info()发现数据类型是object,这边我们需要对评分进行清理。
data['user_score'].unique()
array(['5.0', '4.5', '1.0', '3.0', '3.5', '4.8', '4.0', '4.3', '信息不存在',
'2.8', '3.3', '3.8', '2.0', '2.3', '1.8', '2.5', '1.3', '1.5'],
dtype=object)
unique()是以 数组形式(numpy.ndarray)返回列的所有唯一值(特征的所有唯一值)这样我们就可以看到有一个不是数字,我们直接删掉这些数据创造一个复制的数据副本。利用可视化库来看一下评分的分布。
data_clean = data[data.user_score != '信息不存在'].copy()
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.countplot(data=data_clean, x='user_score')
plt.show()
可以看到大部分评分集中在五分,接下去通过归一化和数据标注为模型做准备
归一化也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间,这边由于数据比较简单就不用包了直接/5 ,真正的公式是 = (x-min)/(max-min)
假设用户打分和用户情感极性一致,满足用户评论情感建模需求,可以对用户高于 3 分的评价标注为 1,否则为 0。这边数据可视化发现2端差异化比较严重,这边就不处理了,后续可以用如上采样/下采样/ smote 采样等等去平衡2端数据。我们设定3分以上是好的舆情,3分以下是差的舆情
data_clean['user_score_normal'] = data_clean['user_score'].apply(
lambda x: round(float(x) / 5, 3))
data_clean.head(1)
data_clean['label'] = data_clean['user_score'].apply(
lambda x: 1 if float(x) > 3 else 0)
data_clean['label'].unique()
3.数据建模
依据统计学模型假设,假设用户评论中的词语之间相互独立,用户评价中的每一个词语都是一个特征,当用户好评中常常出现某一个词语的时候,通过概率模型可以得知含有该词语的评价大概率是好评,基于此我们使用 scikit-learn 库的 MultinomialNB 对用户评论进行训练和情感预测。# 加载用户评论向量化模块
from sklearn.feature_extraction.text import CountVectorizer
# 对测试集和训练集进行划分
from sklearn.model_selection import train_test_split
import numpy as np
import jieba #中文分词库
%time data_clean['text_cut'] = data_clean['content'].apply(lambda x: " ".join(jieba.lcut(str(x))))
#对评论进行全模式分词 并以空格分割
# 调整低词频带来的影响
vectorizer = CountVectorizer(token_pattern='\[?\w+\]?', max_features=5000)
#用户评论向量化的目的就是将用户评论转化为计算机可以处理的数字信息,通过建立向量化词典对用户评论进行向量化。
vectorizer.fit_transform(data_clean['text_cut'])
#训练数据
vectorizer.vocabulary_ #查看词频信息
我们将评分和用户的评论作为一个关系来构建模型,经典8:2数据测试和训练划分。假设各个维度上的特征被分类的条件概率之间是相互独立的,所以我们用的是朴素贝叶斯模型来做推断。
x_train_, y_train_, x_test, y_test = train_test_split(
data_clean['text_cut'], data_clean['label'], test_size=0.2, random_state=1)
for data_set in [x_train_, y_train_, x_test, y_test]:
print(data_set.shape)
# 模型加载贝叶斯分类模型
from sklearn.naive_bayes import MultinomialNB
own_model = MultinomialNB()
# 模型训练
%time own_model.fit(x_train, x_test)
own_model_result = own_model.predict(y_train)
模型建立完成我们验证一下模型的准确度。
“classification_report” 函数通过传入原始的标签和预测的标签可以直接将分类器性能进行度量,利用常用的分类模型评价指标对训练好的模型进行模型评价,acc 评价被正确预测的样本占总样本的比例,Precision 是衡量模型精确率的指标,它是指模型识别出的文档数与识别的文档总数的比率,衡量的是模型的查准率。Recall 召回率也称为敏感度,它是指模型识别出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率,表示正样本在被正确划分样本中所占的比例,F 值是精确率与召回率的调和平均数。
# 打印测试报告
from sklearn import metrics
print(metrics.classification_report(y_test, own_model_result))
precision recall f1-score support
0 0.71 0.48 0.57 73
1 0.94 0.98 0.96 598
accuracy 0.92 671
macro avg 0.83 0.73 0.77 671
weighted avg 0.91 0.92 0.92 671
三.用户评论情感极性推理
基于模型的情感极性预测可以很好的对情感极性进行预测,直接输出用户评论中积极情感对应的概率值作为用户情感极性映射,预测结果根据其中的情感副词不同给出不同的情感极性判断。对照自己输入的测试数据来看,模型受到标签数据不平衡问题的影响,对积极评论识别比较好,但是对消极评论的情感极性预测不合理,后续可以继续改进。# 用户评论向量化
data_text = vectorizer.transform(data_clean['text_cut'])
# 批量对用户评论进行情感推理
%time data_clean['sa_model_score'] = [round(i[1], 5) for i in own_model.predict_proba(data_text)]
这个模型就分享到这里了
本次分享
我们学习了使用机器学习解决实际问题的方法。
我们了解到对数据预处理的一些方法。
我们熟悉了搭建情感分析的一般流程。
我们了解到测试情感分析、简单用户意见可视化的方法。
更多推荐
所有评论(0)