跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

基于Python大数据机器学习的旅游数据分析可视化推荐系统

一个基于Python、TF-IDF算法和SnowNLP库的旅游数据分析可视化推荐系统。系统通过爬虫采集景区数据,利用TF-IDF进行关键词提取,使用SnowNLP进行情感分析,并结合Echarts进行数据可视化展示。主要功能包括景区热度热力图、客流量统计、评价情感分析及智能路线推荐。技术栈涵盖Python、Flask框架及Requests爬虫等。

星河入梦发布于 2026/3/28更新于 2026/5/2327 浏览
基于Python大数据机器学习的旅游数据分析可视化推荐系统

基于Python大数据机器学习的旅游数据分析可视化推荐系统

项目概述

基于机器学习TF-IDF 算法和SnowNLP的大数据智慧旅游数据分析可视化推荐系统通过数据采集、数据清洗、数据分析、数据可视化的技术,对景区数据进行爬取和收集。以旅游景点数据为基础分析景区热度,挖掘客流量、景区评价等信息,并对分析的结果进行统计。智慧旅游数据分析系统拟实现景区热度、景区展示、游客统计、景区评价、旅游路线等部分。拟定景区热度通过热力图展示,客流量、景区评价情感分析,景点路线推荐等数据通过折线图、饼图等形式呈现出来,推出各景区旅游路线,并将景区的特色场景展现给游客。

技术栈:Python+机器学习TF-IDF 算法+Requests爬虫+Echarts可视化+SnowNLP(情感分析/文本数据清洗/分词/关键词抽取)+Flask

机器学习TF-IDF 算法

什么是TF-IDF?

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。

TF-IDF介绍

TF-IDF实际上是:TF * IDF。主要思想是:如果某个词或短语在一篇文章中出现的频率高(即TF高),并且在其他文章中很少出现(即IDF高),则认为此词或者短语具有很好的类别区分能力,适合用来分类。通俗理解TF-IDF就是:TF刻画了词语t对某篇文档的重要性,IDF刻画了词语t对整个文档集的重要性。

名词解释和数学算法

TF是词频(Term Frequency)表示词条在文本中出现的频率公式

在这里插入图片描述

IDF是逆向文件频率(Inverse Document Frequency)某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。如果包含词条t的文档越少,IDF越大,则说明词条具有很好的类别区分能力公式

在这里插入图片描述

解释分子|D|:语料库中的文件总数分母:包含词语的文件数目(即文件数目)如果该词语不在语料库中,就会导致分母为零。

TF-IDF实际上是:TF * IDF。某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。公式:TF-IDF=TF*IDF

TF-IDF应用举例
from jieba.analyse.tfidf import TFIDF

class WordSegmentPOSKeywordExtractor(TFIDF):
    def extract_sentence(self, sentence, keyword_ratios=None):
        """ Extract keywords from sentence using TF-IDF algorithm.
        Parameter:
        - keyword_ratios: return how many top keywords. `None` for all possible words.
        """
        words = self.postokenizer.cut(sentence)
        freq = {}
        seg_words = []
        pos_words = []
        for w in words:
            wc = w.word
            seg_words.append(wc)
            pos_words.append(w.flag)
            if len(wc.strip()) < 2 or wc.lower() in self.stop_words:
                continue
            freq[wc] = freq.get(wc, 0.0) + 1.0
            if keyword_ratios is not None and keyword_ratios > 0:
                total = sum(freq.values())
                for k in freq:
                    freq[k] *= self.idf_freq.get(k, self.median_idf) / total
                tags = sorted(freq, key=freq.__getitem__, reverse=True)
                top_k = int(keyword_ratios * len(seg_words))
                tags = tags[:top_k]
                key_words = [int(word in tags) for word in seg_words]
                return seg_words, pos_words, key_words
            else:
                return seg_words
  1. 关键词提取过程:
    • 使用 postokenizer(词性标注分词器)将输入句子划分为单词。
    • 遍历单词,过滤掉长度较短的单词和常见的停用词。
    • 构建一个频率字典(freq)以计算每个单词的出现次数。
    • 如果指定了 keyword_ratios 且大于 0,则计算每个单词的 TF-IDF 分数。
    • 根据 TF-IDF 分数降序排序单词。
    • 获取前 keyword_ratios 百分比的单词,如果 keyword_ratios 为 None,则获取所有单词。
    • 构建二进制表示(key_words),表示每个单词是否在顶部关键词中。
  2. 返回值:
    • 该方法返回三个列表:
      • seg_words:输入句子中分段的单词列表。
      • pos_words:与每个单词相对应的词性标签列表。
      • key_words:二进制值列表,指示每个单词是否在顶部关键词中。

SnowNLP

SnowNLP是一个基于Python的中文自然语言处理(NLP)库。它可以用于中文文本的分词、词性标注、情感分析、文本分类等任务。SnowNLP基于概率模型和机器学习算法,使用了一些常见的NLP技术,如隐马尔可夫模型、朴素贝叶斯分类器、最大熵模型等。它可以处理简体中文和繁体中文,支持Python 2和Python 3。SnowNLP在中文文本处理方面表现良好,是一个非常实用的NLP工具。

