✨作者主页 :IT研究室✨
个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。
☑文末获取源码☑
文章目录
一、前言
系统介绍
本系统名为《基于大数据的AI助手系统性软件缺陷评论挖掘与可视化》,面向软件缺陷评论数据的采集、清洗、挖掘与可视化分析场景,采用Python+Django作为后端开发框架,前端基于Vue+ElementUI+Echarts构建交互界面,大数据处理层依托Hadoop+HDFS进行数据存储、Spark与Spark SQL完成评论数据的分布式计算与特征提取,辅以Pandas、NumPy做数据预处理与统计运算,MySQL承担业务数据与元数据的持久化。系统功能涵盖智慧中心数据大屏总览、缺陷评论分析、样本统计、用户评论管理、评论NLP处理、简评数据管理以及字段词典维护等模块,能够对海量软件缺陷评论进行情感倾向识别、关键词提取与缺陷类型归集,并通过Echarts将分析结果以图表形式直观呈现,帮助使用者从杂乱的评论数据中快速定位系统性缺陷的分布规律与演化趋势,为缺陷评论的智能化分析提供一套可运行、可扩展的毕业设计级实现方案。
选题背景
随着软件系统规模越来越大,用户在应用商店、issue跟踪平台和社区论坛里留下的缺陷评论数量增长得很快,这些评论里既有对崩溃、卡顿、功能异常的描述,也夹杂着大量口语化表达和无关信息,靠人工逐条翻看基本不现实。传统做法多用Excel或简单脚本做统计,面对几十万条评论时处理效率低,也很难把评论内容和缺陷类型对应起来。近几年Hadoop、Spark这类大数据框架逐渐成熟,分布式存储和计算让海量文本的批量处理变得可行,Spark SQL和Pandas也能较快完成评论数据的清洗与聚合。与此同时,NLP技术在短文本情感分析和关键词抽取上的应用越来越普遍,把大数据处理能力和评论挖掘结合起来,对软件缺陷评论做系统性分析并可视化呈现,就成为一个比较实际的技术方向,本课题正是在这样的背景下提出的。
选题意义
从实际角度看,本课题把缺陷评论从"堆着没人看"变成"能查能看"的东西,使用者可以通过大屏和图表较快了解评论中反映的缺陷集中在哪里、哪类问题被提得最多,省去大量人工翻阅的时间,对缺陷评论的初步筛查有一定帮助。从技术学习角度看,课题把Hadoop、Spark、Django和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
三、系统界面展示
- 基于大数据的AI助手系统性软件缺陷评论挖掘与可视化界面展示:








