摘要

近年来外卖行业发展迅猛,多家外卖平台竞争激烈,提升用户体验对维持用户体量至关重要,因此平台需要着眼于用户评价,了解用户需求,分析其内容并做出改善。本报告基于美团外卖用户评价数据,对中文文本执行了情感分析、词频分析、文本聚类等方面的实际操作,旨在了解用户对于外卖服务最关心的方面,如菜品质量、送餐服务水平等,进而对外卖平台提出一定改善意见。实验过程由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.sentimentsdata.number[i] = number


4、将number转化为0-1型数据,储存在number2变量中;

#观察到number值为小数,为了将其和sentiments做对比,转化为0-1型数据
#为避免数据损坏,此处复制一列number2,同时也可与number做对比
data['number2'] = data['number'].copy()
#转为0-1型,输出结果
data['number2'] = data['number2'].apply(lambda x: 0 if x<0.5 else 1)
data

5、计算出number2和label的差值并进行计数,得到频数结果如下:

#计算出number2(转为0-1后的情感评分)与原本sentiments的差值
#如果差值为0,说明评分结果正确;如果差值为-1或1,说明不正确
chazhi = data['label'] - data['number2']#对差值的情况进行计数,得到差值为0的情况有9441个
chazhi.value_counts()

0 9441
-1 1469
1 1077

6、用差值为0的频数除以总样本量,得到准确率为0.7876032368399。

#用差值为0的频数(即分析正确的频数)除以总样本量,得到准确率
print('基于SnowNLP分析情感的准确率为:',9441/11987)

3.3.2 方法分析
在使用SnowNLP分析文本阶段,观察到其直接输出的情感评分均为小数,其范围为0至1之间,越接近0的是负向情感,越接近1的是正向情感;

SnowNLP输出的情感评分与数据自带的label存在一定偏差,甚至有些评价的类型完全相反(如最后一行数据,label值为0,即为负向评价,而number值为0.980709,却认定他为正向评价)。因此我们需要计算SnowNLP情感分析的准确率,以此判断此方法的可行性。

由于评分是小数,很难和label的值做比较,所以我想到了可以将其转化为0-1型;并且此处多设置了一个变量来存储转化后的评分,其目的是保留原输出情感评分备用,防止数据损坏,且number2可以和number做对比。

将0-1型评价结果number与label做差值的目的是获得一个评价结果是否正确的标准。在该标准下,若差值为0,即为评分结果正确;如果差值为-1或1,则说明评分结果不正确。

随后,用差值为0的频数除以总样本数得到评价正确的占比,即得到了此方法的准确率。最终得到基于SnowNLP分析情感的准确率为78.76%,从数值上来看,该方法还有很高程度的提升空间,但SnowNLP提供的计算情感评分的方法及参数是既定的,我们在现有的样本基础下很难再提升该方法的效果。

3.3.3 情感评分分析
除了得到该方法的准确率,还应观测情感评分的实际效果。
对SnowNLP输出的情感评分进行计数(此处采取转化为0-1型的结果),得到频数及占比如下:

与原数据的情感类型分布做对比,该方法得到的正向评价增多300余条,相应地,负向评价减少300余条;结合模型的准确率可知,除此之外还有相当一部分的正向评价被误判为负向,负向评价被误判为正向。

#SnowNLP情感评分分析
#箱线图
box_plot = data['number'].plot.box()
plt.show() # 观察相关指标
print(data['number2'].value_counts())
LSTAT_q1 = data['number'].quantile(.25)
LSTAT_q3 = data['number'].quantile(.75)
LSTAT_iqr = LSTAT_q3-LSTAT_q1
print("中位数(Median):%f" % data['number'].quantile(.5))
print("下四分位数(Q1):%f" % LSTAT_q1)
print("上四分位数(Q3):%f" % LSTAT_q3)
print("四分位差(IQR):%f" % LSTAT_iqr)
print("最小值(Min):%f" % data['number'].min())
print("最大值(Max):%f" % data['number'].max())
#print("下限值:%f" % (LSTAT_q1-1.5*LSTAT_iqr))
#print("上限值:%f" % (LSTAT_q3+1.5*LSTAT_iqr))

绘制情感评分的箱线图,并得出相关指标,结果如下:

