摘要
近年来外卖行业发展迅猛,多家外卖平台竞争激烈,提升用户体验对维持用户体量至关重要,因此平台需要着眼于用户评价,了解用户需求,分析其内容并做出改善。本报告基于美团外卖用户评价数据,对中文文本执行了情感分析、词频分析、文本聚类等方面的实际操作,旨在了解用户对于外卖服务最关心的方面,如菜品质量、送餐服务水平等,进而对外卖平台提出一定改善意见。实验过程由Python实现,论文主要内容包括:方法及模型的简要介绍、实证分析(包括实验过程及结果分析)、结论及感受等。
关键词:外卖;用户评价;自然语言处理;中文文本分析
ABSTRACT
We are now living in an era in which the takeout industry is developing rapidly, and a number of takeout platforms are competing fiercely. Therefore, improving the user experience is necessary to maintain the number of users. As a result, the platform needs to focus on users’ review/evaluation, investigate their needs, analyze their contents and make improvements. Based on the review data of meituan takeout users, this report carries out the practical operation of sentiment analysis, word frequency analysis and text clustering on Chinese text, aiming to understand the most concerned aspects of takeout service, such as the quality of dishes and the level of meal delivery service, and then puts forward some suggestions for improving the takeout service. All the program is written in Python. The main contents of this paper include: a brief introduction of the methods and models, empirical analysis (including the experimental process and result analysis), conclusions and feelings, etc.
Key words:Takeout, User Review, NLP, Chinese Text Analysis
1 研究背景及意义
1.1 研究背景
在互联网技术的支持下,多家外卖平台应运而生,众多餐饮商户也加入了提供外卖服务的行列中。然而,用户对外卖餐品或是配送服务褒贬不一的现象频发,差评甚至会在一定程度上影响商户的后续客源,导致全店盈利受损;或是致使外卖骑手信誉受损,受到平台的大额处罚。因此研究用户评价,探究影响评价的因素,进而改善服务以吸引更多的消费者是很有必要的。
1.2 数据介绍
本次文本研究采用来自美团外卖平台的用户评价,收集截至2018年左右;数据共计约12000条,其中正向评价约4000条,负向评价约8000条;包含两个特征,分别是评价类型“label”及评价文本“review”;数据来源为GitHub。
1.3 研究意义
通过情感分析、词频分析等方法,了解外卖用户的诉求,初步确定影响用户体验及评价的主要因素,以此为外卖平台、餐饮商户、骑手拟定改善方案,提高外卖服务水平及质量。
.
2 方法及模型简述
2.1 SnowNLP
snownlp是基于TextBlob的启发编写成的针对中文文本内容处理的库,且不以NLTK为基础,所有算法独立实现。
在情感分析部分使用到SnowNLP作为分析器。
输入的是待解析的文本,如在本论文中即为原数据中包含的评价文本;返回的是SnowNLP专用的字段,包含sentiments属性,即为文本的情感评分,接近1即为正向评价,接近0即为负向。
使用SnowNLP进行情感分析的主要思路为:使用SnowNLP解析原始评价文本;为原始数据中的每条评价计算出情感评分并转换为0-1型,与数据自带的评价类型变量“label”做对比,得到情感分析准确率。详见实证分析3.3部分。
2.2 SVM
SVM即支持向量机,广泛应用于机器学习领域中,是一种按监督学习方式对数据进行二元分类的广义线性分类器。SVM的核心思想是找到各类样本点到超平面的距离最远,即找到最大间隔超平面。
本论文中使用SVM,参考课程资料中的内容执行了基于SVM的情感分析,最终结果良好,且准确率高于SnowNLP方法所得结果,详见3.4部分。
2.3 DBSCAN
DBSCAN是一个基于密度的聚类算法,将簇定义为密度相连的点的最大集合,即每个簇都是足够高密度的区域;其基本思想是对于一个类中的每个对象,在给定半径的区域中必须包含一定数量以上的对象,一个类能够被其中任一核心对象确定;在实际工作中,DBSCAN反复寻找核心对象直接密度可达的对象,可能会有一些密度可达簇在这个过程中合并,当没有新的对象可以被添加到任何簇中时,即视为聚类结束。
在本论文中,执行了基于DBSCAN 的中文文本聚类,详见3.6部分。
.
3 实证分析
3.1 数据准备
读取原数据“waimai_10k.csv”,观察数据规模为11987行,2列,每行包含:“label”评价类型,值为1即为好评,值为0即为差评;“review”用户评价,是由汉字及阿拉伯数字组成的评价文本。
import pandas as pd
data = pd.read_csv('waimai_10k.csv')
共执行以下准备工作:
1、将review列转换为字符串类型,便于后续分词操作;
#类型转换为字符串,便于分词操作
data['review'] = data['review'].astype('str')
2、查看原数据中是否有空值,使用isnull()函数的结果为0,即无空值;
#查看是否有空值
import numpy as np
np.sum(pd.isnull(data))#pd.isnull用来判断是否有空值
3、将review列定义为reviews,lable列定义为sentiments,便于后续使用;
#定义评价和情感
reviews = np.array(data['review'])
sentiments = np.array(data['label'])
row,col = data.shape
4、绘制饼状图,观察正向和负向的频数及占比如下:
#查看正向和负向的评价分别有多少
data['label'].value_counts()
#绘制饼状图,观察到正向和负向的占比
import numpy as np
import matplotlib.pyplot as plt
#定义一个饼
plt.pie([4000,7987],labels = ('正向评价','负向评价'))
#记得要用中文字体
#查看中文字体的代码为:
#a=sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])
#for i in a:
# print(i)
#我的mac系统里只有pingfang hk这一种字体是中文的,就用它了
plt.rcParams['font.sans-serif'] = ['PingFang HK']
#画图
plt.show()
3.2 分词
#停用词
stopwords = pd.read_csv("StopWords.txt",header=None,names=["StopWords"])
#多加一列用于存储分词
data['cutwords'] = "cutwords"
#用jieba分词
import jieba
for ii in np.arange(row):
cutwords = list(jieba.cut(data.review[ii],cut_all=True))
cutwords = pd.Series(cutwords)[pd.Series(cutwords).apply(len)>1]
cutwords = cutwords[~cutwords.isin(stopwords)]
data.cutwords[ii] = str(cutwords.values)
使用jieba进行中文分词,并以“StopWords.txt”文件作为停用词,将分析结果作为新的一列加入到数据中,结果如下图。
3.3 基于SnowNLP的情感分析
3.3.1 方法步骤
1、在数据中多加2个变量(列)备用,用于储存稍后得到的评分,分别命名为“number”和“number2”;
2、使用SnowNLP对评价文本做分析,返回SnowNLP字段“s”;
3、读取s中的sentiments属性,即为每条评价的情感评分,将其储存在number变量中
#使用SnowNLP
from snownlp import SnowNLP
#多加一列,储存评分
data['number'] = "number"
#使用SnowNLP分析中文文本的情感,由内含的sentiments得到评分
#评分范围是0-1,接近0是负向,接近1是正向
for i in np.arange(row):
s = SnowNLP(reviews[i])
number = s.sentiments
data.number[i] = number
4、将number转化为0-1型数据,储存在number2变量中;
#观察到number值为小数,为了将其和sentiments做对比,转化为0-1型数据
#为避免数据损坏,此处复制一列number2,同时也可与number做对比
data['number2'] = data['number'].copy(