【第十届“泰迪杯”数据挖掘挑战赛】C题:疫情背景下的周边游需求图谱分析 问题一方案及Python实现

简介: 第十届“泰迪杯”数据挖掘挑战赛C题的解决方案,涉及疫情背景下周边游需求图谱分析,包括微信公众号文章分类、周边游产品热度分析、本地旅游图谱构建与分析,以及疫情前后旅游产品需求变化分析的Python实现方法。

1.png

1 题目

1.1 问题背景

随着互联网和自媒体的繁荣,文本形式的在线旅游(Online Travel Agency,OTA)和游客的用户生成内容(User Generated Content,UGC)数据成为了解旅游市场现状的重要信息来源。OTA 和UGC 数据的内容较为分散和碎片化,要使用它们对某一特定旅游目的地进行研究时,迫切需要一种能够从文本中抽取相关的旅游要素,并挖掘要素之间的相关性和隐含的高层概念的可视化分析工具。

为此本赛题提出本地旅游图谱这一概念,它在通用知识图谱的基础上加入了更多针对 旅游行业的需求。本地旅游图谱采用图的形式直观全面地展示特定旅游目的地“吃住行娱 购游”等旅游要素,以及它们之间的关联。图 1 所示为我国西藏阿里地区的本地旅游图谱, 中心位置节点为旅游目的地“阿里”,它的下层要素包括该地区的重要景点如“冈仁波齐” 和“玛旁雍错”,以及“安全”、“住宿”等旅游要素。旅游要素分为多个等级,需要从 文本中挖掘出面对不同要素游客所关注的下一级要素。如阿里地区的“安全”要素下包括 “高反”、“天气”和“季节”等下一级要素,这个组合是西藏旅游所特有的。旅游要素 之间会存在关联关系,如“冈仁波齐”和“玛旁雍错”这两个景点通过“神山圣湖”这一 高层概念产生联系,在本地旅游图谱中使用连接两个节点的一条边来表示。
2.png

图 1 西藏阿里地区的本地旅游图谱

在近年来新冠疫情常态化防控的背景下,我国游客的旅游消费方式已经发生明显的转变。在出境游停滞,跨省游时常因为零散疫情的影响被叫停的情况下,中长程旅游受到非常大的冲击,游客更多选择短程旅游,本地周边游规模暴涨迎来了风口。疫情防控常态化背景下研究分析游客消费需求行为的变化,对于旅游企业产品供给、资源优化配置以及市场持续开拓具有长远而积极的作用。本赛题提供收集自互联网公开渠道的 2018 年至 2021年广东省茂名市的 OTA 和 UGC 数据,期待参赛者采用自然语言处理等数据挖掘方法通过建立本地旅游图谱的方式来分析新冠疫情时期该市周边游的发展。

1.2 解决问题

1、微信公众号文章分类

构建文本分类模型,对附件 1 提供的微信公众号的推送文章根据其内容与文旅的相关性分为“ 相关” 和“ 不相关” 两类, 并将分类结果以表 1 的形式保存为文件“result1.csv”。与文旅相关性较强的主题有旅游、活动、节庆、特产、交通、酒店、景 区、景点、文创、文化、乡村旅游、民宿、假日、假期、游客、采摘、赏花、春游、踏青、康养、公园、滨海游、度假、农家乐、剧本杀、旅行、徒步、工业旅游、线路、自驾游、 团队游、攻略、游记、包车、玻璃栈道、游艇、高尔夫、温泉等等。

表 1 微信公众号文章分类

3.png

2、周边游产品热度分析

从附件提供的 OTA、UGC 数据中提取包括景区、酒店、网红景点、民宿、特色餐饮、乡村旅游、文创等旅游产品的实例和其他有用信息,将提取出的旅游产品和所依托的语料以的形式保存为文件“result2-1.csv”。建立旅游产品的多维度热度评价模型,对提取出的旅游产品按年度进行热度分析,并排名。将结果以表 3 的形式保存为文件“result2- 2.csv”。

表 2 旅游产品提取表

4.png

表 3 旅游产品的热度

5.png

3、本地旅游图谱构建与分析

依据提供的 OTA、UGC 数据,对问题 2 中提取出的旅游产品进行关联分析,找出以景区、酒店、餐饮等为核心的强关联模式,结果以表 的形式保存为文件“result3.csv”。在此基础上构建本地旅游图谱并选择合适方法进行可视化分析。鼓励参赛队挖掘旅游产品间隐含的关联模式并进行解释。

表 4 旅游产品间的关联

6.png

4、疫情前后旅游产品需求的变化分析

基于历史数据,使用本地旅游图谱作为分析工具,分析新冠疫情前后茂名市旅游产品的变化,并撰写一封不超过 2 页的信件向该地区旅游主管部门提出旅游行业发展的政策建议。

1.3 附件说明

附件 1 数据来源于互联网公开渠道,具体表结构字段如下:
7.png

2 问题一思路

数据预处理包括:读取微信公众号文章,将标题和文本合并后,先用正则表达式删除中文中的特殊符号,再jieba分词、再去掉停用词,停用词有很多类型的,有哈工大、百度、川大的,下载地址https://github.com/goto456/stopwords。以下实现用哈工大的。

判断主题类型:方法一,计算文本相似度,对每个样本计算与旅游、活动等等这些关键词的TFIDF相似度。大于0的,即为相关。方法二,用LDA提取文档主题,计算样本与以上的关键词文档的相似度,大于0的,即为相关。