此处的最值是使用min()和max()函数读取的,但从数值上来看,出现了值为0和1的极端情况,即文本经过SnowNLP的分析,情感处于最极端处。因此我将dataframe储存到新的csv文件中,用Excel打开,对数据升序重新排序,观察极端值对应的文本。

首先观察情感评分为最小值0的评价。以其中第八条为例,其序号为10920,label、number、number2值均为0,review变量的文本如下:

从来没有这么糟糕的订餐经历!中午12:29下的单,12:32收到确认的短信,至此一直到两个小时以后无人送餐无人搭理,无奈下致电商家,无人接听,致电百度外卖客服,告知会尽快联系商家给我回电,一分钟后商家用手机回过来以后,态度非常轻蔑,一句“这不是网络有问题嘛”就完事了,最后15:00送餐的到了,还不愿意送上楼,我下楼以后对方直接一指旁边桌子上的塑料袋嘴里就哼了一个字“那”,转身就走了!经过了这一次,我算是明白了,以后订餐绝对不先在网上付钱了,打死也不在这家店订餐,想在这订餐的朋友,如果你能忍住两个多小时肚子饿,那你就订吧!利于减肥!

文本中出现了“糟糕”、“无人搭理”、“轻蔑”等词汇,因此我判断该评价表达的情绪很激烈,依照SnowNLP的算法,多个负面词汇叠加导致出现了情感评分为0的极端情况。
随后观察情感评分为最大值1的评价。但实际情况是最大值并非为1,取值为0.999999981169322,我判断是因为过于趋近1导致max()函数取整为1。

该行对应序号为161,label、number2值均为1,review变量的文本如下:

一如既往的又快又好!每周都会在百度外卖买快乐柠檬家奶茶,送餐快,奶茶好喝,棒棒哒,开心~

同样地,观察文本中的内容及词汇,我认为SnowNLP输出这样的结果是可以理解的;并且情感评分也仅是趋近于1,并非过于极端,因此效果尚可。

3.4 基于SVM的情感分析
3.4.1 方法步骤

1、构建训练集及测试集;

#构建测试集训练集
arr = np.arange(row)
np.random.shuffle(arr)
train_reviews = data['cutwords'][arr[:6000]]
train_sentiments = sentiments[arr[:6000]]
test_reviews = data['cutwords'][arr[5987:]]
test_sentiments = sentiments[arr[5987:]]

2、提取特征,在训练集构建特征,并转换测试集;

#特征提取
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.model_selection import train_test_split
train_reviews, test_reviews, train_sentiments, test_sentiments = train_test_split(data.cutwords, sentiments, test_size=0.20, random_state=2);#在训练集构建BOW
cv = CountVectorizer(binary=False, min_df=0.0, max_df=1.0, ngram_range=(1,2))
cv_train_features = cv.fit_transform(train_reviews)#在训练集构建TFIDF
tv = TfidfVectorizer(use_idf=True, min_df=0.0, max_df=1.0, ngram_range=(1,2),sublinear_tf=True)
tv_train_features = tv.fit_transform(train_reviews)#将测试集转换为特征
cv_test_features = cv.transform(test_reviews)
tv_test_features = tv.transform(test_reviews)

3、训练模型并进行预测;

#训练模型及预测
from sklearn.linear_model import SGDClassifiersvm = SGDClassifier(loss='hinge', max_iter=100)svm.fit(cv_train_features,train_sentiments)
cv_predicted_sentiments = svm.predict(cv_test_features)  #预测svm.fit(tv_train_features,train_sentiments)
tv_predicted_sentiments = svm.predict(tv_test_features)  #预测

4、生成混淆矩阵函数,得到测试集预测的准确率;

#性能评估
from sklearn.metrics import confusion_matrix
#生成混淆矩阵函数
cv_confusion = confusion_matrix(test_sentiments, cv_predicted_sentiments )
tv_confusion = confusion_matrix(test_sentiments, tv_predicted_sentiments )
print('词袋特征混淆矩阵:\n', cv_confusion)
print('TFIDF特征混淆矩阵:\n', tv_confusion)
print('词袋特征测试集预测准确率:', (cv_confusion[0,0]+cv_confusion[1,1])/cv_confusion.sum())
print('TFIDF特征测试集预测准确率:', (tv_confusion[0,0]+tv_confusion[1,1])/tv_confusion.sum())

