python微博舆情分析系统 可视化 情感分析 爬虫 机器学习(源码+讲解)✅

🍅大家好,今天给大家分享一个Python项目,感兴趣的可以先收藏起来,点赞、关注不迷路!🍅

大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。

设计1000套(建议收藏)

毕业设计:2023-2024年最新最全计算机专业毕业设计选题汇总

1、项目介绍

技术栈:
Python语言、Flask框架、MySQL数据库、requests网络爬虫技术、scikit-learn机器学习、snownlp情感分析、词云、舆情分析

1.开发工具
本项目主要采用 PyCharm 开放平台利用 Python 语言来实现的。PyCharm 是一种PythonIDE,带有一整套可以帮助用户在使用 Python 语言开发时提高其效率的工具。
2.数据获取
为了获取微博信息数据做后续的任务分析,需要使用爬虫技术,爬取微博网的微博信息数据,针对微博网的反爬机制,需要使用反爬手段绕过反爬机制,确保获取数据的准确性和完整性。本次爬虫设计的目标是获取微博信息,数据获取模块的实现是通过requests网络爬虫技术采集微博网上微博信息。本次爬虫的运行基本流程如图 1 所示。

2、项目界面

(1)系统首页-数据概况

在这里插入图片描述

(2)微博舆情统计分析

在这里插入图片描述

(3)舆情文章分析

在这里插入图片描述

(4)IP地址分析
在这里插入图片描述

(5)舆情数据

在这里插入图片描述

(6)舆情评论分析

在这里插入图片描述

(7)舆情分析

在这里插入图片描述

(8)文章内容词云分析

在这里插入图片描述

3、项目说明

1.开发工具
本项目主要采用 PyCharm 开放平台利用 Python 语言来实现的。PyCharm 是一种PythonIDE,带有一整套可以帮助用户在使用 Python 语言开发时提高其效率的工具。
2.数据获取
为了获取微博信息数据做后续的任务分析,需要使用爬虫技术,爬取微博网的微博信息数据,针对微博网的反爬机制,需要使用反爬手段绕过反爬机制,确保获取数据的准确性和完整性。本次爬虫设计的目标是获取微博信息,数据获取模块的实现是通过requests网络爬虫技术采集微博网上微博信息。本次爬虫的运行基本流程如图 1 所示。

本地保存数据应对后续数据分析,可以使用MySQL和csv对数据进行持久化保存,对于MySQL可以通过Pymysql结合Sqlalchemy或者Pandas进行数据插入。因此本次实验选用的是 MySQL 数据库对采集的数据进行数据存储。

3、微博热词统计:热点年份变化趋势、热词情感分析、热词频率分析
首先,热点年份变化趋势是指在不同年份中,微博上的热点话题发展的趋势和变化。通过统计不同年份中的热词,我们可以了解到社会关注焦点的转移和变化趋势。例如,某个年份的热词可能主要集中在娱乐明星或电视剧上,而另一个年份可能更多关注社会事件或政治话题。
其次,热词情感分析是通过对热词相关微博内容的情感倾向进行分析。通过对微博用户的评论、转发和点赞等行为进行监测和分析,可以了解到用户对热词所表达的情绪态度。例如,某个热词在微博上的情感分析结果可能显示大多数用户对该话题持正面态度,少数用户持负面态度。这样的分析有助于我们了解社会舆论对于热点话题的态度和倾向。
最后,热词频率分析是指对热词在微博上出现的频率进行统计和分析。通过统计不同热词在微博平台上的出现次数,可以了解到不同话题的受关注程度和热度。例如,某个热词在一段时间内频繁出现,说明这个话题在社会上引起了广泛关注。

4、微博文章分析:文章类型占比分析、文章评论量分析、文章转发量分析、文章内容词云分析、文章基本信息统计分析
文章评论量分析:评论量是衡量文章受关注程度的重要指标之一。通过统计文章的评论数量,可以了解用户对文章的关注程度和参与度。这可以帮助我们判断文章的受欢迎程度和影响力。
文章转发量分析:转发量是衡量文章传播范围和影响力的指标之一。通过统计文章的转发数量,可以了解用户对文章内容的认同和推荐程度。这有助于评估文章的传播效果和影响力。
文章内容词云分析:文章内容词云是通过对文章中出现频率较高的词语进行可视化展示,以呈现文章的关键主题和热点话题。通过词云分析,可以直观地了解文章的主要内容和关注点。
文章基本信息统计分析:文章基本信息统计分析包括统计文章的发布时间、作者、阅读量等关键信息。这些统计数据可以帮助我们了解文章的发布趋势、作者影响力以及受众规模等信息。

