赞
踩
在互联网时代,各种各样社交媒体的出现让人们获取和交流信息的成本变得越来越低。借助一些平台,国家时事,明星八卦和社情民意都能快速有效地传播并能引起民众的积极讨论,庞大的用户基数产生了数量巨大的网络数据,如何从这些庞大的数据中收集分析出目前整个社会的关注点是信息内容安全的研究领域之一。
如今的新浪微博是多年前微博在国内刚刚兴起时多方争斗的几乎唯一幸存者,新浪微博2020年第一季度财报显示,其月活跃用户已达5.5亿,可以说新浪是微博平台的唯一寡头,各大官方账号入驻使得海量信息在该平台上能快速扩散并引起社会的广泛关注。如今的微博系统已经相当完善,涉及领域也相当广泛,作为资本的舆论发布和控制平台,新浪微博在舆情监测上具有先天优势,但是其热搜存在一些问题。比如微博热搜主题失衡,明星化严重。明星们换着花样占据热搜榜单,而那些为国争光的科研团队,运动健儿却没有得到应有的关注。这不仅对为国家奋斗的人不公平,对明星生活关注的扩大也压缩了他们的个人隐私空间。
本次课程设计旨在针对新浪微博的热搜榜构建出小型舆情分析系统,主要目的是让用户可以有选择地过滤如娱乐新闻等内容,并根据热搜情况生成舆情图来帮助用户直观了解社会动态。
主要步骤分为五步:
在设计开始前搜了一下相关的文献,发现还是有一些人在做这个事情的,说明基于微博热搜的分析也是可行的。就系统的完整性来说肯定比不了其他人的研究或者毕业设计啥的,这只是在课程设计中的一个小尝试,所以界面粗糙和信息匮乏还请老师谅解。
信息内容安全课程在其内容稍微理解时,我就觉得其应用的一大方向就是舆论分析,话题检测,内容分析这都是现有很多网络平台在做的事情,而且跟垃圾邮件过滤这类工作来比,过滤器显得那么渺小又无聊。
虽然本舆情分析小系统还略显稚嫩,但应该是所有舆情分析系统开始都要做的工作—爬取信息和信息分类。而这第一步的工作我觉得也没那么轻松,最简单却也最难的一步就是词库的构建和维护,分词有很多现成第三方库可以用,但是分类依据词库则多数需要自己构建,而以后词库内的信息变动,比如原本在娱乐圈的人物参与了一次人民代表大会,该把他界定在娱乐还是政治内呢?就词库本身就有无穷的工作需要做。而对于系统的其他部分也有很多改进空间,本次设计后期阶段想尝试一下对每个热搜话题的评论进行整理分类,这样才真正的从舆情监测进阶到舆情分析阶段。获取每个话题下群众的态度,再分析出态度的正负,群众的态度才是真正的舆情。但是受限于微博评论的一些验证机制,爬虫还不是很熟练的我没法在短时间内通过验证只得作罢。
import requests from bs4 import BeautifulSoup import datetime import jieba import matplotlib.pyplot as plt import tkinter as tk import tkinter.messagebox '''基于微博热搜的舆论分析系统 --Kevinwang 可以实现对热搜分类,过滤显示及绘制热搜分类饼状图的功能 2020/6/24''' def drawpic():#饼状图绘制 plt.rcParams['font.sans-serif']='SimHei'#设置中文显示 lable=['政务','娱乐','政治','疫情','科技'] explode=[0.01,0.01,0.01,0.01,0.01] values=[gov_count,entertaiment_count,poltic_count,battle_count,tech_count] for i in range (0,len(lable)): #去掉没有检索到的类别 if values[i]==0: #因为数组长度动态变化,所以只能先变成0,然后去掉0元素,比较复复杂 lable[i]=0 explode.remove(0.01) for i in range(0,len(lable)): if 0 in values: values.remove(0) if 0 in lable: lable.remove(0) plt.title('用户关注分布') plt.pie(values,explode=explode,labels=lable,autopct='%1.1f%%') plt.show() def getTrending():#获取热搜内容 global gov_count,entertaiment_count,poltic_count,battle_count r = requests.get("https://s.weibo.com/top/summary") soup = BeautifulSoup(r.text, 'lxml') items = soup.find(class_="data").find_all(name="tr") a = '置顶'.ljust(2, ' '), items[1].find(class_="td-02").a.string top = ''.join(a) words = jieba.lcut(top) for i in words: # 置顶判别 if i in entertaiment: top = top + " 娱乐" entertaiment_count = entertaiment_count + 1 elif i in gov: top = top + " 政务" gov_count = gov_count + 1 elif i in poltic: top = top + " 政治" poltic_count = poltic_count + 1 elif i in battle: top = top + " 疫情" battle_count=battle_count+1 trending.append(top) for item in items[2:]: # 热搜类型判别 mes = item.find(class_="td-01 ranktop").string.ljust(4, ' '), item.find(class_="td-02").a.string mess = "".join(mes) words = jieba.lcut(mess) for i in words: if i in entertaiment: mess = mess + " 娱乐" entertaiment_count = entertaiment_count + 1 elif i in gov: mess = mess + " 政务" gov_count = gov_count + 1 elif i in poltic: mess = mess + " 政治" poltic_count = poltic_count + 1 elif i in battle: mess = mess + " 疫情" battle_count = battle_count + 1 trending.append(mess) def filter(num):#根据种类过滤新闻 show.delete(0.0 ,'end') nowTime = datetime.datetime.now().strftime('%F %T') # 现在时间 show.insert('1.0',nowTime) for i in range(0,len(t)): if t[i]>=2: if i==3: show.insert('end',' 今日主题:疫情\nToday is still a hard day.') elif i==1: show.insert('end',' 今日主题:娱乐\nWe are fine today.') elif i==0: show.insert('end', ' 今日主题:政治\nSomething is happening in the world.') show.insert('end','\n热搜排名 热搜内容') kind='' count=0 if num=='0': for i in range(0, len(trending)): show.insert('end','\n'+trending[i]) count=1 elif num == '1': kind = '政务' elif num == '2': kind = '娱乐' elif num == '3': kind = '政治' elif num == '4': kind = '疫情' elif num == '5': kind = '科技' for i in range(0,len(trending)): if trending[i][-2]+trending[i][-1]==kind: show.insert('end','\n'+trending[i]) count=1 if count==0: tk.messagebox.showinfo('Tip','The kind of message did not appear in the trending!') else: pass def confirm1(event): type1=select.get() if type1 == 'quit': tk.messagebox.askquestion('Confirm','Are you sure to leave') form.destroy() elif type1 != '1' and type1 != '2' and type1 != '3' and type1 != '3' and type1 != '4' and type1 != '5' and type1 != '0': tk.messagebox.showinfo('Tip','Please input the number from one to five') else: filter(type1) select.delete(0) #分类依据,分类准确程度取决于词组和分词准确性 gov=["卫生部","教育部","卫健委",'工信部','法律','民法典','教育厅','外交部','禁毒','毒品','犯罪','赵立坚'] entertaiment=["彭于晏","胡歌","迪丽热巴","宁静","易烊千玺","杨紫",'导演','演员','杨超越','于正','周杰伦','张雨绮','于蓝','快乐大本营'] poltic=["香港","台湾","人大",'常委','两会','俄罗斯','阅兵','全国人大'] battle=["抗疫","疫情","境外输入","核酸检测","确诊","病毒","新发地",'健康码','新冠','疫苗'] tech=["ios","华为","5G",'北斗','卫星'] gov_count=0 entertaiment_count=0 poltic_count=0 battle_count=0 tech_count=0 trending=[] jieba.add_word('周杰伦') jieba.add_word('张雨绮') jieba.add_word('快乐大本营') jieba.add_word('于蓝') if __name__ == '__main__':#在被调用时生效,防止重复执行 getTrending() t=[gov_count,entertaiment_count,poltic_count,battle_count,tech_count] form=tk.Tk() form.title('Public opinion analyze system --KevinWang') width=500 height=500 form.resizable(width=False,height=False) screenwidth = form.winfo_screenwidth() #放于屏幕中央 screenheight = form.winfo_screenheight() alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2) form.geometry(alignstr) w=tk.Label(form,text='0.all message 1.gov 2.entermaintent 3.politic 4.coronavirus 5.tech\n Press quit to leave\n Select the type you want to see') select=tk.Entry(form,bd=3) confirm=tk.Button(form,text='确认',command=confirm1,width=8,height=2) confirm.bind_all('<Return>',confirm1) #绑定快捷键enter analyze=tk.Button(form,text='舆情分析',command=drawpic,width=8,height=2) show=tk.Text(form,width=70,height=28) w.pack() select.pack() show.pack() confirm.pack(side='right') analyze.pack(side='right') form.mainloop()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。