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,最后一个景区是A50
    if 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,最后一个酒店是H50
    if 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, '评论内容']
2018年 数据挖掘“泰迪杯” C题 第一问_第1张图片
得出景区的每一条评论,运行结果:

2018年 数据挖掘“泰迪杯” C题 第一问_第2张图片

# 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)

运行的结果是:

2018年 数据挖掘“泰迪杯” C题 第一问_第3张图片
其实就是景区名称的列表,也是方便后面读取景区评论的内容

代码中还用到正则表达式来匹配字符,定义正则表达式匹配模式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热词):

2018年 数据挖掘“泰迪杯” C题 第一问_第4张图片

景区词频统计完成结果图:

2018年 数据挖掘“泰迪杯” C题 第一问_第5张图片

酒店词频统计结果图(这部分是每一个酒店目的地的top20热词):

 2018年 数据挖掘“泰迪杯” C题 第一问_第6张图片 

酒店词频统计完成结果图:

2018年 数据挖掘“泰迪杯” C题 第一问_第7张图片
接下来是关于词云生成的内容,也是对词频做一个简单的展示,使得热点词更直观清晰。

首先通过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热词和词云

2018年 数据挖掘“泰迪杯” C题 第一问_第8张图片2018年 数据挖掘“泰迪杯” C题 第一问_第9张图片

得到的是所有景区评论内容的top20热词和词云,以及所有酒店评论内容的top20热词和词云。

这样第一问就解决了!!!

你可能感兴趣的:(python,数据挖掘)