四、代码参考
- 项目实战代码参考:
java(贴上部分代码)
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, when, length, explode, split
from pyspark.ml.feature import Tokenizer, StopWordsRemover, HashingTF, IDF
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.db.models import Count, Avg
from .models import Comment, SampleStat, DictField
import pandas as pd
import numpy as np
import json
import re
spark = SparkSession.builder.appName("DefectCommentMining").master("local[*]").config("spark.sql.shuffle.partitions", "4").getOrCreate()
@csrf_exempt
def comment_analysis(request):
if request.method != "POST":
return JsonResponse({"code": 400, "msg": "method not allowed"})
params = json.loads(request.body.decode("utf-8"))
defect_type = params.get("defect_type", "")
start_date = params.get("start_date", "")
end_date = params.get("end_date", "")
queryset = Comment.objects.all()
if defect_type:
queryset = queryset.filter(defect_type=defect_type)
if start_date and end_date:
queryset = queryset.filter(create_time__range=(start_date, end_date))
records = list(queryset.values("id", "content", "defect_type", "sentiment", "create_time"))
if not records:
return JsonResponse({"code": 200, "data": {"total": 0, "trend": [], "type_dist": []}})
pdf = pd.DataFrame(records)
pdf["content_len"] = pdf["content"].astype(str).apply(len)
pdf = pdf[pdf["content_len"] >= 5]
sdf = spark.createDataFrame(pdf)
sdf = sdf.withColumn("clean_content", regexp_replace(col("content"), "[^\\u4e00-\\u9fa5a-zA-Z0-9]", ""))
sdf = sdf.filter(length(col("clean_content")) > 0)
type_dist = sdf.groupBy("defect_type").agg(count("*").alias("cnt")).orderBy(col("cnt").desc()).collect()
trend = sdf.groupBy("create_time").agg(count("*").alias("cnt")).orderBy("create_time").collect()
result = {
"total": sdf.count(),
"type_dist": [{"type": row["defect_type"], "count": row["cnt"]} for row in type_dist],
"trend": [{"date": str(row["create_time"]), "count": row["cnt"]} for row in trend]
}
return JsonResponse({"code": 200, "data": result})
@csrf_exempt
def comment_nlp(request):
if request.method != "POST":
return JsonResponse({"code": 400, "msg": "method not allowed"})
params = json.loads(request.body.decode("utf-8"))
batch_size = int(params.get("batch_size", 500))
comments = Comment.objects.filter(nlp_done=False)[:batch_size]
if not comments:
return JsonResponse({"code": 200, "msg": "no pending comment", "data": []})
rows = [{"id": c.id, "content": c.content} for c in comments]
sdf = spark.createDataFrame(rows)
tokenizer = Tokenizer(inputCol="content", outputCol="words")
words_df = tokenizer.transform(sdf)
remover = StopWordsRemover(inputCol="words", outputCol="filtered")
filtered_df = remover.transform(words_df)
hashing_tf = HashingTF(inputCol="filtered", outputCol="raw_features", numFeatures=2000)
featurized = hashing_tf.transform(filtered_df)
idf = IDF(inputCol="raw_features", outputCol="features")
idf_model = idf.fit(featurized)
result_df = idf_model.transform(featurized)
keyword_rows = result_df.select("id", explode("filtered").alias("keyword")).groupBy("id", "keyword").count().orderBy(col("count").desc()).collect()
keyword_map = {}
for row in keyword_rows:
keyword_map.setdefault(row["id"], []).append(row["keyword"])
output = []
for c in comments:
keywords = keyword_map.get(c.id, [])[:5]
sentiment = "positive" if any(k in ["好用", "流畅", "稳定"] for k in keywords) else "negative"
Comment.objects.filter(id=c.id).update(nlp_done=True, keywords=",".join(keywords), sentiment=sentiment)
output.append({"id": c.id, "keywords": keywords, "sentiment": sentiment})
return JsonResponse({"code": 200, "data": output})
@csrf_exempt
def sample_stat(request):
if request.method != "POST":
return JsonResponse({"code": 400, "msg": "method not allowed"})
params = json.loads(request.body.decode("utf-8"))
group_field = params.get("group_field", "defect_type")
min_count = int(params.get("min_count", 1))
comments = Comment.objects.values("defect_type", "sentiment", "create_time")
if not comments:
return JsonResponse({"code": 200, "data": {"groups": [], "summary": {}}})
pdf = pd.DataFrame(list(comments))
pdf["create_time"] = pd.to_datetime(pdf["create_time"]).dt.strftime("%Y-%m-%d")
sdf = spark.createDataFrame(pdf)
stat_df = sdf.groupBy(group_field).agg(count("*").alias("total"), count(when(col("sentiment") == "negative", True)).alias("negative_cnt"))
stat_df = stat_df.filter(col("total") >= min_count).orderBy(col("total").desc())
stat_rows = stat_df.collect()
summary = {
"total_comment": sdf.count(),
"total_group": len(stat_rows),
"avg_negative_rate": round(float(np.mean([r["negative_cnt"] / r["total"] for r in stat_rows])) if stat_rows else 0, 4)
}
groups = [{"group": row[group_field], "total": row["total"], "negative": row["negative_cnt"]} for row in stat_rows]
for g in groups:
SampleStat.objects.update_or_create(group_name=g["group"], defaults={"total": g["total"], "negative": g["negative"]})
return JsonResponse({"code": 200, "data": {"groups": groups, "summary": summary}})
五、系统视频
基于大数据的AI助手系统性软件缺陷评论挖掘与可视化项目视频:
结语
最新大数据毕业设计选题推荐-基于大数据的AI助手系统性软件缺陷评论挖掘与可视化-大数据-Spark-Hadoop-Bigdata
想看其他类型的计算机毕业设计作品也可以和我说都有 谢谢大家!
有技术这一块问题大家可以评论区交流或者私我~
大家可以帮忙点赞、收藏、关注、评论啦~
源码获取:⬇⬇⬇