python酒店评论分析_对超过1M的酒店点评进行机器学习,发现有趣的见解
在之前的文章中,我们学会了如何训练一个机器学习分类器,用来检测酒店点评中提到的不同方面。使用这个方面分类器,我们可以自动的知道一个特定的点评是否在谈论清洁、舒适和设施、食品、网络、地点、工作人员以及/或物有所值。
我们还学习了如何将这个分类器与情绪分析分类器结合在一起,获得有趣的见解以及回答诸如客人喜欢特定酒店的位置,但是抱怨它的清洁问题吗这样的问题。
在这篇文章中,我们将介绍我们可以如何使用这些机器学习模型来分析TripAdvisor上数百万条点评,然后比较人们对不同城市的酒店的感受,从而理解以下事情:
待在曼谷酒店的人会比那些待在,比方说,巴黎酒店的人更多抱怨清洁问题吗?
具有最糟糕设施的城市是哪个?
酒店的星数会影响它的评论吗?
当涉及到不同类别的酒店时,人们会有不同的标准吗?
这是我们这篇教程想要回答的问题,而这将带给我们一些有趣的见解。这个过程的源代码可以在这个repo找到。
爬取酒店点评
我们创建了在前一篇文章构建的TripAdvisor Spider的一个新版本,用它来收集点评的更多数据:
酒店的名字。
酒店所在的城市。
酒店的星级(由点评者提供)。
创建一个Pipeline来合并模型
在使用新的爬虫从TripAdvisor抓取了一百多万条点评后,我们将内容拆分成意见单元,并且使用之前做过的类似的方式来将其分类。最大的区别是,现在我们创建了一个pipeline,它将两个分类器结合起来。pipeline是一个非常强大且灵活的工具,它允许你将MonkeyLearn的不同模块组合起来,多亏了它们,一次请求就可以同时为方面和情绪进行分类。
下面是使用pipeline分类意见单元:
from monkeylearn import MonkeyLearn
ml = MonkeyLearn("")
data = {
"texts": [{"text": "The room was very clean"}, {"text": "very rude staff"}]
}
res = ml.pipelines.run('pi_YKStimMw', data, sandbox=False)
简单吧?然后,res.result是一个看起来像这样的JSON:
{
'tags': [{
'sentiment': [{
'category_id': 102881,
'label': 'Good',
'probability': 1.0
}],
'topic': [
[{
'category_id': 1495678,
'label': 'Cleanliness',
'probability': 1.0
}]
]
}, {
'sentiment': [{
'category_id': 102882,
'label': 'Bad',
'probability': 1.0
}],
'topic': [
[{
'category_id': 1495676,
'label': 'Staff',
'probability': 1.0
}]
]
}]
}
每个点评都有一个item发送到pipeline,而每一个都有情绪和主题列表(方面)。
当将这些结果保存到CSV文件的时候,我们还添加了一个到其父评论的连接,并带有从点评文本的哈希值生成的键。因此,现在,我们有两个文件:一个是点评,包含我们爬取的每个点评的元数据(城市、酒店位置、星级等等),另一个是分类的意见单元,情绪和每个单元的主题,情绪可能性以及到其父点评的一个链接。
使用Elasticsearch对结果建索引 + Kibana可视化
但我们并不就此止步。接着,我们用Elasticsearch来对结果建立索引,然后将它们加载到Kibana,以生成漂亮的可视化。
这非常简单。首先,我们安装Elasticsearch,然后让它作为本地实例运行。为了获得数据的最好模型,需要进行一些试错,我们使用sense来做这件事。它是一个不错的Chrome扩展,允许你使用一个漂亮的界面而不是使用cURL与elastic的API进行交互。我们创建两个类型的索引:review和opinion_unit。每个类型的字段是csv的字段,并且使用_parent属性,我们添加来自每个意见单元的链接到它的父点评。最后,使用python SDK对csv文件的数据进行索引。
使用该SDK对意见单元进行索引是非常简单的。你只需要创建一个带有该item的所有字段的Python字典,然后使用该SDK发送到elasticsearch。批量进行比一次发送一个更快:
es = Elasticsearch(['http://localhost:9200'])
actions = []
parent_key = 'bd1ed398a8529d5ad010d927d5af7240'
opinion_unit = "The room was very clean"
sentiment = "Good"
topic = "Cleanliness"
item = [parent_key, opinion_unit, sentiment, topic]
action = {
"_index": "index_hotels",
"_type": "opinion_unit",
"_id": cont_id,
"_parent": parent_key,
"_source": item
}
actions.append(action)
helpers.bulk(es, actions)
随后,安装Kibana,然后将其配置为指向我们的Elasticsearch本地实例。为了创建在下面的部分展示的图表,我们使用基于查询的JSON,而不是Lucene,因为我们需要使用has_parent和has_child。
下面是一个查询,它从纽约选择意见单元。它使用带有has_parent的过滤器,这意味着它将只匹配父元素(一条点评)满足需求(来自纽约)的元素(意见单元)。它还要求意见单元的情绪根据高于某个特定的阈值的可能性进行分类,这将提高结果的质量:
{
"query": {
"filtered": {
"query": {
"match_all": {
"range": {
"sent_probability": {
"gt": "0.501"
}
}
}
},
"filter": {
"has_parent": {
"type": "review",
"query": {
"match": {
"city": "New York City"
}
}
}
}
}
}
}
用于创建图表的大多数查询都跟这个类似,你可以在Github找到它们。
来自点评的一些见解
大部分点评是正面的
纵观全局,大多数的点评是正面的。对于所有分析的意见单元,82%拥有一个“正面的”情绪。这意味着,人们在酒店点评中写的平均82%的东西都是正面的:
全部4,000,000个意见单元的情绪
伦敦的酒店有最糟糕的点评
然而,一旦你按照城市对点评的情绪进行分段,事情就开始变得有趣起来:伦敦的酒店倾向于比其他城市更严厉。我们对这一结果感到惊讶,因为我们期望的是伦敦与纽约或者巴黎处在相同的水平。随着每年都有数百万的游客来到这个城市,值得注意的是,它与其他同样大小的城市得分不同:
跨越不同城市的酒店点评的情绪
这个模型并未对这个行为进行解释,它只提供了结果。难道这是著名的糟糕的英国客户服务的征兆?或者也许伦敦的酒店只是比其他城市糟糕?又或者这是因为人们对伦敦的酒店更加苛刻?(请在下面的评论中分享你对这个结果的观点)
伦敦比纽约脏,并且总体具有最糟糕的食物
另一个有趣的见解来自于对跨不同哦城市酒店的具体方面的整体情绪的比较。
作为城市的整体情绪,某些方面保持大致相同的水平:伦敦酒店的“舒适度(Comfort)和设施(Facilities)”比纽约的低,等等。
好玩的是,不是所有的方面都遵循这个模式。例如,对于所有城市来说,“位置(Location)”往往是非常积极的,这意味着当点评者提到酒店位置时,它通常因为他们喜欢它,并且很少抱怨。“食物(Food)”的情况相同,除了伦敦还是明显低于其他城市外。这可能是因为英国菜名声不好:
跨不同城市的不同方面的情绪
具有不同星级的酒店的情绪
我们做了最后的比较,以找出人们对于不同星级的酒店有怎样的感受哦。似乎游客保持相同的标准而不管他们住在哪个酒店,因为点评的正面性随着星级的上升而上升:
不同星级的酒店的整体情绪
网络一直是一个问题
有趣的是,“网络(Internet)”在任何星级的酒店都没有真正上升到70%以上,这表明3星级的酒店跟5星级的酒店的网络状态一样糟糕。人们会期望越昂贵的酒店会提供更好的网络服务,但如果你曾经住过一家五星级酒店,那么你会知道并不是这样的:
不同星级的酒店的网络情绪
3星级的酒店最物有所值
另一个点评不一样的酒店方面是“物有所值(Value for Money)”,这个在3星级达到顶峰,随后下降。这表明,那些3星级,甚至2星级的酒店更加物有所值,即使它们比更高星级的酒店拥有更多的负面评价:
不同星级酒店的价值
关键字提取的上下文分析
数字没问题,那么实际内容呢?对于清洁的点评,哪个城市获得称赞?每个酒店对于食物的共同抱怨是啥?为了找出这些答案,我们使用关键词提取模块。这是一个公共模块,给定一个文本,它会提取关键词,并按相关性排序。
为了从每个段获得关键词代表,我们将相同城市、方面和情绪的几百个意见单位合并成一个单一的文本,并从那个文本中提取关键词。下面是如何运行关键词提取器:
ml = MonkeyLearn("")
text = ["The carpets are a disgrace in the dining room and need replaced immediately. The room was frankly grim....old, saggy beds (all 3 of them), scuffed walls and decor, the hotel is SO old, smells old, and TINY!"]
module_id = 'ex_y7BPYzNG'
res = ml.extractors.extract(module_id, text)
结果是一个JSON,它包含提取的关键词和关于它们的信息,例如相关性和出现次数。
例如,这些是纽约酒店点评中带有’Cleanliness’方面的’Bad’情绪的前10个关键词及其由MonkeyLearn返回的相关性:
for d in res.result[0]:
print d["keyword"], d["relevance"]
room 0.999
bathroom 0.790
carpet 0.407
towels 0.311
bed bugs 0.246
bed 0.232
hotel 0.196
shower 0.155
shared bathroom 0.150
walls 0.138
在为每个段完成提取后,我们比较了从每个城市获取的关键词:哪一个是唯一的,哪一个地多个地点共有的。
曼谷有蟑螂问题
这个分析给了我们关于每个城市中的酒店之间的差异和相似之处的一些非常有趣的见解。
例如,对于每个城市来说,清洁投诉常见的是低碳、床、头发、臭虫、污渍这些东西。然而,蟑螂只出现在曼谷,这意味着,曼谷酒店的蟑螂状况比其他地方严重得多。
公共澡堂只出现在纽约,这可能意味着在纽约,公共澡堂更常见,并且它们脏得很!
关于位置的意见的内容城市之间大不相同。不同地标名称的关键字在每个城市出现:在里约热内卢,评论提到诸如科帕卡巴纳,伊帕内马这样的东东;在北京,则是故宫和天安门广场之类;在马德里则是太阳门,等等等等。这些都是每个城市重要的旅游景点,因此当涉及到酒店的位置多好时,点评者认为它们是重要的。还有提到其他一些不是路标的城市特色,例如伦敦的地铁站,巴黎的地铁。
牛角包超让人失望
隐藏在此数据集后还有更多的见解,我们想要再提一个。也就是说,在不同城市关于食物的意见。早餐(breakfast)当然是一个共同的关键词,咖啡(coffee)和茶(tea)也是。然而,当我们考虑到单个城市的关键字时,事情变得有趣起来。
例如,关键词牛角包(croissant)只出现在来自巴黎的点评。另外,它大部分出现在一个负面的上下文中,这让人感到惊讶。为什么这样一种法国主食会出现在负面的角度呢?看看这些点评的内容,答案很清楚:牛角包在非常基础的早餐的情况下被提及。所以如果你去巴黎,平淡的早餐当然会包含一些牛角包(但没有别的了!)
最后的话
在这篇教程中,我们学习了如何抓取上百万条点评,使用MonkeyLearn中的预训练分类器对他们进行分析,使用Elasticsearch对结果进行索引,并且使用Kibana进行可视化。
当你想要以低成本高效益的方式来分析大数据量时,机器学习就有意义了。
我们发现了一些真的很有趣的见解;一些如我们所料(像网络一直是一个问题),而一些完全出乎意料(伦敦酒店看起来最糟糕)。
如果你有机会,看看代码,并且进行你自己的分析,你将会发现玩数据和机器学习超级有意思。要是你这么做了,请在下面的评论,分享你的观点和结果,能够听到你的见解将是一件棒棒哒的事。
编码快乐!
python酒店评论分析_对超过1M的酒店点评进行机器学习,发现有趣的见解相关推荐
- python酒店评论分析_酒店舆情分析
Python进行携程酒店评论舆情分析 第一步:分析设计 我们是对酒店进行舆情分析,所有我们的核心是酒店的评论数据:对住客的评论数据进行特征提取,通过住客对酒店的评分,对数据进行分类,并使用朴素贝叶斯算 ...
- python酒店评论分析_手把手用Python网络爬虫带你爬取全国著名高校附近酒店评论...
点击蓝色"Python空间"关注我丫 加个"星标",每天一起快乐的学习 今 日 鸡 汤 我站在鼓楼下边,一切繁华与我无关. /1 前言/ 简介:本文介绍如何用p ...
- python新闻评论分析_使用 python 抓取并分析京东商品评论数据
本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D ...
- python酒店评论分析_使用kears分析中文酒店评论(肯定和否定),基于CNN和RNN
下载清华大学的宾馆评论数据集 from tensorflow import keras import os # 自动解压,新建review_sentiment目录 path = keras.utils ...
- python新闻评论分析_新闻详情页
一,业务流程分析 1,功能 1,新闻详情 2,加载评论功能 3,添加评论功能 二.新闻详情页 1,业务流程分析 业务流程: 1,判断前端传递新闻ID是否为空,是否为整数,是否存在 二,接口设计 1.接 ...
- python商品评论分析_用python3爬取天猫商品评论并分析(1)
在上一篇文章我们已经完成数据的采集,并将数据存储在mysql,现在我们来继续后面的数据分析工作,先放出项目流程: 0.主要流程 0.数据采集 0. 目标网址获取 1. 爬虫框架选用 注:了解这一步请登 ...
- python新闻评论分析_从新闻文章中提取评论
我的问题和这里问的问题类似: https://stackoverflow.com/questions/14599485/news-website-comment-analysis 我试图从任何新闻文章 ...
- python新闻评论分析_今日头条新闻评论获取
*为什么有这篇文章 因为老婆博士专业的原因,她需要获取不少网站的新闻或者帖子的评论,并且对评论进行数据分析或者是自然语义分析(NLP).因此从来没有接触过 python,只有 VB 二级的我自然就成了 ...
- python商品评论分析_亚马逊产品情感评论分析
import requests from lxml import etree import re import xlwt from openpyxl import workbook # 写入Excel ...
最新文章
- MongoDB增加用户认证:增加用户、删除用户、修改用户密码、读写权限、只读权限...
- java中sql之count,SQL COUNT() 函数--编程学习网
- linux vnc 改端口号,基于Linux中vnc配置端口号的修改方法
- LeetCode 535. Encode and Decode TinyURL
- 「小程序JAVA实战」 小程序的事件(11)
- SharePoint 2013 Step by Step——使用自定义的List Template
- linux 中文输入鼠标跳动,解决wps for linux 中文输入法光标不跟随的问题
- CSDN账号注册 设置用户名
- 细胞自动机 通用计算机,细胞自动机论
- java的小区车辆管理系统_基于Java的小区车辆信息管理系统的设计与实现
- jacob将WORD转换成PDF文件(要装有Word另存为PDF文件的插件)
- 用Excel体验梯度下降法计算函数极值
- java 制作 winrar,windows 上java调用winrar压缩文件为rar 格式
- fig-tlo_PHP-FIG的替代方案:各种愿景的利弊
- dp主机_怎样设置显示器DP接口信号优先?
- 计算机操作系统之进程
- 网络攻防环境的搭建--MacOs配置Vmnet1及Vmnet8
- 【每日一个GitHub项目】GitHub中文排行榜
- Quaternion类
- KeePass个人使用手册
热门文章
- Centos中用户相关操作(创建用户、设置密码、切换用户、修改用户信息、附加组、删除用户、用户分类)
- Linux配置vimIP地址,Linux下配置ip地址
- 窄幅震荡突破前高选股公式,选出突破前期高点的标的
- 思维才是真正的力量,知识只是改变思维的原材料而于
- Java线程的一点理解
- 简易Ps的Python实现
- python栈的压入与弹出
- 我在哈佛辅导过桑德伯格(facebook 二号人物): 她让我明白我们误解了美国的精英教育
- 10bit灰阶测试图_2K高分10bit色彩 HKC专业制图液晶评测
- CSS文字真正两端对齐(俩字和三字对齐)