5、微博评论分析:评论用户性别占比分析、用户评论词云图分析、评论点赞分析
首先,对于微博评论的用户性别占比分析,通过统计和分析这些信息,我们可以了解在一定的评论样本中,男性和女性用户的数量占比情况。这可以为我们提供有关该话题或事件下不同性别用户参与讨论的情况,有助于了解不同性别用户的观点和态度。
其次,用户评论词云图分析可以帮助我们了解评论中出现频率较高的关键词。我们可以通过文本处理技术,对评论内容进行分词并统计词频,然后将高频词汇绘制成词云图。这样,我们就能够直观地看到哪些词汇在评论中被提及得较多,从而推测用户对该话题或事件的关注点和情感倾向。
最后,评论点赞分析可以帮助我们了解哪些评论在用户中较受欢迎或者认同。通过统计每条评论的点赞数,我们可以排名评论的受欢迎程度,并分析受欢迎的评论内容特点。这有助于我们了解用户对于该话题或事件的主要认同观点,以及哪些评论具有较高的影响力。

6、微博舆情分析:热词情感趋势、文章内容与评论内容舆情趋势分析
微博热词情感趋势是指根据微博用户在某一段时间内热议的关键词或话题的相关内容进行情感分析,从而了解用户对该热词的情感态度变化趋势。情感趋势分析可以帮助我们更好地了解用户的喜好、态度以及对某一事件或话题的关注程度。
文章内容与评论内容舆情趋势分析是指通过对网络上用户发布的文章内容和评论内容进行分析,了解用户对某一事件、产品或话题的舆情倾向。舆情趋势分析可以帮助我们了解用户对某一事件的态度、关注度以及舆论走向,从而有效地进行舆情管理和营销策划。

4、核心代码


from utils import getPublicData
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image                   # 图片处理
import numpy as np
from snownlp import SnowNLP

def getTypeList():
    typeList = list(set([x[8] for x in getPublicData.getAllData()]))
    return typeList

def getArticleCharOneData(defaultType):
    articleList = getPublicData.getAllData()
    xData = []
    rangeNum = 1000
    for item in range(1,15):
        xData.append(str(rangeNum * item)+ '-' + str(rangeNum*(item+1)))
    yData = [0 for x in range(len(xData))]
    for article in articleList:
        if article[8] != defaultType:
            for item in range(14):
                if int(article[1]) < rangeNum*(item+2):
                    yData[item] += 1
                    break
    return xData,yData

def getArticleCharTwoData(defaultType):
    articleList = getPublicData.getAllData()
    xData = []
    rangeNum = 1000
    for item in range(1,15):
        xData.append(str(rangeNum * item)+ '-' + str(rangeNum*(item+1)))
    yData = [0 for x in range(len(xData))]
    for article in articleList:
        if article[8] != defaultType:
            for item in range(14):
                if int(article[2]) < rangeNum*(item+2):
                    yData[item] += 1
                    break
    return xData,yData

def getArticleCharThreeData(defaultType):
    articleList = getPublicData.getAllData()
    xData = []
    rangeNum = 50
    for item in range(1, 30):
        xData.append(str(rangeNum * item) + '-' + str(rangeNum * (item + 1)))
    yData = [0 for x in range(len(xData))]
    for article in articleList:
        if article[8] != defaultType:
            for item in range(29):
                if int(article[2]) < rangeNum * (item + 2):
                    yData[item] += 1
                    break
    return xData, yData

def getGeoCharDataTwo():
    cityList = getPublicData.cityList
    commentList = getPublicData.getAllCommentsData()
    cityDic = {}
    for comment in commentList:
        if comment[3] == '无': continue
        for j in cityList:
            if j['province'].find(comment[3]) != -1:
                if cityDic.get(j['province'], -1) == -1:
                    cityDic[j['province']] = 1
                else:
                    cityDic[j['province']] += 1

    cityDicList = []
    for key, value in cityDic.items():
        cityDicList.append({
            'name': key,
            'value': value
        })
    return cityDicList


def getGeoCharDataOne():
    cityList = getPublicData.cityList
    articleList = getPublicData.getAllData()

    cityDic = {}
    for article in articleList:
        if article[4] == '无':continue
        for j in cityList:
                if j['province'].find(article[4]) != -1:
                    if cityDic.get(j['province'],-1) == -1:
                        cityDic[j['province']] = 1
                    else:
                        cityDic[j['province']] += 1

    cityDicList = []
    for key, value in cityDic.items():
        cityDicList.append({
            'name': key,
            'value': value
        })
    return cityDicList

