当前位置:   article > 正文

信息内容安全-基于微博热搜的yuqing监测系统_信息内容安全分析系统

信息内容安全分析系统

选题背景

在互联网时代,各种各样社交媒体的出现让人们获取和交流信息的成本变得越来越低。借助一些平台,国家时事,明星八卦和社情民意都能快速有效地传播并能引起民众的积极讨论,庞大的用户基数产生了数量巨大的网络数据,如何从这些庞大的数据中收集分析出目前整个社会的关注点是信息内容安全的研究领域之一。
如今的新浪微博是多年前微博在国内刚刚兴起时多方争斗的几乎唯一幸存者,新浪微博2020年第一季度财报显示,其月活跃用户已达5.5亿,可以说新浪是微博平台的唯一寡头,各大官方账号入驻使得海量信息在该平台上能快速扩散并引起社会的广泛关注。如今的微博系统已经相当完善,涉及领域也相当广泛,作为资本的舆论发布和控制平台,新浪微博在舆情监测上具有先天优势,但是其热搜存在一些问题。比如微博热搜主题失衡,明星化严重。明星们换着花样占据热搜榜单,而那些为国争光的科研团队,运动健儿却没有得到应有的关注。这不仅对为国家奋斗的人不公平,对明星生活关注的扩大也压缩了他们的个人隐私空间。
本次课程设计旨在针对新浪微博的热搜榜构建出小型舆情分析系统,主要目的是让用户可以有选择地过滤如娱乐新闻等内容,并根据热搜情况生成舆情图来帮助用户直观了解社会动态。

方案设计

设计图
主要步骤分为五步:

  1. 实时从热搜榜获取文本内容。
  2. 对获取的热搜内容分词处理。
  3. 根据自己构建的类型库对热搜进行分类。
  4. 将热搜按照类型划分归属,并统计热搜榜内用户关注方向。
  5. 根据用户的输入筛选用户想看的热搜,并根据统计出的关注点分析舆情。
    #系统实现
  6. 获取热搜内容:
    采用python requests库构建http请求,美丽汤beautiful soup库解析获取的网页内容,可用lmxl将获取到的内容转换为可识别的字符串类型再对信息进行筛选查找。
    热搜具体内容都在class=data下名为tr的标签内,如图
    标签图
    其中td01标签存储热搜排行序号,td02存储热搜具体内容,本次实验取出热搜排行序号和热搜内容合并存储进列表即可。
    此步主要运用爬虫知识,这还是学了python之后第一次应用爬虫相关知识,在http协议中要学会模仿浏览器操作,比如user-Agent头等,这样才能使爬虫在网页的一些反爬手段下存活下来。
  7. 分词处理:
    分词原理有正向匹配逆向匹配和双向匹配,但是最重要的还是匹配词库,这个功能python有第三方库可以实现,实验中使用的是jieba库,初次实验需求不高,就采用了jieba这种简单易用的分词库,随着方向的深入,以后可以使用pkuseg来追求准确度和专业性。
    Jieba分词有三种模式,1.精确模式,最精确地分割文本。2.完全模式:把文本内包含的所有词全分割出来,容易产生歧义和冗余。3.搜索引擎模式:本实验用不到就没有研究。
    实验是要将热搜分词再与类型词库匹配,如果完全分词的话可能会造成一条数据产生多种不同的类型,产生歧义,所以实验中选择了精确模式,这样实验的准确性在一定程度上依赖于jieba第三方库的分词准确性。不过据实验来看,分词的正确性还是比较可观的,分词实验如图
    分词图
  8. 类型匹配
    这一步是将分词结果与规定的类型库进行匹配,判断分词结果是否有在设置的类型库内,在的话就给记录打上相应标签。但是分词库有第三方,匹配库就要靠自己了,实验过程建立的类型匹配词如下:
    添加词
    只尝试分了五类,政务,娱乐,政治,疫情和科技,暂时在实验中还没遇到有一条热搜同时符合多条类型匹配的情况,可以说类型匹配的效果也是比较可观的。
    主界面显示热搜及分类类型如下:
    主界面
    可以识别一些,但是还有很多没有识别的是因为匹配词库的不完善。
    热搜类型筛选示例如下:
    筛选显示
  9. 舆情分析
    查了一些资料,对于舆情分析到底分析些啥也语焉不详,而由于课程设计只是对舆情分析的一次尝试,就只对获取的数据进行简单的统计处理。在匹配过程中引入了变量对每个类型匹配的热搜数量进行记录,根据用户关注方向绘制出饼状图,示例如下:
    舆情分析
    这一步的类型匹配库决定了分类的准确性和丰富度,而且此系统设计的初衷是过滤娱乐信息,但是娱乐圈的人名确实很复杂,我个人是难以全部认识,更不用说我的程序了,所以如果能引入已有的词库是极好的。在网上查了之后发现确实有一些,比如下图的明星词库,虽然只要四毛三,但是由于要花钱下载就没有尝试了。而且识别人名时还有一点需要注意,jieba分词库也不认识这些明星,就算比较出名的比如刘德华周杰伦也不认识,所以需要将匹配的人名添加进jieba的词库才能正常使用此系统。
    现成词库

总结

在设计开始前搜了一下相关的文献,发现还是有一些人在做这个事情的,说明基于微博热搜的分析也是可行的。就系统的完整性来说肯定比不了其他人的研究或者毕业设计啥的,这只是在课程设计中的一个小尝试,所以界面粗糙和信息匮乏还请老师谅解。
信息内容安全课程在其内容稍微理解时,我就觉得其应用的一大方向就是舆论分析,话题检测,内容分析这都是现有很多网络平台在做的事情,而且跟垃圾邮件过滤这类工作来比,过滤器显得那么渺小又无聊。
虽然本舆情分析小系统还略显稚嫩,但应该是所有舆情分析系统开始都要做的工作—爬取信息和信息分类。而这第一步的工作我觉得也没那么轻松,最简单却也最难的一步就是词库的构建和维护,分词有很多现成第三方库可以用,但是分类依据词库则多数需要自己构建,而以后词库内的信息变动,比如原本在娱乐圈的人物参与了一次人民代表大会,该把他界定在娱乐还是政治内呢?就词库本身就有无穷的工作需要做。而对于系统的其他部分也有很多改进空间,本次设计后期阶段想尝试一下对每个热搜话题的评论进行整理分类,这样才真正的从舆情监测进阶到舆情分析阶段。获取每个话题下群众的态度,再分析出态度的正负,群众的态度才是真正的舆情。但是受限于微博评论的一些验证机制,爬虫还不是很熟练的我没法在短时间内通过验证只得作罢。

源码

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/222818?site
推荐阅读
相关标签
  

闽ICP备14008679号