基于用户评论主题挖掘的旅游景点推荐系统 | 【Hadoop计算机毕业设计】爬虫大数据 附源码、文档报告、代码讲解

48 阅读6分钟

💖💖作者:计算机毕业设计杰瑞 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学校实战项目 计算机毕业设计选题推荐

基于用户评论主题挖掘的旅游景点推荐系统介绍

旅游景点推荐系统是一个基于大数据技术的智能化旅游服务平台,采用Hadoop分布式存储架构和Spark实时计算引擎构建核心数据处理能力。系统通过Django后端框架整合MySQL数据库,运用Spark SQL进行海量旅游数据的清洗、分析和挖掘,实现对景点信息的智能管理和用户行为的深度分析。前端采用Vue+ElementUI构建现代化用户界面,结合Echarts数据可视化组件展示景点热度趋势、用户评价分布等分析结果。系统核心功能涵盖景点信息管理、用户评论分析、热度统计分析、个性化推荐等模块,通过HDFS存储用户访问日志、评论数据和景点基础信息,利用Spark的分布式计算能力对这些数据进行实时处理,生成景点热度排行、用户偏好画像和智能推荐结果。平台还集成了评论举报、反馈投诉等用户交互功能,通过Python数据分析库Pandas和NumPy对用户反馈进行情感分析,为景点运营方提供数据支撑,同时为游客提供个性化的旅游决策参考。

基于用户评论主题挖掘的旅游景点推荐系统演示视频

演示视频

基于用户评论主题挖掘的旅游景点推荐系统演示图片

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