3.4.2 方法及结果分析
由于前文中直接使用SnowNLP做情感分析的准确率还有待提高,因此此处改用SVM的方法进行尝试。SVM方法参考本课程中的情感分析章节内容进行,且过程及结果良好,因此不再做过多赘述。

此处训练集选取了数据中的前6000行,测试集则为数据的后6000行,得到词袋特征测试集预测准确率为86.41%,TFIDF准确率为87.78%,从数值上来看,相比于基于SnowNLP分析情感的准确率(78.76%)的确有极大的提升。

plt.figure(figsize=(5, 5))
ax = plt.gca()
plt.matshow(cv_confusion, fignum=1,cmap=plt.cm.Blues)
plt.colorbar()
plt.figure(figsize=(5, 5))
ax = plt.gca()
plt.matshow(tv_confusion, fignum=1,cmap=plt.cm.Greens)
plt.colorbar()

我们还可以对混淆矩阵进行数据可视化处理,结果如下两图。

此处,训练集及测试集在选择上可能会存在一定局限性,因此我们重新选取训练集、测试集,重复SVM过程,验证该方法是否真正可行。结果为:词袋特征测试集预测准确率84.65%,TFIDF特征测试集预测准确率86.12%,均仍保持在较高的水准。所以,使用SVM执行情感分析的效果良好。

#更改测试集、训练集
test_reviews = data['cutwords'][arr[:6000]]
test_sentiments = sentiments[arr[:6000]]
train_reviews = data['cutwords'][arr[5987:]]
train_sentiments = sentiments[arr[5987:]]
cv_train_features = cv.fit_transform(train_reviews)
tv_train_features = tv.fit_transform(train_reviews)
cv_test_features = cv.transform(test_reviews)
tv_test_features = tv.transform(test_reviews)
svm.fit(cv_train_features,train_sentiments)
cv_predicted_sentiments = svm.predict(cv_test_features)
svm.fit(tv_train_features,train_sentiments)
tv_predicted_sentiments = svm.predict(tv_test_features)
cv_confusion = confusion_matrix(test_sentiments, cv_predicted_sentiments )
tv_confusion = confusion_matrix(test_sentiments, tv_predicted_sentiments )
print('词袋特征测试集预测准确率:', (cv_confusion[0,0]+cv_confusion[1,1])/cv_confusion.sum())
print('TFIDF特征测试集预测准确率:', (tv_confusion[0,0]+tv_confusion[1,1])/tv_confusion.sum())

3.5 词频分析
3.5.1 方法步骤

1、将原始数据中的所有评价文本拼接在一起,得到拼接后的长文本;

#因为之前的分词结果不适用,所以重新分一次
#先把所有评价文本拼在一起
pin = '\n'.join(data['review'].tolist())

2、对长文本用jieba重新分词,并筛掉长度小于2的词汇;

#用拼接结果pin再分词
cutwords2 = pd.Series(list(jieba.cut(pin)))#筛掉2以下长度的词汇
cutwords3 = cutwords2[cutwords2.str.len()>1]

3、查看分词结果的频数,观察其中靠前位置的词汇;
4、设置一个筛选工具,用于筛掉分词结果中的无意义或干扰词汇;

#设置一个筛选工具,筛掉无意义或干扰词汇
filtering = ['没有', '一个', '外卖', '一点', '东西', '不会', '怎么', '不是', '两个', '结果', '已经', '感觉', '就是', '特别', '而且', '什么', '\n', '\t\n', '有点', '非常', '这么', '知道', '超级', '真的', '不要', '但是', '可以', '还是', '一次', '时候','不能', '这个', '你们', '一样', '这次', '今天', '根本', '真是', '不过', '一份', '实在', '12', '11', '那么']

5、去除上述待筛掉的词汇,得到有效词汇列表;

#用分词结果cutwords3去掉待筛选的词汇,得到有效词汇cutwords4
cutwords4 = cutwords3[~cutwords3.str.contains('|'.join(filtering))]

6、读出有效词汇中的前50位,观察其特征;

#读出有效词汇中前50位
top50 = cutwords4.value_counts()[:50]
top50

7、读出有效词汇中的前100位,并转换为适用于词云图的数据类型;

#读出有效词汇中前100位
top100 = cutwords4.value_counts()[:100]#用有效词汇前100位设置适配于词云图的数据,并转换数据类型
data_for_wordcloud = [(x, y) for x, y in zip(top100.index.tolist(), top100.tolist())]
data_for_wordcloud = str(data_for_wordcloud)

