【Python大数据+AI毕设实战】携程酒店评论数据可视化分析系统、Hadoop、计算机毕业设计

112 阅读8分钟

🍊作者:计算机毕设匠心工作室

🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。

擅长:按照需求定制化开发项目、 源码、对代码进行完整讲解、文档撰写、ppt制作。

🍊心愿:点赞 👍 收藏 ⭐评论 📝

👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~

Java实战项目

Python实战项目

微信小程序|安卓实战项目

大数据实战项目

PHP|C#.NET|Golang实战项目

🍅 ↓↓文末获取源码联系↓↓🍅

基于大数据的携程酒店评论数据可视化分析系统-功能介绍

本系统是一个基于Python大数据技术栈的携程酒店评论数据可视化分析平台,采用Hadoop+Spark分布式计算框架作为数据处理引擎,结合Django后端框架和Vue+Echarts前端技术实现完整的数据分析与可视化展示。系统从携程平台采集真实酒店评论数据,包含酒店基础信息、用户评分、评论文本、入住类型等20个维度字段,通过Spark SQL进行高效的数据清洗与预处理,运用HDFS分布式存储管理海量评论数据。系统实现了27个细分的数据分析维度,涵盖酒店评分分布分析、用户行为模式挖掘、评论文本情感分析、城市酒店对比分析等五大核心模块。特别在文本挖掘方面,系统运用LDA主题模型算法深度挖掘用户评论中的潜在主题,通过词云可视化展示用户印象关键词,并结合情感分析技术对比高分与低分评论的关键差异。整个系统充分发挥Spark分布式计算优势处理大规模数据集,利用Pandas和NumPy进行数据统计分析,最终通过Echarts图表库将分析结果以柱状图、折线图、饼图、热力图等多种形式直观呈现,为酒店经营者提供数据驱动的决策支持,也为用户选择酒店提供参考依据。

基于大数据的携程酒店评论数据可视化分析系统-选题背景意义

选题背景 随着在线旅游预订平台的普及发展,携程等OTA平台已经成为大众预订酒店的主要渠道,这些平台每天积累着海量的用户评论数据。这些评论数据不仅包含用户的评分信息,还包含丰富的文本描述、入住类型、时间信息等多维度内容,真实反映了用户对酒店服务质量的感受和意见。传统的人工阅读方式已经无法高效处理如此庞大的数据量,而这些看似杂乱的评论数据背后实际蕴含着用户偏好、服务短板、市场趋势等宝贵信息。大数据技术的成熟为处理这类问题提供了技术基础,Hadoop和Spark这类分布式计算框架能够高效处理PB级数据,而自然语言处理技术的发展也让文本情感分析和主题挖掘成为可能。在这样的背景下,构建一个能够自动化处理海量酒店评论、挖掘有价值信息并进行可视化展示的系统具有实际应用价值,也契合当前大数据技术在旅游行业应用的发展方向。 选题意义 本课题作为一个毕业设计项目,在实践层面能够帮助理解大数据技术在真实业务场景中的应用方式。通过搭建Hadoop+Spark分布式计算环境,可以掌握HDFS数据存储、Spark SQL数据处理等核心技术的实际操作流程,这些技术正是目前企业处理海量数据的主流方案。系统实现的27个分析维度涵盖了数据清洗、统计分析、文本挖掘、可视化展示等完整数据处理链路,能够比较全面地锻炼数据处理能力。从应用角度看,系统分析酒店评分分布、用户印象关键词、不同城市酒店对比等功能,可以为酒店管理者了解自身服务短板提供一定的参考,比如通过高低分评论关键词对比发现用户在意的具体问题。对于普通用户而言,系统展示的酒店综合评分、推荐率、用户印象等可视化信息,也能在选择酒店时提供更直观的参考依据。另外LDA主题模型和情感分析等AI算法的引入,让系统不仅停留在简单的统计层面,而是能够深入挖掘文本数据背后的语义信息,体现了将机器学习算法应用于实际问题的探索尝试。整体来说,这个课题将大数据处理、文本分析、可视化展示等多个技术环节串联起来,作为毕设项目能够比较完整地展示技术应用能力。

