答辩现场导师连连点头:无人驾驶网约车舆情大数据可视化分析系统技术展示

57 阅读8分钟

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

💕💕文末获取源码

@TOC

无人驾驶网约车舆情大数据可视化分析系统技术展示-系统功能介绍

基于大数据的无人驾驶网约车抖音社会舆情可视化分析系统是一个集成了Hadoop分布式存储、Spark大数据处理引擎的现代化舆情监测平台。该系统采用Python+Java双语言支持,后端基于Django和SpringBoot双框架架构,前端运用Vue+ElementUI+Echarts技术栈构建响应式用户界面。系统通过HDFS分布式文件系统存储海量抖音评论数据,利用Spark SQL和Pandas、NumPy进行高效数据清洗与预处理。核心功能覆盖舆情情感分析、用户画像构建、话题内容挖掘、传播互动分析四大维度,实现评论情感极性识别、地域分布统计、热点话题提取、用户活跃度分析等27项具体分析功能。系统通过Echarts可视化组件将复杂的大数据分析结果转化为直观的图表展示,支持情感时间演变趋势、地域情感差异对比、关键词云图生成等多种可视化形式,为企业决策者和研究人员提供全面的无人驾驶网约车社会舆情洞察。

无人驾驶网约车舆情大数据可视化分析系统技术展示-系统技术介绍

大数据框架: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

无人驾驶网约车舆情大数据可视化分析系统技术展示-系统背景意义

随着人工智能技术的快速发展和汽车工业的数字化转型,无人驾驶技术逐渐从概念走向实际应用,网约车行业成为无人驾驶技术商业化落地的重要试验场。抖音作为当前最具影响力的短视频社交平台,汇聚了大量关于无人驾驶网约车的讨论内容,用户通过视频、评论等形式表达对这一新兴技术的看法和态度。这些海量的用户生成内容蕴含着丰富的社会舆情信息,反映了公众对无人驾驶技术的接受度、关注点和担忧。传统的舆情分析方法往往依赖人工统计和小样本分析,面对抖音平台每日产生的海量评论数据显得力不从心。大数据技术的成熟为处理这类非结构化文本数据提供了强有力的技术支撑,Hadoop和Spark等分布式计算框架能够高效处理TB级别的社交媒体数据,为深度挖掘无人驾驶网约车社会舆情提供了技术可能性。 本系统的开发具有多重实际价值和理论意义。从技术层面来看,系统整合了大数据存储、分布式计算、情感分析、数据可视化等多项前沿技术,为大数据在社会舆情分析领域的应用提供了具体的实践案例,丰富了大数据技术在垂直行业的应用模式。对于无人驾驶和网约车行业而言,系统能够帮助企业和政策制定者及时了解公众态度变化,识别潜在的舆情风险点,为技术推广策略调整和公众沟通提供数据支撑。学术研究方面,系统构建的多维度分析框架为社交媒体舆情研究提供了新的分析视角和方法论参考,特别是在新兴技术社会接受度研究领域具有一定的探索价值。从教育角度考虑,该系统作为毕业设计项目,涵盖了从数据采集、存储、处理到可视化展示的完整技术链条,为学习和掌握大数据技术栈提供了综合性的实践平台。虽然作为学生项目在功能深度和处理规模上有一定局限性,但其技术架构和分析思路对于理解现代化舆情监测系统的构建具有良好的参考价值。

无人驾驶网约车舆情大数据可视化分析系统技术展示-系统演示视频

演示视频

无人驾驶网约车舆情大数据可视化分析系统技术展示-系统演示图片

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

无人驾驶网约车舆情大数据可视化分析系统技术展示-系统部分代码

from pyspark.sql import SparkSession

from pyspark.sql.functions import col, when, regexp_replace, split, explode, count, desc, avg, sum as spark_sum

from pyspark.ml.feature import Tokenizer, StopWordsRemover

from textblob import TextBlob

import pandas as pd

import numpy as np

from collections import Counter

import re

import jieba

from snownlp import SnowNLP

spark = SparkSession.builder.appName("DouYinSentimentAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()

def sentiment_analysis_processing():

    df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/douyin_data").option("dbtable", "comments").option("user", "root").option("password", "123456").load()

    sentiment_udf = spark.udf.register("sentiment_score", lambda text: float(SnowNLP(text).sentiments))

    df_with_sentiment = df.withColumn("sentiment_score", sentiment_udf(col("comment_content")))

    df_classified = df_with_sentiment.withColumn("sentiment_label", when(col("sentiment_score") > 0.6, "positive").when(col("sentiment_score") < 0.4, "negative").otherwise("neutral"))

    sentiment_distribution = df_classified.groupBy("sentiment_label").agg(count("*").alias("count"), avg("like_count").alias("avg_likes"), avg("reply_count").alias("avg_replies"))

    time_sentiment = df_classified.withColumn("comment_date", col("comment_time").cast("date")).groupBy("comment_date", "sentiment_label").agg(count("*").alias("daily_count"))

    video_type_sentiment = df_classified.groupBy("video_attitude", "video_tone", "sentiment_label").agg(count("*").alias("count"), avg("sentiment_score").alias("avg_score"))

    high_impact_comments = df_classified.filter((col("like_count") > 100) | (col("reply_count") > 50)).select("comment_content", "sentiment_label", "sentiment_score", "like_count", "reply_count")

    positive_words = df_classified.filter(col("sentiment_label") == "positive").select("comment_content").rdd.flatMap(lambda row: jieba.cut(row[0])).filter(lambda word: len(word) > 1).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b).sortBy(lambda x: x[1], ascending=False).take(100)

    negative_words = df_classified.filter(col("sentiment_label") == "negative").select("comment_content").rdd.flatMap(lambda row: jieba.cut(row[0])).filter(lambda word: len(word) > 1).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b).sortBy(lambda x: x[1], ascending=False).take(100)

    sentiment_results = {"distribution": sentiment_distribution.collect(), "time_trend": time_sentiment.collect(), "video_type_analysis": video_type_sentiment.collect(), "high_impact": high_impact_comments.collect(), "positive_words": positive_words, "negative_words": negative_words}

    return sentiment_results