8、绘制词云图。

from wordcloud import WordCloud
wc = WordCloud(       background_color='white',  # 设置背景色mode = 'RGBA',  # 默认为“RGB”width = 2000,  # 设置背景宽,默认为400像素height = 1200,  # 设置背景高,默认为200像素max_font_size=300,  # 最大字体min_font_size=5,  # 最小字体font_path='songti.ttc',  # 由于要显示中文,需要设置字体,否则会出现乱码max_words = 200,  # 最大词汇个数colormap='Greens'  # 指定词云色系,默认随机分配颜色)wc.generate(data_for_wordcloud)
wc.to_file("meituan.png")

3.5.2 方法及结果分析
先前3.2的分词结果是由若干个list构成,无法精确到词分析词频,因此此处需要重新进行适用于词频分析的分词。将文本全部拼接,再分词后的结果是214017行数据,每行仅有一个词汇;筛掉长度为1的词汇,剩余如下88355行。

随后便可对上述结果进行计数,得到词频分布。结果如下:

在本报告中,我进行词频分析的主要目的是要探究用户评价中最常出现的内容,即用户最注重的方面。因此有一些词汇在这个条件下可以被视作是没有意义的,如“一个”、“就是”等量词或副词是可以忽略的;“没有”也很难判断用户是针对哪个方面而写下的评论,像“菜品没有让我失望”和“没有按我的要求送达”就是完全不同的方向及情感;而“外卖”这样出现了652词的高频词汇与背景完全一致,对其做分析也无实义。于是,我需要对词频分析的结果做出筛选,去掉上述高频词汇中无意义的部分;低频词汇中当然也存在诸多无意义内容,但对研究效果的整体影响不大,且全部去除的操作难度大,因此可忽略不计。基于上述分析结果,得到筛选后新的词频分布如下:

观察这些有效高频词汇,如“味道”、“好吃”、“难吃”等代表着该条评价涉及到对菜品的评价,“送餐”、“送到”、“速度”、“太慢”等是对外卖送餐服务的评价,而“不错”、“一般”等既可能是在说菜品,也可能是在说送餐,需要具体根据文本内容再做进一步判断。

对有效词汇的前50位手动进行简单的分类及累加,得到结果如下。

其中,关于送餐服务的提及次数接近半数,远超其他方面的频次。

基于这个数据,我认为用户在使用外卖平台时最关心的是送餐服务,包括骑手的送达速度、服务态度;其次是菜品质量,通常会点评“好吃”或“不好吃”等;同时也有一些用户会表达自己的意愿,如“下次还会买这家”等等。
我对这个结果的理解是:用户在订餐时已经可以看到先前其他用户同一家商户进行消费行为时对菜品的点评及评分,结合自己的喜好选择要购买的商家及菜品,因而对菜品的“踩雷”情况较少;但负责送餐服务的骑手是在下单后才由系统分配或骑手接单,用户在下单前对骑手的情况是未知的,因而在骑手服务过后,用户会更愿意对这个“未知数”做出评价,夸赞或抱怨的情况均会出现。所以该数据中,用户在评价时提及送餐服务的次数占比最高。

因此,外卖平台提升用户体验的方法应从送餐服务的角度切入,针对性地完善用户对于骑手的了解和选择上,如被用户A打出过好评的骑手B,系统可在用户A再次购买外卖时优先安排骑手B接单;被用户A打出过差评的骑手C,系统尽可能避免其再次为用户A送餐,以减少用户A产生不良情绪,维持用户A的粘性等。

3.6 基于DBSCAN的文本聚类
3.6.1 方法步骤

1、对3.2中分词结果cutwords使用TfidfVectorizer提取稀疏文本特征;

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(max_df=0.2, max_features=400,min_df=1,ngram_range=(1, 2),use_idf=True)from sklearn.decomposition import TruncatedSVD
from sklearn.preprocessing import Normalizer
from sklearn.pipeline import make_pipeline
svd = TruncatedSVD(200)
normalizer = Normalizer(copy=False)
lsa = make_pipeline(svd, normalizer)

2、对稀疏文本特征使用LSA降维;

#提取稀疏文本特征,并用LSA降维
tezheng = vectorizer.fit_transform(data['cutwords'])
X = lsa.fit_transform(tezheng)

3、执行完上述准备工作后,使用DBSACN做聚类;

#用DBSCAN聚类
from sklearn.cluster import DBSCAN
db = DBSCAN().fit(X)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True

4、在数据中多加1个变量,命名为“cluster”,储存聚类得到的标签;

#多加一列,储存聚类标签
data['cluster'] = "cluster"
data['cluster'] = db.labels_

5、计算并输出聚类簇群数量(此处为218);

#计算并输出聚类数量
n_clusters_ = len(set(db.labels_)) - (1 if -1 in db.labels_ else 0)
n_clusters_

6、对聚类结果进行可视化处理,设置颜色等相关参数,绘制聚类气泡图。

#设置颜色
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, 200)]#设置图像相关参数并绘制聚类结果
for k, col in zip(db.labels_, colors):class_member_mask = (db.labels_ == k)xy = X[class_member_mask & core_samples_mask]plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),markeredgecolor='k', markersize=19)