3 Python实现

import warnings
from gensim import corpora, models, similarities
from gensim.corpora import Dictionary
from gensim import corpora, models
import numpy as np
import pandas as pd
import re
from tqdm import tqdm
import jieba
tqdm.pandas()
warnings.filterwarnings('ignore')

3.1 读取文件

# 读取微信公众号文章
train_data = pd.read_excel('./data/data.xlsx',sheet_name=4)
train_data

8.png

# 合并标题和正文
train_data['text'] = train_data['文章标题']+'\n'+train_data['公众号文章内容']
train_data['text']

9.png

3.2 删除特殊字符和文本分词


def clearTxt(line):
    if line != '':
        line = line.strip()
        #去除文本中的英文和数字
        line = re.sub("[a-zA-Z0-9]", "", line)
        #去除文本中的中文符号和英文符号
        。。。略
        #分词
        segList = jieba.cut(line, cut_all=False)
        segSentence = ''
        for word in segList:
            if word != '\t':
                segSentence += word + " "
    return segSentence.strip()

text = train_data['text'].progress_apply(clearTxt)
text

10.png

3.3 去停用词

import codecs
#读取停顿词列表
stopword_list = [k.strip() for k in open(
    'stop/cn_stopwords.txt', encoding='utf8').readlines() if k.strip() != '']
def stopWord(line):
    sentence = delstopword(line, stopword_list)
    return sentence
#删除停用词
def delstopword(line, stopkey):
    wordList = line.split(' ')
    sentence = ''
    for word in wordList:
        word = word.strip()
        if word not in stopkey:
            if word != '\t':
                sentence += word + " "
    return sentence.strip()

train_data['分词后文本'] = text
text2 = train_data['分词后文本'].progress_apply(stopWord)
text2

11.png

3.4 计算文本相似度

方法一:TF—IDF相似度

from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
from scipy.linalg import norm

# def tf_similarity(s1, s2):
s1 = 略
tf_sim_num = []
for i in range(len(text2)):
    s2 = text2[i]
    cv = CountVectorizer(tokenizer=lambda s: s.split())  # 转化为TF矩阵
    corpus = [s1, s2]
    vectors = cv.fit_transform(corpus).toarray()  # 计算TF系数
    sim = np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))

    print(sim)
    tf_sim_num.append(sim)

方法二:LDA主题模型相似度

s1 = 略
def get_dict():
    train = []
    for i in enumerate(text2):
        line = i[1].split()
        train.append(line)
    train.append(s1.split())
    dictionary = Dictionary(train)
    return dictionary, train

#计算两个文档的相似度
dictionary = get_dict()[0]
train = get_dict()[1]
corpus = [dictionary.doc2bow(text) for text in train]  # 每个text对应的稀疏向量
tfidf = models.TfidfModel(corpus)  # 统计tfidf
corpus_tfidf = tfidf[corpus]

。。。略

lda_sim_num = []
for txt in enumerate(text2):
    s2 = txt[1]
    test_doc = s1.split()  # 新文档进行分词
    dictionary = get_dict()[0]
    doc_bow = dictionary.doc2bow(test_doc)  # 文档转换成bow
    doc_lda = lda[doc_bow]  # 得到新文档的主题分布
    # # 输出新文档的主题分布
    list_doc1 = [i[1] for i in doc_lda]
    test_doc2 = s2.split()  # 新文档进行分词
    doc_bow2 = dictionary.doc2bow(test_doc2)  # 文档转换成bow
    doc_lda2 = lda[doc_bow2]  # 得到新文档的主题分布
    # 输出新文档的主题分布
    list_doc2 = [i[1] for i in doc_lda2][:len(list_doc1)]
    try:
        sim = np.dot(list_doc1, list_doc2) / \
            (np.linalg.norm(list_doc1) * np.linalg.norm(list_doc2))
        print(sim)
    except ValueError:
        sim = 0
        print(sim)
    lda_sim_num.append(sim)

12.png

3.5 根据相似度分类文本

# 根据tfidf相似度分类文本
# sim_num = tf_sim_num
# 根据lda相似度分类文本
sim_num = lda_sim_num
label = []
for i in enumerate(sim_num):
    if i[1]>0:
        label.append('相关')
    else:
        label.append('不相关')
result = pd.DataFrame(columns=['文章ID','分类标签'])

result['文章ID'] = [str(i+1).zfill(4) for i in range(len(train_data))]
result['分类标签'] =label
result.to_csv('./data/result1.csv',index=False)
result

13.png

4 代码下载

私信我,同时把文章链接发给我

目录
相关文章
|
7天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
24天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
9天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
16天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
59 7
|
1月前
|
数据可视化 算法 Python
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
本文介绍了如何利用Python脚本结合动态模态分解(DMD)技术,分析从OpenFOAM模拟中提取的二维切片数据,以深入理解流体动力学现象。通过PyVista库处理VTK格式的模拟数据,进行POD和DMD分析,揭示流场中的主要能量结构及动态特征。此方法为研究复杂流动系统提供了有力工具。
65 2
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
|
15天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
25 3
|
16天前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
31 2
|
21天前
|
数据采集 机器学习/深度学习 搜索推荐
Python自动化:关键词密度分析与搜索引擎优化
Python自动化:关键词密度分析与搜索引擎优化
|
22天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
50 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
1月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
46 2