def getCommetCharDataOne():
    commentList = getPublicData.getAllCommentsData()
    xData = []
    rangeNum = 20
    for item in range(1, 100):
        xData.append(str(rangeNum * item) + '-' + str(rangeNum * (item + 1)))
    yData = [0 for x in range(len(xData))]
    for comment in commentList:
            for item in range(99):
                if int(comment[2]) < rangeNum * (item + 2):
                    yData[item] += 1
                    break
    return xData, yData

def getCommetCharDataTwo():
    commentList = getPublicData.getAllCommentsData()
    genderDic = {}
    for i in commentList:
        if genderDic.get(i[6],-1) == -1:
            genderDic[i[6]] = 1
        else:
            genderDic[i[6]] += 1
    resultData = [{
        'name':x[0],
        'value':x[1]
    } for x in genderDic.items()]
    return resultData

def stopwordslist():
    stopwords = [line.strip() for line in open('./model/stopWords.txt',encoding='UTF-8').readlines()]
    return stopwords

def getContentCloud():
    text = ''
    stopwords = stopwordslist()
    articleList = getPublicData.getAllData()
    for article in articleList:
        text += article[5]
    cut = jieba.cut(text)
    newCut = []
    for word in cut:
        if word not in stopwords: newCut.append(word)
    string = ' '.join(newCut)
    img = Image.open('./static/content.jpg')  # 打开遮罩图片
    img_arr = np.array(img)  # 将图片转化为列表
    wc = WordCloud(
        width=1000, height=600,
        background_color='white',
        colormap='Blues',
        font_path='STHUPO.TTF',
        mask=img_arr,
    )
    wc.generate_from_text(string)

    # 绘制图片
    fig = plt.figure(1)
    plt.imshow(wc)
    plt.axis('off')  # 不显示坐标轴

    # 显示生成的词语图片
    # plt.show()

    # 输入词语图片到文件

    plt.savefig('./static/contentCloud.jpg', dpi=500)

def getCommentContentCloud():
    text = ''
    stopwords = stopwordslist()
    commentsList = getPublicData.getAllCommentsData()
    for comment in commentsList:
        text += comment[4]
    cut = jieba.cut(text)
    newCut = []
    for word in cut:
        if word not in stopwords:newCut.append(word)
    string = ' '.join(newCut)
    img = Image.open('./static/comment.jpg')  # 打开遮罩图片
    img_arr = np.array(img)  # 将图片转化为列表
    wc = WordCloud(
        width=1000, height=600,
        background_color='white',
        colormap='Blues',
        font_path='STHUPO.TTF',
        mask=img_arr,
    )
    wc.generate_from_text(string)

    # 绘制图片
    fig = plt.figure(1)
    plt.imshow(wc)
    plt.axis('off')  # 不显示坐标轴

    # 显示生成的词语图片
    # plt.show()

    # 输入词语图片到文件

    plt.savefig('./static/commentCloud.jpg', dpi=500)

def getYuQingCharDataOne():
    hotWordList = getPublicData.getAllCiPingTotal()
    xData = ['正面', '中性', '负面']
    yData = [0,0,0]
    for hotWord in hotWordList:
        emotionValue = SnowNLP(hotWord[0]).sentiments
        if emotionValue > 0.5:
            yData[0] +=1
        elif emotionValue == 0.5:
            yData[1] += 1
        elif emotionValue < 0.5:
            yData[2] += 1
    bieData = [{
        'name': '正面',
        'value': yData[0]
    }, {
        'name': '中性',
        'value': yData[1]
    }, {
        'name': '负面',
        'value': yData[2]
    }]
    return xData,yData,bieData

def getYuQingCharDataTwo():
    bieData1 = [{
        'name':'正面',
        'value':0
    },{
        'name':'中性',
        'value':0
    },{
        'name':'负面',
        'value':0
    }]
    bieData2 = [{
        'name': '正面',
        'value': 0
    }, {
        'name': '中性',
        'value': 0
    }, {
        'name': '负面',
        'value': 0
    }]

    commentList = getPublicData.getAllCommentsData()
    articleList = getPublicData.getAllData()

    for comment in commentList:
        emotionValue = SnowNLP(comment[4]).sentiments
        if emotionValue > 0.5:
            bieData1[0]['value'] += 1
        elif emotionValue == 0.5:
            bieData1[1]['value'] += 1
        elif emotionValue < 0.5:
            bieData1[2]['value'] += 1
    for article in articleList:
        emotionValue = SnowNLP(article[5]).sentiments
        if emotionValue > 0.5:
            bieData2[0]['value'] += 1
        elif emotionValue == 0.5:
            bieData2[1]['value'] += 1
        elif emotionValue < 0.5:
            bieData2[2]['value'] += 1

    return bieData1,bieData2