3.6.2 聚类结果分析
在前面得到的218个聚类簇群中任意挑选一个,具体观测该簇群,以了解聚类情况。此处选择的是编号为48的簇群,命名为db48并输出查看。

#具体查看某一簇群的情况,了解聚类情况,这里查看编号48的簇群
db48 = data[data['cluster'] == 48]


该簇群共有11条评价。我们统计该簇群的词频,得到结果如下:

#查看48簇的词频
pin48 = '\n'.join(db48['review'].tolist())
pin48fc = pd.Series(list(jieba.cut(pin48)))
pin48fc = pin48fc[pin48fc.str.len()>1]
pin48fc.value_counts()



由上述词频分布可知,该簇群中的评价100%涉及到“小哥”、“外卖”这两个关键词,结合文本内容也不难看出这11条评价全部涉及到“外卖小哥”这一主题,其中更不乏“大雾霾,外卖小哥记得带口罩哦!”这样令人暖心的内容。同时还可以输出簇群db48的词云图,同样可以观察到外卖小哥是核心内容。

#查看48簇群的词云图
db48wc = [(x, y) for x, y in zip(pin48fc.index.tolist(), pin48fc.tolist())]
db48wc = str(db48wc)
from wordcloud import WordCloud
wc2 = WordCloud(background_color='lightyellow',mode = 'RGBA',width = 300,height = 300,max_font_size=300,min_font_size=3,font_path='songti.ttc',max_words = 200,colormap='Reds')
wc2.generate(db48wc)
wc2.to_file("db48.png")


因此我判断这一簇群的聚类标准是:文本内容与外卖小哥高度相关。
我们还可以输出另一个簇群,同样可以感受到这样的聚类特点。

#再看一个簇群123
data[data['cluster'] == 123].head(14)


至此,已经成功判明了DBSCAN的聚类准则,且效果良好。
.

4 结论

本报告使用美团外卖用户评价数据进行实验,共操作了基于SnowNLP的情感分析、基于SVM的情感分析、词频分析、基于DBSCAN的文本聚类四个部分的研究。所使用的模型及方法均有较高的合理性及准确率(具体分析及结论已分别在前文3.3.2、3.3.3、3.4.2、3.5.2、3.6.2部分中给出)。

其中,我认为实际意义最佳的是词频分析部分,从中我得到了“外卖平台应优先从送餐服务方面来提升用户体验”的结论,并给出了具体方案的简要说明;在情感分析方面,基于SnowNLP的方法可以更具体地分析用户的情感,SVM则拥有更高的准确率;文本聚类则提供了更有针对性地分析用户评价的视角。

