Python进行携程酒店评论舆情分析
第一步:分析设计
我们是对酒店进行舆情分析,所有我们的核心是酒店的评论数据;对住客的评论数据进行特征提取,通过住客对酒店的评分,对数据进行分类,并使用朴素贝叶斯算法建立数学模型
第二步:数据收集
爬取酒店的相应类型的数据,如酒店的名称,住客的评论,酒店的回复,住客的评分,酒店的综合评分等等
酒店数据:
第三步:数据处理
数据清洗(在统计分析里面至少150条以上的数据)
依据评论ID去重数据(在SQL部分处理)
select * from hotel_comment_datas group by `评论ID`
特征工程
利用特征工程获取相应评论的内容,需将文本信息转为相应的数值
(1)获取评论内容,做相应的索引(对所有的评论做处理)
import pandas as pd sql = '''select * from hotel_comment_datas group by `评论ID`''' data = pd.read_sql(sql, conn) # 去除标签列所对应的缺失值,可以使用花式索引的方式,对于数据进行相应的清洗和替换 data = data[['评论内容', '评分']].replace('none', np.NaN) data = data.dropna() # 删除评论内容和用户评分为空的数据
(2)开始分词----cut
comment = data['评论内容'] # print(comment) # (2)开始分词----cut list_word = [] # 创建空列表用来接收相应的结果 for i in comment: a = list(jieba.cut(i)) # 按照列表的方式进行相应的分词 list_word.append(' '.join(a))
(3)对于分词后的文本进行相应的特征抽取,TF-TDF特征抽取。TF表示关键词的频率,TDF表示逆文档的频率,主要用来表示每个关键字在文档的重要性
# TF-IDF 特征抽取 from sklearn.feature_extraction.text import TfidfVectorizer tf = TfidfVectorizer() # 调用TF-TDF分词算法,将文本转化为频率 data1 = tf.fit_transform(list_word) # 先拟合,再转换,得出一个稀疏矩阵
第四步:数据分析
对因变量(住客评分)进行相应的分类
分类代码
bq = [] for i in data['评分']: # 初始的分类级别 if float(i) <= 0: bq.append(0) elif 0 < float(i) <= 1: bq.append(1) elif 1 < float(i) <= 2: bq.append(2) elif 2 < float(i) <= 3: bq.append(3) elif 3 < float(i) <= 4: bq.append(4) else: bq.append(5)
划分数据集
(1)找到相对应的特征(自变量)x,标签y(因变量)
x = data2 y = bq
(2)划分相应的训练集和测试集,其中训练集为80%,测试集为20%
# 划分数据集 from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
(3)对数据进行标准化(将自变量的数据进行相应的标准化处理,可以使得某一个特征不会对总的结果产生较大影响)
# 对数据进行标准化处理 from sklearn.preprocessing import StandardScaler ss = StandardScaler() # print(ss.fit_transform(x_train)) # 标准化后,有的值为正,有的值为负 x_train = ss.fit_transform(x_train) x_test = ss.fit_transform(x_test)
数学建模-朴素贝叶斯分类算法
利用贝叶斯分类的目的:依据对应的评论内容给这个结果进行预测打分和客户实际打分的区别
- 预测打分可以将客户评价分级,(分级的结果acc准确率要求比较高)
- 进一步:分级后,将不同等级的用户,单独提取出来,按照预测的打分结果,产生新的一列
- 按照预测评分结果,按照预测结果的不同等级,将整个数据划分为三个级别,需进一步考虑
- 对于不同级别的顾客,可以考虑做相应的评价画像
- 同样可以考虑做顾客画像
代码实现
from sklearn.naive_bayes import GaussianNB # 用于处理有正有负的数据 nb = GaussianNB() # 因为稀疏矩阵标准化后的值很可能是负值 nb.fit(x_train, y_train) # 拟合相应的训练集 x_predict = nb.predict(x_test) # 放入相应的测试集进行分类 t_predict = nb.predict(x_train) # 放入相应的训练集进行分类 score_1 = nb.score(x_train, y_train) # 使用对应的训练集测试一下评估的ACC score_2 = nb.score(x_test, y_test) print(score_1, score_2)
模型的准确性
模型调优
增加相应的特征(如评论的推荐数)
这个特征,所有评论特征数,我们可以通过筛选所有评论特征数来提高我们的数据质量(数据的可靠性),进而提高我们的数学模型的ACC(准确率)
# 在sql部分重新筛选所有评论推荐数大于1的数据 sql = '''select * from hotel_comment_datas where `所有评论推荐数` >1 group by `评论ID`'''
与未使用所有评论推荐数的特征的模型准确率,相比,训练集的ACC提高了将近7个百分点,测试集的ACC降低了6个百分点
可以考虑分类级别过多
我们是对酒店进行分类,一般我们对酒店的评价是差、一般、好;但是我们之前是划分了5个等级,我们考虑一下是否分类过度,导致模型ACC过低?尝试降低分类数
缩小分类级别 for i in data['评分']: if float(i) <= 2: bq.append(0) elif 2 < float(i) <= 4: bq.append(1) else: bq.append(2)
相比与上图的数学模型ACC而言,本次的训练集数学模型ACC提高了近1个百分点 ,测试集数学模型ACC基本一致
修改训练集(70%)与测试集(30%)的占比
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
相比上图的数学模型ACC而言,本次训练集的数学模型ACC提高近2个百分点,测试集的数学模型ACC提高近0.8个百分点
我们发现我们建立的数学模型的ACC依旧不是很理想,所有我们得进一步考虑提高模型的ACC。那么问题来了,我们如何再提高模型的ACC?
当然是再次把目光回归到数据本身,提高提取新的特征来筛选高质量的数据
增加特征,重新筛选数据
select * from hotel_comment_datas where `所有评论推荐数` >1 and `城市足迹数` >1 group by `评论ID`
此时我们发现,我们的数学模型的ACC非常好
第五步:数据可视化
第六步:报告撰写