基于大数据的携程酒店评论数据可视化分析系统-技术选型

大数据框架:Hadoop+Spark(本次没用Hive,支持定制) 开发语言:Python+Java(两个版本都支持) 后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持) 前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery 详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy 数据库:MySQL

基于大数据的携程酒店评论数据可视化分析系统-视频展示

基于大数据的携程酒店评论数据可视化分析系统-视频展示

基于大数据的携程酒店评论数据可视化分析系统-图片展示

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

基于大数据的携程酒店评论数据可视化分析系统-代码展示

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, avg, count, sum as spark_sum, round as spark_round, desc, explode, split, regexp_extract, when, lit, lower, trim
from pyspark.sql.types import FloatType, IntegerType
import jieba
import jieba.analyse
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import pandas as pd
import numpy as np
from snownlp import SnowNLP
import re
spark = SparkSession.builder.appName("CtripHotelAnalysis").config("spark.sql.shuffle.partitions", "4").config("spark.driver.memory", "4g").config("spark.executor.memory", "4g").getOrCreate()
def analyze_hotel_score_distribution(input_path, output_path):
    df = spark.read.csv(input_path, header=True, inferSchema=True)
    df = df.withColumn("comment_score", col("comment_score").cast(FloatType()))
    df = df.filter(col("comment_score") > 0)
    df = df.withColumn("score_range", 
        when((col("comment_score") >= 4.5) & (col("comment_score") <= 5.0), "4.5-5.0分")
        .when((col("comment_score") >= 4.0) & (col("comment_score") < 4.5), "4.0-4.5分")
        .when((col("comment_score") >= 3.5) & (col("comment_score") < 4.0), "3.5-4.0分")
        .when((col("comment_score") >= 3.0) & (col("comment_score") < 3.5), "3.0-3.5分")
        .otherwise("3.0分以下"))
    score_dist = df.groupBy("score_range").agg(
        count("hotel_id").alias("hotel_count"),
        spark_round(avg("comment_score"), 2).alias("avg_score")
    ).orderBy(desc("hotel_count"))
    total_hotels = df.select("hotel_id").distinct().count()
    score_dist = score_dist.withColumn("percentage", 
        spark_round((col("hotel_count") / lit(total_hotels)) * 100, 2))
    score_dist = score_dist.select("score_range", "hotel_count", "avg_score", "percentage")
    result_df = score_dist.toPandas()
    result_df.columns = ['评分区间', '酒店数量', '平均评分', '占比百分比']
    result_df.to_csv(output_path, index=False, encoding='utf-8-sig')
    return result_df