美团外卖用户评价文本研究相关推荐

  1. 美团外卖美食知识图谱的迭代及应用

    来源:美团技术团队本文约6300字,建议阅读10+分钟本文系统地介绍了美团外卖美食知识图谱的标签体系结构,包括菜品类目标签.标准菜品名.美食基础属性(食材.口味等)和美食业务主题属性(商家招牌.类目经 ...

  2. 美团外卖骑手背后的AI技术

    背景 随着数字化时代的到来,外卖市场近年来发展非常迅猛.对外卖物流系统而言,配送效率和用户体验至关重要.而实际配送过程是由配送员(骑手)最终完成的,因此,想要真正提升配送效率,不但要在智能调度系统(订 ...

  3. 美团-外卖骑手背后的AI技术

    背景 随着数字化时代的到来,外卖市场近年来发展非常迅猛.对外卖物流系统而言,配送效率和用户体验至关重要.而实际配送过程是由配送员(骑手)最终完成的,因此,想要真正提升配送效率,不但要在智能调度系统(订 ...

  4. 美团外卖推荐系统之智能流量分发的实践与探索

    省时查报告-专业.及时.全面的行研报告库 省时查方案-专业.及时.全面的营销策划方案库 [免费下载]2022年12月份热门报告盘点 百度APP Feed流业务架构变迁思考和升级实践 罗振宇2023年跨 ...

  5. 美团外卖推荐智能流量分发的实践与探索

    美团外卖推荐团队在推荐算法的长期落地实践中,针对外卖业务情境化特点对排序模型进行深入探索与优化.本文介绍了面向情境化建模的"情境细分+统一模型"建模思路,通过用户行为序列建模以及专 ...

  6. 解析美团外卖智能配送的AI技术原理(附PPT)

    来源:infoQ(微信号:infoqchina) 本文共8163字,建议阅读10分钟. 本文为你详解美团外卖如何使用AI技术实现智能配送. [ 导读 ]随着数字化时代的到来,外卖市场近年来发展非常迅猛 ...

  7. 全球AI技术开放日之走进美团 :探索美团外卖背后的AI大脑

    全球 AI 技术开放日(系列)是 AICamp 发起的学习和练习 AI 技术的一系列技术交流学习活动.活动组织国内外 AI 技术专家学者走进优秀的 AI 技术公司,和公司的 AI.机器学习.数据分析部 ...

  8. 从美团外卖小程序观察到的一些思考

    阅读文本大概需要 5 分钟. 今天的思考,启发自路人甲的知识星球 1.小程序 2017 年 7 月,张小龙预言:未来两年内,小程序将取代 80% 的 App 市场. 微信小程序是真的火了,有多火呢?如 ...

  9. 和硅谷AI专家一起走进美团,探索美团外卖背后的AI大脑

    " 美团外卖目前覆盖了上百万商家和上亿菜品.如何做到实时搜索.推荐以及商家管控和智能套餐搭配等业务? 美团外卖每天有50万以上骑手穿梭在大街小巷.如何使用目前最先进语音识别.NLU.机器学习 ...

最新文章

  1. 周长相等的正方形面积一定相等_必考单元:三年级下册面积计算公式+知识点+测试卷(附答案),重点内容,收藏练习!...
  2. Java Byte取值范围
  3. java中ajax删除,ajax删除 post方法
  4. python进程监控及恢复
  5. Django+Bootstrap+Mysql 搭建个人博客(一)
  6. linux安装lrzsz工具
  7. Asp.net学习资料
  8. QT图形显示和处理5
  9. USRP_X310_Device_Recovery手册
  10. 《百度中小学人工智能课程》预计9月进课堂;AI医疗市场未来营收规模或达万亿以上...
  11. 艾诗娜:红女巫 Ashina: The Red Witch Build.10280376 官方中文 免安装【209M】
  12. 安卓手机整人代码c语言大全,求一个C语言整人代码!!!
  13. Android Wifi --自动连接指定SSID(各种加密方式均可)
  14. McAfee评论:McAfee很好吗?
  15. 修改未能正确启动的docker容器的配置文件
  16. Your Organization has Turned off Automatic Updates (转载)
  17. UE4 (旧版4.15-4.24)安卓打包报错license not accepted
  18. Python爬虫爬取伯乐在线
  19. Spring学习笔记(六)。Spring自动装配,按名称自动装配:byName,按类型自动装配:byType,@Autowired,@Qualifier,@Resource
  20. Java 应用 编译成 Mac 应用

热门文章

  1. 全球化经营必备,盘点主流跨境电商平台
  2. 2022 CCF BDCI数字经济创新应用案例大赛决赛晋级名单
  3. 360城市全景,开启全新城市探索方式
  4. 各种算法的时间复杂度
  5. python 爬虫 快看漫画整站爬取(解决动态加载漫画图片地址、漫画图片合成长图、图片文件排序等问题)
  6. win10注册mscomm32.ocx失败
  7. hadoop整合hbase
  8. 计算机入门基础知识!学编程从认识计算机开始!
  9. 下班前几分钟,我彻底弄懂了并查集
  10. 男人就是要对自己狠一点