def regional_user_analysis_processing():

    df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/douyin_data").option("dbtable", "comments").option("user", "root").option("password", "123456").load()

    ip_pattern = r'^(\d{1,3}\.\d{1,3}\.\d{1,3})\.'

    df_with_region = df.withColumn("ip_prefix", regexp_replace(col("user_ip"), ip_pattern, "$1")).withColumn("region", when(col("ip_prefix").startswith("110"), "北京").when(col("ip_prefix").startswith("121"), "上海").when(col("ip_prefix").startswith("113"), "广东").when(col("ip_prefix").startswith("117"), "山东").when(col("ip_prefix").startswith("119"), "河南").otherwise("其他"))

    regional_distribution = df_with_region.groupBy("region").agg(count("*").alias("comment_count"), avg("like_count").alias("avg_likes"), avg("reply_count").alias("avg_replies"))

    sentiment_udf = spark.udf.register("get_sentiment", lambda text: "positive" if SnowNLP(text).sentiments > 0.6 else ("negative" if SnowNLP(text).sentiments < 0.4 else "neutral"))

    regional_sentiment = df_with_region.withColumn("sentiment", sentiment_udf(col("comment_content"))).groupBy("region", "sentiment").agg(count("*").alias("count"))

    user_activity = df_with_region.groupBy("user_id", "region").agg(count("*").alias("comment_frequency"), avg("like_count").alias("avg_user_likes"))

    active_users = user_activity.filter(col("comment_frequency") > 5).groupBy("region").agg(count("*").alias("active_user_count"))

    regional_topics = df_with_region.select("region", "comment_content").rdd.groupByKey().mapValues(lambda comments: Counter([word for comment in comments for word in jieba.cut(comment) if len(word) > 1]).most_common(20)).collect()

    user_signature_analysis = df_with_region.filter(col("user_signature").isNotNull()).select("region", "user_signature").rdd.groupByKey().mapValues(lambda sigs: Counter([word for sig in sigs for word in jieba.cut(sig) if len(word) > 1]).most_common(10)).collect()

    regional_results = {"distribution": regional_distribution.collect(), "sentiment_analysis": regional_sentiment.collect(), "user_activity": user_activity.collect(), "active_users": active_users.collect(), "regional_topics": regional_topics, "signature_analysis": user_signature_analysis}

    return regional_results

def topic_content_analysis_processing():

    df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/douyin_data").option("dbtable", "comments").option("user", "root").option("password", "123456").load()

    stop_words = ['的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这']

    comment_words = df.select("comment_content").rdd.flatMap(lambda row: [word for word in jieba.cut(row[0]) if len(word) > 1 and word not in stop_words])

    hot_topics = comment_words.map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b).sortBy(lambda x: x[1], ascending=False).take(50)

    video_interaction = df.groupBy("video_content", "video_duration").agg(avg("like_count").alias("avg_likes"), avg("reply_count").alias("avg_replies"), count("*").alias("comment_count"))

    keyword_extraction = df.select("comment_content").rdd.flatMap(lambda row: re.findall(r'[安全|技术|自动驾驶|无人|智能|危险|事故|失业|工作|司机]', row[0])).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b).collect()

    safety_concerns = df.filter(col("comment_content").rlike(".*[安全|危险|事故|风险].*")).select("comment_content", "like_count", "reply_count")

    employment_discussions = df.filter(col("comment_content").rlike(".*[失业|工作|司机|就业].*")).select("comment_content", "like_count", "reply_count")

    author_influence = df.groupBy("video_author").agg(avg("like_count").alias("avg_likes"), avg("reply_count").alias("avg_replies"), count("*").alias("video_count")).orderBy(desc("avg_likes"))

    controversial_topics = df.filter((col("reply_count") > 20) & (col("like_count") < 10)).select("comment_content", "like_count", "reply_count")

    technical_discussions = df.filter(col("comment_content").rlike(".*[算法|传感器|雷达|AI|人工智能|深度学习].*")).select("comment_content", "like_count", "reply_count")

    topic_results = {"hot_topics": hot_topics, "video_interaction": video_interaction.collect(), "keywords": keyword_extraction, "safety_concerns": safety_concerns.collect(), "employment_talks": employment_discussions.collect(), "author_influence": author_influence.collect(), "controversial": controversial_topics.collect(), "technical": technical_discussions.collect()}

    return topic_results

无人驾驶网约车舆情大数据可视化分析系统技术展示-结语

💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。