def analyze_comment_sentiment_and_keywords(input_path, output_path_sentiment, output_path_high_keywords, output_path_low_keywords):
    df = spark.read.csv(input_path, header=True, inferSchema=True)
    df = df.filter(col("comment_txt").isNotNull())
    df = df.filter(col("comment_txt") != "")
    df = df.withColumn("user_comment_score", col("user_comment_score").cast(FloatType()))
    comment_data = df.select("comment_txt", "user_comment_score").collect()
    sentiment_results = []
    for row in comment_data:
        comment_text = row["comment_txt"]
        user_score = row["user_comment_score"]
        try:
            s = SnowNLP(comment_text)
            sentiment_score = round(s.sentiments, 2)
            sentiment_label = "正面" if sentiment_score >= 0.6 else ("中性" if sentiment_score >= 0.4 else "负面")
            sentiment_results.append({
                "comment_text": comment_text[:50] + "..." if len(comment_text) > 50 else comment_text,
                "user_score": user_score,
                "sentiment_score": sentiment_score,
                "sentiment_label": sentiment_label
            })
        except:
            continue
    sentiment_df = pd.DataFrame(sentiment_results)
    sentiment_summary = sentiment_df.groupby("sentiment_label").agg({
        "sentiment_score": "mean",
        "user_score": "mean",
        "comment_text": "count"
    }).reset_index()
    sentiment_summary.columns = ['情感类别', '平均情感得分', '平均用户评分', '评论数量']
    sentiment_summary['平均情感得分'] = sentiment_summary['平均情感得分'].round(2)
    sentiment_summary['平均用户评分'] = sentiment_summary['平均用户评分'].round(2)
    sentiment_summary.to_csv(output_path_sentiment, index=False, encoding='utf-8-sig')
    high_score_comments = [row["comment_txt"] for row in comment_data if row["user_comment_score"] >= 4.5]
    low_score_comments = [row["comment_txt"] for row in comment_data if row["user_comment_score"] <= 3.0]
    stopwords = set(['的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这'])
    def extract_keywords(comments, top_n=30):
        all_words = []
        for comment in comments:
            words = jieba.cut(comment)
            filtered_words = [w for w in words if len(w) >= 2 and w not in stopwords]
            all_words.extend(filtered_words)
        word_freq = pd.Series(all_words).value_counts().head(top_n)
        return pd.DataFrame({'关键词': word_freq.index, '出现次数': word_freq.values})
    high_keywords_df = extract_keywords(high_score_comments)
    high_keywords_df.to_csv(output_path_high_keywords, index=False, encoding='utf-8-sig')
    low_keywords_df = extract_keywords(low_score_comments)
    low_keywords_df.to_csv(output_path_low_keywords, index=False, encoding='utf-8-sig')
    return sentiment_summary, high_keywords_df, low_keywords_df
def analyze_lda_topic_modeling(input_path, output_path, n_topics=5, n_top_words=10):
    df = spark.read.csv(input_path, header=True, inferSchema=True)
    df = df.filter(col("comment_txt").isNotNull())
    df = df.filter(col("comment_txt") != "")
    comments = df.select("comment_txt").rdd.flatMap(lambda x: x).collect()
    stopwords = set(['的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这', '个', '里', '为', '子', '中', '大', '来', '小', '么', '于', '自', '给', '从', '两', '啊', '让', '与', '但', '把', '还', '之'])
    def tokenize_chinese(text):
        words = jieba.cut(text)
        return ' '.join([w for w in words if len(w) >= 2 and w not in stopwords])
    processed_comments = [tokenize_chinese(comment) for comment in comments if len(comment) > 10]
    vectorizer = CountVectorizer(max_features=1000, min_df=5, max_df=0.7)
    doc_term_matrix = vectorizer.fit_transform(processed_comments)
    feature_names = vectorizer.get_feature_names_out()
    lda_model = LatentDirichletAllocation(n_components=n_topics, random_state=42, max_iter=20, learning_method='batch')
    lda_model.fit(doc_term_matrix)
    topics_data = []
    for topic_idx, topic in enumerate(lda_model.components_):
        top_indices = topic.argsort()[-n_top_words:][::-1]
        top_words = [feature_names[i] for i in top_indices]
        top_weights = [round(topic[i], 2) for i in top_indices]
        topic_name = f"主题{topic_idx + 1}"
        topic_description = "、".join(top_words[:5])
        for word, weight in zip(top_words, top_weights):
            topics_data.append({
                '主题编号': topic_name,
                '主题描述': topic_description,
                '关键词': word,
                '权重': weight
            })
    topics_df = pd.DataFrame(topics_data)
    topics_df.to_csv(output_path, index=False, encoding='utf-8-sig')
    doc_topic_dist = lda_model.transform(doc_term_matrix)
    topic_distribution = doc_topic_dist.sum(axis=0)
    topic_percentage = (topic_distribution / topic_distribution.sum() * 100).round(2)
    topic_summary = pd.DataFrame({
        '主题编号': [f"主题{i+1}" for i in range(n_topics)],
        '文档占比': topic_percentage
    })
    return topics_df, topic_summary

基于大数据的携程酒店评论数据可视化分析系统-结语

👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~

Java实战项目

Python实战项目

微信小程序|安卓实战项目

大数据实战项目

PHP|C#.NET|Golang实战项目

🍅 主页获取源码联系🍅