🍊作者:计算机毕设匠心工作室
🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。
擅长:按照需求定制化开发项目、 源码、对代码进行完整讲解、文档撰写、ppt制作。
🍊心愿:点赞 👍 收藏 ⭐评论 📝
👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~
🍅 ↓↓文末获取源码联系↓↓🍅
基于大数据的携程酒店评论数据可视化分析系统-功能介绍
本系统是一个基于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
基于大数据的携程酒店评论数据可视化分析系统-结语
👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~
🍅 主页获取源码联系🍅