def getYuQingCharDataThree():
    hotWordList = getPublicData.getAllCiPingTotal()
    return [x[0] for x in hotWordList],[int(x[1]) for x in hotWordList]




源码获取:

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

  • 50
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
<项目介绍> Python基于情感词典和机器学习对新闻和微博评论的情感分析源码+项目说明+数据集+代码注释.zip 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能。 计算社会学:基于NLP技术的新冠疫情下的社会心态研究 此为发布开源的版本而不是开发环境中使用的版本。 ## 文件结构 ```bash │ LICENSE │ README.md ├─Analyze # 分析数据的过程中所使用的所有代码 ├─Data # 原始数据以及处理过后的所有数据 ├─Report # 报告相关源文件以及最终报告的成品 └─Spyder # 爬虫代码 ``` 文件结构经过事后整理,并不是工作时目录的状态,因而代码中所涉及的路径需要稍加修改后运行。 原始报告数据在评分后抹掉相关关键词后后放出。 > `Data`目录下文件结构 > > 该目录下共有6个文件夹,分别对应`stage0` - `stage6` > > ## stage内文件目录结构 > > ```bash > │ COVkeywords-Stage<No>-.json # 人工筛选后的疫情相关关键词 > │ COVkeywords-Stage<No>.json # 未经筛选的疫情关键词 > │ keywords-Stage<No>.json # 从荔枝新闻中获取的原始结果 > │ ratioByDate.png # 该阶段内每日疫情相关重点微博占比 > │ SaveTest.png # 疫情相关度分布拟合结果图1 > │ SaveTest_Fit.png # 疫情相关度分布拟合结果图2 > │ stageCOVWeibo.json # 该阶段内疫情相关重点微博(按时间先后排序) > │ stageCOVWeiboByImportance.json # 该阶段内疫情相关重点微博(按疫情相关度排序) > | SaveTest-度.png # 各项度指标占比 > │ stageInfo.json # 该阶段基础信息 > │ weiboPolar.png # 疫情相关重点微博情感极性图 > | weiboEmotion.png # 当前阶段的疫情相关微博情感倾向 > ├─YYYY-MM-DD- > ├─YYYY-MM-DD- > ├─YYYY-MM-DD-
Python游戏数据采集分析可视化系统是基于Django框架开发的,该系统旨在通过爬虫技术获取游戏数据,并通过数据分析和可视化展示,帮助用户了解游戏情况和进行数据决策。 系统的主要功能包括如下几个模块: 1. 爬虫模块:通过编写爬虫代码,从游戏官方网站或其他相关站点获取游戏数据。爬虫可以实现自动化的数据采集,可以按照设定的规则定时抓取数据,确保数据的及时性和准确性。 2. 数据库模块:系统使用数据库来存储采集到的游戏数据,常用的数据库选择可以是MySQL、SQLite等。通过Django框架提供的ORM技术,可以方便地对数据库进行增、删、改、查的操作,以及对游戏数据进行管理。 3. 数据分析模块:通过数据分析技术,对采集到的游戏数据进行统计、分析、挖掘。可以使用Python的科学计算库如NumPy和Pandas进行数据处理,通过统计学、机器学习等方法,揭示游戏数据背后的规律和趋势。 4. 可视化模块:通过数据可视化技术,将游戏数据以图表、地图等形式直观展示,帮助用户更好地理解数据,并进行数据决策。可以使用Python可视化库如Matplotlib和Seaborn进行图表绘制,或者使用JavaScript的可视化库如D3.js实现更复杂的可视化效果。 5. 源码开放性:系统源码可以根据用户需求进行自定义修改和扩展。Django框架具有良好的可拓展性,用户可以根据自己的需求添加新的功能、优化系统性能等。 总之,Python游戏数据采集分析可视化系统使用Django框架进行开发,通过爬虫实现数据采集,数据分析和可视化模块对数据进行处理和展示。系统源码的开放性使得用户可以根据实际需求自定义修改和扩展功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值