基于用户评论主题挖掘的旅游景点推荐系统代码展示

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, avg, desc, when, regexp_replace
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
def analyze_scenic_spot_popularity():
    spark = SparkSession.builder.appName("ScenicSpotPopularityAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()
    visit_logs_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/tourism_data/visit_logs/*.csv")
    comment_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/tourism_data/comments/*.csv")
    scenic_info_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/tourism_data/scenic_spots/*.csv")
    daily_visits = visit_logs_df.filter(col("visit_date") >= (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")).groupBy("scenic_spot_id", "visit_date").agg(count("user_id").alias("daily_visit_count"))
    avg_daily_visits = daily_visits.groupBy("scenic_spot_id").agg(avg("daily_visit_count").alias("avg_daily_visits"))
    comment_stats = comment_df.groupBy("scenic_spot_id").agg(count("comment_id").alias("comment_count"), avg("rating").alias("avg_rating"))
    popularity_score = avg_daily_visits.join(comment_stats, "scenic_spot_id", "left").withColumn("popularity_score", (col("avg_daily_visits") * 0.6 + col("comment_count") * 0.2 + col("avg_rating") * 20 * 0.2))
    final_result = popularity_score.join(scenic_info_df, "scenic_spot_id", "inner").select("scenic_spot_id", "scenic_name", "location", "popularity_score", "avg_daily_visits", "comment_count", "avg_rating").orderBy(desc("popularity_score"))
    popularity_data = final_result.limit(20).toPandas().to_dict('records')
    spark.stop()
    return popularity_data
def generate_personalized_recommendations(user_id):
    spark = SparkSession.builder.appName("PersonalizedRecommendation").config("spark.sql.adaptive.enabled", "true").getOrCreate()
    user_history_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/tourism_data/user_visits/*.csv").filter(col("user_id") == user_id)
    all_visits_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/tourism_data/user_visits/*.csv")
    scenic_features_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/tourism_data/scenic_features/*.csv")
    user_preferences = user_history_df.join(scenic_features_df, "scenic_spot_id", "inner").groupBy("category", "price_level").agg(count("visit_id").alias("preference_count")).orderBy(desc("preference_count"))
    preferred_categories = user_preferences.select("category").limit(3).rdd.map(lambda row: row.category).collect()
    preferred_price_levels = user_preferences.select("price_level").limit(2).rdd.map(lambda row: row.price_level).collect()
    visited_spots = user_history_df.select("scenic_spot_id").rdd.map(lambda row: row.scenic_spot_id).collect()
    similar_users_df = all_visits_df.filter(col("scenic_spot_id").isin(visited_spots) & (col("user_id") != user_id)).groupBy("user_id").agg(count("visit_id").alias("common_visits")).filter(col("common_visits") >= 3).orderBy(desc("common_visits")).limit(10)
    similar_user_visits = similar_users_df.join(all_visits_df, "user_id", "inner").filter(~col("scenic_spot_id").isin(visited_spots)).groupBy("scenic_spot_id").agg(count("visit_id").alias("similar_user_visits"))
    category_matches = scenic_features_df.filter(col("category").isin(preferred_categories)).withColumn("category_score", when(col("category").isin(preferred_categories[:1]), 3).when(col("category").isin(preferred_categories[1:2]), 2).otherwise(1))
    price_matches = category_matches.filter(col("price_level").isin(preferred_price_levels)).withColumn("price_score", when(col("price_level").isin(preferred_price_levels[:1]), 2).otherwise(1))
    final_recommendations = price_matches.join(similar_user_visits, "scenic_spot_id", "left").fillna({"similar_user_visits": 0}).withColumn("recommendation_score", col("category_score") + col("price_score") + col("similar_user_visits") * 0.5).filter(~col("scenic_spot_id").isin(visited_spots)).orderBy(desc("recommendation_score"))
    recommendations = final_recommendations.select("scenic_spot_id", "scenic_name", "category", "location", "recommendation_score").limit(10).toPandas().to_dict('records')
    spark.stop()
    return recommendations
def analyze_user_comments_sentiment():
    spark = SparkSession.builder.appName("CommentSentimentAnalysis").config("spark.sql.adaptive.enabled", "true").getOrCreate()
    comments_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/tourism_data/comments/*.csv").filter(col("comment_date") >= (datetime.now() - timedelta(days=90)).strftime("%Y-%m-%d"))
    cleaned_comments = comments_df.withColumn("cleaned_content", regexp_replace(col("comment_content"), "[^\\u4e00-\\u9fa5a-zA-Z0-9\\s]", "")).filter(col("cleaned_content") != "")
    positive_keywords = ["好", "棒", "美", "推荐", "值得", "满意", "不错", "喜欢", "舒服", "开心"]
    negative_keywords = ["差", "烂", "坑", "贵", "脏", "乱", "失望", "后悔", "糟糕", "不好"]
    sentiment_analysis = cleaned_comments
    for keyword in positive_keywords:
        sentiment_analysis = sentiment_analysis.withColumn("positive_count", when(col("cleaned_content").contains(keyword), col("positive_count").cast("int") + 1).otherwise(col("positive_count").cast("int")))
    for keyword in negative_keywords:
        sentiment_analysis = sentiment_analysis.withColumn("negative_count", when(col("cleaned_content").contains(keyword), col("negative_count").cast("int") + 1).otherwise(col("negative_count").cast("int")))
    sentiment_analysis = sentiment_analysis.fillna({"positive_count": 0, "negative_count": 0}).withColumn("sentiment_score", (col("positive_count") - col("negative_count")) / (col("positive_count") + col("negative_count") + 1))
    sentiment_analysis = sentiment_analysis.withColumn("sentiment_label", when(col("sentiment_score") > 0.1, "positive").when(col("sentiment_score") < -0.1, "negative").otherwise("neutral"))
    scenic_sentiment_stats = sentiment_analysis.groupBy("scenic_spot_id", "sentiment_label").agg(count("comment_id").alias("sentiment_count")).groupBy("scenic_spot_id").pivot("sentiment_label").agg({"sentiment_count": "first"}).fillna(0)
    scenic_sentiment_stats = scenic_sentiment_stats.withColumn("total_comments", col("positive") + col("negative") + col("neutral")).withColumn("positive_rate", col("positive") / col("total_comments")).withColumn("negative_rate", col("negative") / col("total_comments"))
    sentiment_results = scenic_sentiment_stats.join(spark.read.option("header", "true").csv("hdfs://localhost:9000/tourism_data/scenic_spots/*.csv"), "scenic_spot_id", "inner").select("scenic_spot_id", "scenic_name", "positive_rate", "negative_rate", "total_comments").orderBy(desc("positive_rate"))
    sentiment_data = sentiment_results.limit(50).toPandas().to_dict('records')
    spark.stop()
    return sentiment_data

基于用户评论主题挖掘的旅游景点推荐系统文档展示

在这里插入图片描述

💖💖作者:计算机毕业设计杰瑞 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学校实战项目 计算机毕业设计选题推荐