def search_and_get_comments(keywords):
    search_url = 'https://m.ctrip.com/restapi/h5api/globalsearch/search?action=gsonline&source=globalonline&keyword={}&t=1641209789046'
    search_url = search_url.format(keywords)
    resp = requests.get(search_url, headers=headers)
    resp = resp.json()
    search_result = resp['data'][0]
    spot_name = search_result['word']
    poiId = search_result['poiId']
    print('poiId:', poiId)
    comments = []
    for page_i in range(1, 10):
        url = "http://you.ctrip.com/destinationsite/TTDSecond/SharedView/AsynCommentView?poiID={}&districtId=702&districtEName=Yangshuo&pagenow={}&order=3.0&star=0.0&tourist=0.0&resourceId=22079&resourcetype=2".format(poiId, page_i)
        html = requests.get(url, headers=headers)
        html.encoding = "utf-8"
        soup = BeautifulSoup(html.text)
        block = soup.find_all(class_="comment_single")
        if len(block) == 0:
            break
        print('page:', page_i, ', current page comments:', len(block))
        for j in block:
            comment = j.find(class_="heightbox").text.strip()
            comment_date = j.find(class_="time_line").text.strip()
            # 文本数据清洗
            comment = remove_unicode_space(comment)
            # 评论关键词抽取
            words, _, keywords = extractor.extract_sentence(comment, keyword_ratios=0.4)
            comment_keywords = ' '.join([words[i] for i in range(len(keywords)) if keywords[i]])
            # 景点评论的情感分析
            postive_score = SnowNLP(comment).sentiments
            spot_comment_info = [comment, comment_keywords, comment_date, postive_score]
            comments.append(spot_comment_info)
    return spot_name, comments

上面的代码解析:

  1. 搜索URL构建:
    • search_url变量:构建一个搜索URL,其中 keywords 是传入的参数,用于搜索相关景点信息。这个URL包含了一些参数,如搜索动作、源、关键词等。
  2. 发起搜索请求:
    • 使用 requests.get 函数向构建好的URL发送GET请求,并使用 headers 作为请求头。返回的响应以JSON格式解析。
  3. 解析搜索结果:
    • 从JSON响应中提取出搜索结果的相关信息,主要从 resp['data'][0] 中获取景点名称(spot_name)和景点ID(poiId)。
  4. 获取景点评论:
    • 通过循环遍历页数,构建不同页数的评论获取URL,发送请求,解析HTML,提取评论信息。
    • 评论获取URL包含了参数如 poiID(景点ID)、pagenow(当前页数)等。
    • 通过BeautifulSoup解析HTML,提取出评论的块(block)。
  5. 处理评论块:
    • 循环遍历每个评论块,提取评论内容(comment)、评论日期(comment_date)等信息。
    • 对评论进行文本数据清洗,去除多余的空格。
  6. 评论关键词抽取:
    • 使用提供的 extractor 对象中的 extract_sentence 方法,抽取评论中的关键词。
    • 抽取的关键词根据TF-IDF算法得出,通过设定 keyword_ratios 参数控制关键词的数量。
  7. 情感分析:
    • 使用SnowNLP库对评论进行情感分析,计算评论的积极情感得分(postive_score),并输出最终训练结果。
  8. 保存评论信息:
    • 将每条评论的相关信息组织成列表(spot_comment_info),包括评论内容、评论关键词、评论日期、情感得分。
    • 将每条评论信息添加到 comments 列表中。
  9. 返回结果:
    • 返回景点名称(spot_name)和所有评论信息(comments)的元组。
系统注册登录界面

在这里插入图片描述

各省份热门城市分析

在这里插入图片描述

城市热门景点分析

在这里插入图片描述

热门小吃分析

在这里插入图片描述

景点评论情感分析

在这里插入图片描述

城市景点路线的智能推荐

在这里插入图片描述

在这里插入图片描述

目录

  1. 基于Python大数据机器学习的旅游数据分析可视化推荐系统
  2. 项目概述
  3. 机器学习TF-IDF 算法
  4. 什么是TF-IDF?
  5. TF-IDF介绍
  6. 名词解释和数学算法
  7. TF-IDF应用举例
  8. SnowNLP
  9. 系统注册登录界面
  10. 各省份热门城市分析
  11. 城市热门景点分析
  12. 热门小吃分析
  13. 景点评论情感分析
  14. 城市景点路线的智能推荐
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • QLExpress Java 动态脚本引擎使用指南
  • 锐龙 AI 7 H350 与锐龙 7 H255 性能对比评测
  • MATLAB 多 AI 大模型集成工具箱:DeepSeek、Kimi 等接入与代码生成
  • 前端代码分割与懒加载最佳实践
  • VS Code 内置聊天与 GitHub Copilot Chat 的区别及中文设置指南
  • 开放代理产品功能介绍
  • OpenCV 调整图像对比度与亮度的方法
  • Android WebView 内核版本升级实战指南
  • Qwen3.5-9B 技术解析:混合架构与小模型超越大参数的实践
  • 配置 OpenClaw 机器人集成钉钉与 OpenMetadata
  • Llama Factory 微调常见错误与解决方案
  • NestJS 接口响应 Message 编写规范与 API 提示标准化
  • llama.cpp 多 GPU 分布式计算优化实践
  • Windows 安装 Python 环境与配置变量指南
  • Claude Code 模型配置详解:参数、环境与实战
  • 职业安全研究人员核心技能体系与成长路径
  • FLASH 坏块监测系统算法题解
  • GitHub Copilot 插件模型选项缺失排查
  • Harness Engineering 工程化教程:AI Agent 复杂长任务可靠执行
  • PhotoEdit:一款高性能的 Android 图片编辑开源库

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online