2018年 数据挖掘“泰迪杯” C题 第一问
一、问题背景
题目:游客目的地印象分析
提升景区及酒店等旅游目的地美誉度是各地文旅主管部门和旅游相关企业非常重视和关注的工作,涉及到如何稳定客源、取得竞争优势、吸引游客到访消费等重要事项。游客满意度与目的地美誉度紧密相关,游客满意度越高,目的地美誉度就越大。因此掌握目的地游客满意度的影响因素,切实提高游客满意度、最终提升目的地美誉度,不仅能够保证客源稳定,而且对于旅游企业科学监管、资源优化配置以及市场持续开拓具有长远而积极的作用。
二、解决问题
1、景区及酒店印象分析
依据附件1中景区及酒店网评文本,按赛题表1格式计算出目的地TOP20热门词,并保存为文件“印象词云表.xls”。
解题思路:首先是用pd.read_excel()读取excel文件,然后就是找停用词表,简单来说,就是用collections词频统计库对景区和酒店的评论的词频统计,再用wordcloud 词云展示库对景区和酒店的评论进行词云的制作。
以上就是第一问的要求,废话不多说,开始写代码。
分别得到每个景区和每个酒店的top20热词和词云
导入库:
import codecs # 解码库
import collections # 词频统计库
import csv # 读取csv格式和写入csv表格数据
import re # 正则表达式库import jieba # 中文分词
import matplotlib.pyplot as plt # 图像展示库
import numpy as np # numpy数据处理库
import pandas as pd # 数据分析库
import wordcloud # 词云展示库
from PIL import Image # 图像处理库
读取EXCEL文件:
jingqu = pd.read_excel(r'./data/附件1/景区评论.xlsx') # 读取excel文件
jiudian = pd.read_excel(r'./data/附件1/酒店评论.xlsx')
停用词准备:
stopwords = set() # 空集合用来存放停用词
# stopwords.txt里包括了:中文停用词表、哈工大停用词表、百度停用词表、四川大学机器智能实验室停用词库
# codecs是一个解码库,文件读尽量用codecs.open方法,一般不会出现编码的问题
stopw = codecs.open(r'./stopwords.txt', 'r', 'utf-8')
for word in stopw:stopwords.add(str(word).strip()) # 把每一个停用词转换成字符串并且去掉空格,然后添加到停用词的集合中
stopw.close() # 关闭文件
景区词频统计和词云生成:
jingqus_indexs = [] # 用来存放景区的景区名称的列表
for i in range(1, 51): # 第一个景区是A01,最后一个景区是A50if i < 10:jingqu_i = 'A0' + str(i)jingqus_indexs.append(jingqu_i)else:jingqu_i = 'A' + str(i)jingqus_indexs.append(jingqu_i)# 景区评论的词频统计和词云制作
jq_num = 0 # 索引开始值为0
for jingqu_index in jingqus_indexs: # 景区名称总列表取出每一个景区的名称jingqu_every_mingcheng_num = jingqu['景区名称'].value_counts()[jingqu_index] # 统计每一个景区的评论条数jingqu_comment = "" # 这部分是得到景区评论的字符串jingqu_every_mingcheng_num += jq_num # range结束索引是上一轮range的最后一个数加上这轮景区的评论数for i in range(jq_num, jingqu_every_mingcheng_num): # 每个景区有多少条评论就取多少条jingqu_every_comment = jingqu.at[i, '评论内容'] # 取出每一条评论jingqu_comment += jingqu_every_comment + "\n" # 得到jingqu_comment是某个景区评论的字符串jq_num = jingqu_every_mingcheng_num # range开始索引是上一轮range的最后一个数pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"|\d|\W') # 定义正则表达式匹配模式string_data = re.sub(pattern, '', jingqu_comment) # 将符合模式的字符去除,得到纯文字seg_list_exact = jieba.cut(string_data, cut_all=False) # 文本分词:精确模式分词object_list = [] # 用来存放非停用词,以便于做词频统计和词云for word in seg_list_exact: # 循环读出每个分词if word not in stopwords: # 如果不在要去除的停用词库中object_list.append(word) # 分词追加到列表word_counts = collections.Counter(object_list) # 用collections.Counter()对分词做词频统计word_counts_top20 = word_counts.most_common(20) # 获取前20最高频的词,most_common()来实现Top n功能print(word_counts_top20) # 输出检查print('-----------------------------------------------分割线------------------------------------------------------')b = ['评论热词', '热度']jingqu_file_name = jingqu_index + '.csv'# 做词云图,先将储存代码注释起来file_path = "./景区词频统计和词云/"with open(file_path + jingqu_file_name, 'w', newline='') as t: # numline是来控制空的行数的writer = csv.writer(t) # 创建一个csv的写入器writer.writerow(b) # 写入csv标签writer.writerows(word_counts_top20) # 写入top 20 样本数据# 词频展示mask = np.array(Image.open('./词云背景图.png')) # 定义词频背景wc = wordcloud.WordCloud(font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式mask=mask, # 设置背景图max_words=100, # 最多显示词数background_color='white', # 背景颜色max_font_size=100 # 字体最大值)wc.generate_from_frequencies(word_counts) # 根据字典生成词云image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案plt.imshow(wc) # 显示词云plt.axis('off') # 关闭坐标轴plt.savefig(file_path + jingqu_index, dpi=500)
酒店词频统计和词云生成:
jiudians_indexs = [] # 用来存放酒店的酒店名称的列表
for i in range(1, 51): # 第一个酒店是H01,最后一个酒店是H50if i < 10:jiudian_i = 'H0' + str(i)jiudians_indexs.append(jiudian_i)else:jiudian_i = 'H' + str(i)jiudians_indexs.append(jiudian_i)
print('每个景区对应评论的词频统计和词云制作完成!!!')# 酒店评论的词频统计和词云制作
jd_num = 0 # 索引开始值为0
for jiudian_index in jiudians_indexs: # 酒店名称总列表取出每一个酒店的名称jiudian_every_mingcheng_num = jiudian['酒店名称'].value_counts()[jiudian_index] # 统计每一个酒店的评论条数jiudian_comment = "" # 这部分是得到酒店评论的字符串jiudian_every_mingcheng_num += jd_num # range结束索引是上一轮range的最后一个数加上这轮酒店的评论数for i in range(jd_num, jiudian_every_mingcheng_num): # 每个酒店有多少条评论就取多少条jiudian_every_comment = jiudian.at[i, '评论内容'] # 取出每一条评论jiudian_comment += jiudian_every_comment + "\n" # 得到jiudian_comment是某个酒店评论的字符串jd_num = jiudian_every_mingcheng_num # range开始索引是上一轮range的最后一个数pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"|\d|\W') # 定义正则表达式匹配模式string_data = re.sub(pattern, '', jiudian_comment) # 将符合模式的字符去除,得到纯文字seg_list_exact = jieba.cut(string_data, cut_all=False) # 文本分词:精确模式分词object_list = [] # 用来存放非停用词,以便于做词频统计和词云for word in seg_list_exact: # 循环读出每个分词if word not in stopwords: # 如果不在要去除的停用词库中object_list.append(word) # 分词追加到列表word_counts = collections.Counter(object_list) # 用collections.Counter()对分词做词频统计word_counts_top20 = word_counts.most_common(20) # 获取前20最高频的词,most_common()来实现Top n功能print(word_counts_top20) # 输出检查print('-----------------------------------------------分割线------------------------------------------------------')b = ['评论热词', '热度']jiudian_file_name = jiudian_index + '.csv'# 做词云图,先将储存代码注释起来file_path = "./酒店词频统计和词云/"with open(file_path + jiudian_file_name, 'w', newline='') as t: # numline是来控制空的行数的writer = csv.writer(t) # 创建一个csv的写入器writer.writerow(b) # 写入csv标签writer.writerows(word_counts_top20) # 写入top 20 样本数据# 词频展示mask = np.array(Image.open('./词云背景图.png')) # 定义词频背景wc = wordcloud.WordCloud(font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式mask=mask, # 设置背景图max_words=100, # 最多显示词数background_color='white', # 背景颜色max_font_size=100 # 字体最大值)wc.generate_from_frequencies(word_counts) # 根据字典生成词云image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案plt.imshow(wc) # 显示词云plt.axis('off') # 关闭坐标轴plt.savefig(file_path + jiudian_index, dpi=500)
print('每个酒店对应评论的词频统计和词云制作完成!!!')
部分代码解析:
# 这部分是为了得到每个一条评论,每个景区有多少条评论就取多少条
for i in jingqu.index:
jingqu_every_comment = jingqu.at[i, '评论内容']
得出景区的每一条评论,运行结果:
# codecs是一个解码库,文件读尽量用codecs.open方法,一般不会出现编码的问题,stopwords.txt里包括了:中文停用词表、哈工大停用词表、百度停用词表、四川大学机器智能实验室停用词库
stopw = codecs.open(r'./stopwords.txt', 'r', 'utf-8')
for word in stopw:
# 把每一个停用词转换成字符串并且去掉空格,然后添加到停用词的集合中
stopwords.add(str(word).strip())
这一部分这为了去掉停用词方便后面做词频统计和词云的
为了得到用来存放景区的景区名称的列表,因为第一个景区是A01,最后一个景区是A50,所以是range(1, 51)。
jingqus_indexs = []
for i in range(1, 51):
if i < 10:
jingqu_i = 'A0' + str(i)
jingqus_indexs.append(jingqu_i)
else:
jingqu_i = 'A' + str(i)
jingqus_indexs.append(jingqu_i)
print(jingqus_indexs)
运行的结果是:
其实就是景区名称的列表,也是方便后面读取景区评论的内容
代码中还用到正则表达式来匹配字符,定义正则表达式匹配模式pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"|\d|\W'),将符合模式的字符去除string_data = re.sub(pattern, '', jingqu_comment),为了去掉一些特殊的符号,得到纯文字,再对纯文字进行分词,以便词频统计。
通过jieba正文分词库进行分词,文本分词采用精确模式分词模式,循环读出每个分词,如果不在要去除的停用词库中,那就把分词追加到存放非停用词的列表,用collections.Counter()对非停用词列表做词频统计,再通过most_common()来实现Top n功能,获取前20最高频的词,最后用csv.writer()方法创建一个csv的写入器,写入csv对应的标签和top 20 样本数据,这样词频统计部分就完成了,酒店的词频统计和景区类似。
景区词频统计结果图(这部分是每一个景区目的地的top20热词):
景区词频统计完成结果图:
酒店词频统计结果图(这部分是每一个酒店目的地的top20热词):
酒店词频统计完成结果图:
接下来是关于词云生成的内容,也是对词频做一个简单的展示,使得热点词更直观清晰。
首先通过from PIL import Image 图像处理库来定义词频的背景图,用wordcloud.WordCloud()来设置词云的参数,其中包括高度,宽度,字体,背景图,背景颜色,显示词数和字体最大值等等。
设置完参数后,通过wc.generate_from_frequencies(word_counts) 即根据字典生成词云,再通过wordcloud.ImageColorGenerator(mask)从背景图建立颜色方案和wc.recolor(color_func=image_colors) 将词云颜色设置为背景图方案,
最后显示词云plt.imshow(wc) 并且把词云保存到指定路径下plt.savefig(file_path + "所有酒店评论词云", dpi=500)。
得到的结果保存在这两个文件夹下:
分别包含每个酒店和每个景区的评论top20热词和词云
得到的是所有景区评论内容的top20热词和词云,以及所有酒店评论内容的top20热词和词云。
这样第一问就解决了!!!
2018年 数据挖掘“泰迪杯” C题 第一问相关推荐
- 2018年 数据挖掘“泰迪杯” C题 第四问
一.问题背景 题目:游客目的地印象分析 提升景区及酒店等旅游目的地美誉度是各地文旅主管部门和旅游相关企业非常重视和关注的工作,涉及到如何稳定客源.取得竞争优势.吸引游客到访消费等重要事项.游客满意度与 ...
- 2020年泰迪杯C题智慧政务中的文本数据挖掘应用--论文+全部源码分享
5.2问题二模型的建立与求解 本题要求针对热点问题进行挖掘,主要目的是从群众留言中挖掘出热点问题.也就是给每一条留言都量化一个热度指数.并且根据热度指数进行排序,从而获取热度较高的评价问题.对于问题热 ...
- 泰迪杯C题第三问[文本有效性分析] (1)
导入库 import re # 正则表达式库 import collections # 词频统计库 import numpy as np # numpy数据处理库 import jieba # 中文分 ...
- 【第十一届泰迪杯B题产品订单的数据分析与需求预测产品订单的数据分析与需求预测 】第二大问代码分享+解题思路(EDA数据再探索+LightGBM模型)
[第十一届泰迪杯B题产品订单的数据分析与需求预测]第二大问代码分享+解题思路(EDA数据再探索+LightGBM模型) 写在前面: 拖了这么长时间,一方面是我在找实习面试准备.另一方面是在做第二问 ...
- 【第十一届“泰迪杯”数据挖掘挑战赛】泰迪杯c题爬虫采集数据(源码+数据)
["第十一届"泰迪杯"数据挖掘挑战赛-- C 题:泰迪内推平台招聘与求职双向推荐系统构建(采集数据)] 问题: 数据详情: 根据工作id获取详细数据(1571条).csv ...
- 2022华为杯A题第一问详细思路
第一问思路 华为杯A题具有相当专业性,对于非雷达或者信通专业的学生而言可能题都看不懂.这里先带领大家分析一下题目. 这张图说明了本题,也就是连续波雷达的定位方式.首先产生连续波信号,通过功放(PA)进 ...
- 大数据分析练习-第八届泰迪杯A题-基于数据挖掘的上市公司高送转预测
报告书-pdf 本实验在Anaconda环境下进行编程,使用jupyter. 具体有以下注意点: 文件结构 : 主文件目录 - |-- Main.ipynb 主文件 |-- ReadMe.md ...
- 第十一届泰迪杯B题:产品订单的数据分析与需求预测
赛题描述 一.问题背景 近年来企业外部环境越来越不确定,复杂多变的外部环境,让企业供应链面临较多难题.需求预测作为企业供应链的第一道防线,重要程度不言而喻,然而需求预测受多种因素的影响,导致预测准确率 ...
- 第8届泰迪杯C题问题总结
文章目录 写作模板问题 从网上下载了一个牛逼哄哄的模板,用 Winedit 打开时,却跳出错误弹出.我顿时懵逼了!!! 编译模板时,跳出 Improper alphabetic constant 错误 ...
- 第九届泰迪杯A题(1)
分析:统计出造假和非造假的个数并作图 正负样本可视化 import pandas as pd import matplotlib.pyplot as plt import numpy as np# 查 ...
最新文章
- C# 使用Epplus导出数据到Excel
- flutter scrollview_简单易上手的Flutter学习指南App,2020一起来玩转Flutter吧~
- 在Asp.Net Core中使用ModelConvention实现全局过滤器隔离
- 排序算法之冒泡排序,选择排序
- 针对文字加密的简单 JS 加密算法 --进制乱序法改良版
- android自定义控件动态,GitHub - itrenjunhua/WaveView: Android自定义控件实现动态百分比水波纹效果...
- 图解 SpringCloud 体系!
- keil5 字体颜色设置 背景黑色
- 机器学习项目开发经验
- 大疆飞行模拟(DJI Flight Simulator)软件的使用
- veu创建项目,自定义配置
- 「案例」让房东在 Airbnb 上展示他们的热情好客
- 入门电机系列之2驱动器
- 数据离散化之chimerge算法的实现(python版)(以莺尾花数据为例)
- 手机连接电脑后,电脑上显示不出来手机的文件夹
- 机器视觉之工业摄像机知识点(二)
- python中的subprocess.Popen()使用
- 【软件测试】白盒测试方法与黑盒测试方法的区别
- 网络安全与网站安全及计算机安全:如何使用Kali Linux进行内网或局域网安全演练?
- 智能手表短信读取实现具体教程(带有eSIM卡,无短信功能,可安装手表QQ的智能手表)Version2.0改进版
热门文章
- js 实现2的n次方计算函数_x的10的n次方解决js浮点数计算
- 如何用ICode来学习Python
- Pycharm 搭建 Django 项目 (非常详细)
- iis 如何重启php,Windows下配置Nginx+PHP基本操作(启动、重启和退出)
- 缓存中间件技术选型Memcached、MongoDB、Redis
- Java多线程面试题,我丝毫不慌
- Java 多线程面试问题
- springcloud集成seata+euraka 构成的分布式事务控制(待补充)
- python读取Himawari-8葵花8标准数据(HSD)
- matlab 频率分辨率,功率谱、频率分辨率、频谱泄漏与窗函数