这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
基于大数据的社交平台数据爬虫舆情分析可视化系统
学长这里给一个题目综合评分(每项满分5分)
基于Python的社交平台大数据挖掘及其可视化。
Hashtag统计
地理位置信息的可视化
话题结果可视化
矩阵图
旭日图
情感分析的可视化
2003年,D.Blei等人提出了广受欢迎的LDA(Latentdirichlet allocation)主题模型[8]。LDA除了进行主题的分析外,还可以运用于文本分类、推荐系统等方面。
LDA模型可以描述为一个“上帝掷骰子”的过程,首先,从主题库中随机抽取一个主题,该主题编号为K,接着从骰子库中拿出编号为K的骰子X,进行投掷,每投掷一次,就得到了一个词。不断的投掷它,直到到达预计的文本长度为止。简单的说,这一过程就是“随机的选择某个主题,然后从该主题中随机的选择词语”。按照之前的描述,一篇文档中词语生成的概率为:
可以用矩阵的乘法来表示上述的过程:
回到LDA模型来说,LDA模型的输入是一篇一篇用BOW(bag of words)表示的文档,即用该文档中无序的单词序列来表示该文档(忽略文档中的语法和词语的先后关系)。LDA的输出是每篇文档的主题分布矩阵和每个主题下的单词分布矩阵。简而言之,LDA主题模型的任务就是已知左边的矩阵,通过一些方法,得到右边两个小矩阵。这里的“一些方法”即为LDA采样的方法,目前最主要的有两种,一种是变分贝叶斯推断(variationalBayes, VB),另一种叫做吉布斯采样(Gibbs Sampling),其中吉布斯采样也被称为蒙特卡洛马尔可夫 (Markov Chain Monte Carlo,MCMC)采样方法。
总的来说,MCMC实现起来更加简单方便,而VB的速度比MCMC来得快,研究表明他们具有差不多相同的效果。所以,对于大量的数据,采用VB是更为明智的选择。
本文采用的情感分析可以说是一个标准的机器学习的分类问题。目标是给定一条推文,将其分为正向情感、负向情感、中性情感。
文本特征
N-grams
感叹号问号个数
字母重复的单词个数
否定的个数
缩写词个数等
POS 标注为[‘N’, ‘V’, ‘R’, ‘O’, ‘A’] 个数(名词、动词、副词、代词、形容词)
词典特征(本文使用的情感词典有:Bing Lius词库[39]、MPQA词库[40]、NRC Hashtag词库和Sentiment140词库[42]、以及相应的经过否定处理的词库[45])
表情特征
本文 特征选择主要是针对于 N-grams 特征 的,采用方法如下:
设定min_df(min_df>=0)以及threshold(0 <= threshold <= 1)
对于每个在N-grams的词:
统计其出现于正向、负向、中性的次数,得到pos_cnt, neg_cnt, neu_cnt,以及出现总数N,然后分别计算
pos = pos_cnt / N
neg = neg_cnt / N
neu = neu_cnt / N
对于 pos,neg,neu中任一一个大于阈值threshold 并且N > min_df的,保留该词,否则进行删除。
上述算法中滤除了低频的词,因为这可能是一些拼写错误的词语;并且,删除了一些极性不那么明显的词,有效的降低了维度。
在本文中,使用两个分类器进行对比,他们均使用sklearn提供的接口 。第一个分类器选用SVM线性核分类器,参数设置方面,C = 0.0021,其余均为默认值。第二个分类器是Logistic Regression分类器,其中,设置参数C=0.01105。
在特征选择上,min_df=5, threshold=0.6。
测试集名
import json
from django.http import HttpResponse
from django.shortcuts import render
from topic.models.TopicTrendsManager import TopicTrendsManager
from topic.models.TopicParameterManager import TopicParameterManager
def index(request):
return render(request, 'topic/index.html')
# TODO 检查参数的合法性, and change to post method
def stream_trends(request):
param_manager = TopicParameterManager(request.GET.items())
topic_trends = TopicTrendsManager(param_manager)
res = topic_trends.get_result(param_manager)
return HttpResponse(json.dumps(res), content_type="application/json")
def stop_trends(request):
topic_trends = TopicTrendsManager(None)
topic_trends.stop()
res = {"stop": "stop success"}
return HttpResponse(json.dumps(res), content_type="application/json")
def text(request):
return render(request, 'topic/visualization/result_text.html')
def bubble(request):
return render(request, 'topic/visualization/result_bubble.html')
def treemap(request):
return render(request, 'topic/visualization/result_treemap.html')
def sunburst(request):
return render(request, 'topic/visualization/result_sunburst.html')
def funnel(request):
return render(request, 'topic/visualization/result_funnel.html')
def heatmap(request):
return render(request, 'topic/visualization/result_heatmap.html')
def hashtags_pie(request):
return render(request, 'topic/visualization/result_hashtags_pie.html')
def hashtags_histogram(request):
return render(request, 'topic/visualization/result_hashtags_histogram.html')
def hashtags_timeline(request):
return render(request, 'topic/visualization/result_hashtags_timeline.html')