用python实现基于自媒体数据的人群聚类分析

🍅程序员小王的博客:程序员小王的博客
🍅 欢迎点赞 👍 收藏 ⭐留言 📝
🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕
🍅java自学的学习路线:java自学的学习路线

前言

用python实现基于自媒体数据的人群聚类分析是帮一个同学他要完成毕业设计嘛,说不会python,其实我也不怎么会,但是毕业设计又必须要完成,然后我们收集了不少资料,经历了近两个月的时间,才完成了这篇毕业设计——《用python实现基于自媒体数据的人群聚类分析》,项目中完成并整理了如下资料,如果需要的同学可以参考:python爬虫数据,python源代码,词频矩阵,高频词,聚类分析结果,谱系,基于自媒体数据的人群聚类分析论文等。

相关资料下载地址:用python实现基于自媒体数据的人群聚类分析相关资料

  • 注意:该论文的完成参考了网上很多资料,如有侵权请私聊!

第1章 引言

伴随互联网技术的快速发展与广泛应用,自媒体已经对人们的生活产生日益显著的影响,渐渐变成人们获取信息与分享观点的核心平台,强化信息传播效率,拉近人们之间的距离感,在更大化层面上对人们生活产生便捷性。本文在分析时选择基于自媒体数据下的人群聚类研究模式,其中目前主流的自媒体就是微博,微博作为⼀种快速便捷的信息传播载体,发挥着重要的信息传输作⽤。以2020年来疫情爆发,在线学习成为中国大学生学习的主要方式之一。本次论文的⽬的就是深⼊分析疫情前后大学生线上学习体验及其变化情况为例,做自媒体数据的人群聚类分析,给未来线上教学的开展提供相关参考,本设计利用Python编程爬虫搜集微博平台上关于大学生网课的评论,使用SPSS、机器学习、自然语言处理等方法,对收集到的文本数据进行分词、数据清洗、词频统计和聚类分析。最后根据所得到的数据进行前端可视化展示以及分析,发现目前在线教学中学生体验的现状、趋势以及一些待解决的问题。

1.研究背景及意义

新冠肺炎病毒于2020年1⽉⼤规模爆发,虽然现代医疗科技发展迅速,但⼈类依然⽆法避免类似的⼤规模突发 性公共卫⽣事件的困扰,可能在未来的很⻓⼀段时间内,⼤型传染性疾病依然⽆法彻底消除,⼈类将与病毒进⾏⻓期的抗争。突发卫⽣事件的突然性和危害性、新冠病毒的感染数和致死率等严重影响大学生正常的学习,⼀种疫情下独特的大学生在家上网课授课形式就此形成,并且目前还在延续。

伴随互联网技术的快速发展与广泛应用,自媒体已经对人们的生活产生日益显著的影响,渐渐变成人们获取信息与分享观点的核心平台,强化信息传播效率,拉近人们之间的距离感,在更大化层面上对人们生活产生便捷性。人们平时生活和社交网络间有着更加紧密的关联性,社交网络已经成为人们日常生活必需的应用场景。以微博为代表的社交媒体上⼴泛的传播各种疫情信息,学生发布的疫情相关短⽂本可以使⽤官⽅搜索引擎获取;此外,代表着官⽅媒体的央视新闻和⼈⺠⽇报等账号号通过微博发布了⼤量的疫情线上上课信息,同时微博的评论功能使得⽹友可以发表⾃⼰对于新闻的看法,这为我们数据分析提供了必要的数据源⽀持。我们分析疫情前后大学生线上学习体验,也可以给未来线上教学的开展提供相关参考。

2 研究现状

用户画像是要给目标用户展开描述表示的相关模型,将用户属性信息、兴趣喜好信息以及行为习惯信息等进行形式化与抽象化的处理,由此完成对用户目标的标签化模型建立。用户画像有着广泛的应用领域,譬如在包括用户群体精准定位使用范畴、用户个性化服务使用范畴、广告推送使用范畴以及网络舆情治理使用范畴等,都是有着重要的理论分析意义以及实践价值。用户画像涵盖基于兴趣偏好研究方式、行为研究方式,主题研究方式以及人格情绪研究方式等。参考分析对象的差异性,能够将用户画像概括为个体类型与群体类型等。如果以用户个体画像为角度进行分析可以得知,杨玉成,张乾,邵定琴等(2021)收集自媒体用户的粉丝数信息、关注数信息、自媒体数信息以及自媒体开通时长信息等,选择K-Means 聚类算法进行研究后获取用户类型标签信息,这是要把自媒体用户划分成如下所述的几个种类:安全化标签、统计化类标签以及类型化标签等,以此创建用户画像。孙宏婧,李安娜等(2019)阐释基于用户偏好情况下的用户画像,研究用户留意的文本信息内容,借助于概率潜在语义与多元线性回归的分析方法,从而构建用户兴趣画像。陈丽坚,萧鲲,张翠玲等(2019)以用户手势行为与自媒体内容为切入点,以此对用户信息进行数据挖掘分析,并且考量用户基础属性与用户兴趣等,基于此,创建自媒体用户画像。程祥,赵倩等(2019)选择概率图的建模研究手段,融合用户文本信息和多类行为特征,创建基于行为方式的自媒体用户信用画像。而且选择双层集成学习框架,利用多元异构社交数据创建用户信用画像,譬如包括个人信息特征要素、自媒体特征要素、网络特征要素以及高层次特征要素等。如果以用户群体画像为角度进行分析可以得知,李文,李小艳等(2019)选择动态主题模型(即DTM)获得自媒体用户具备的动态主题特征元素,并且参考用户个人信息与主题特征等,选择两步聚类算法进行自媒体用户的聚类研究活动,详细划分成4类自媒体用户,从而创造自媒体用户群体细分的用户画像。赵刚,石齐,侯风刚等(2018)选择 BTM 主题模型(即BTM)对自媒体用户主题兴趣进行发掘,考量自媒体用户在整体层面上存在着近似情况,选择 K-Means 算法对用户群体进行5类划分,同时选取主题兴趣特征后创造用户群体画像。任姚鹏(2017)创建微信老年用户群体使用行为画像标签系统,并且将其划分成如下所述的3个种类,分别是低度活跃类型、中度活跃类型以及高度活跃类型等,同时阐释微信老年用户服务领域中的优化举措。杨玉成,张乾,岳诗琴等(2020)阐释基于模糊概念格算法的用户模型画像模型。

以上分析的研究方式,这是对用户的某个特征维度或者若干个特征维度展开研究,譬如,用户行为特点以及兴趣主题特点等,并没有细分用户兴趣内容特征,从而创造的用户个体(或群体)画像需要缺乏全面性与精确度。

3.数据源选择

本次论文希望得到能代表线上上网课学生的数据,最初我想到了QQ空间和微信朋友圈的内容,但从可⾏性的⻆度上这较难实现;其次可以是抖⾳、b站相关线上上网课视频上的弹幕或评论,但随着我们深⼊了解,发现这部分的数据收视

频内容影响严重,许多弹幕存在重复的现象,并不利于我们的进⼀步分析;我们还考虑过MOOC、知到等线上网课应⽤大家上网课时的评论,但经过调研我们发现大家上网课几乎不发表评论,这也不符合我们的需求。 所以本次数据采⽤新浪微博(简称微博)⾥的数据,微博是⼀种被⼤众⼴泛使⽤的社交平台,其信息传播快, 更新速度快,信息类型远多于其他平台。在微博上,⽹⺠不仅可以接收信息,还可以可以⾃⼰发布⾃⼰的⽂本,也 可以到其他⼈的微博下进⾏评论或转发,甚⾄很多情况下有⼈使⽤微博来传递重要信息或者处理应急事件,中国社会科学院社会学研究所在2020年发布的⼀项调查报告显⽰,75%以上的中国⽹⺠曾使⽤过微博来了解疫情相关信息,所以我们选择微博进⾏分析。

第2章 相关技术介绍

我们研究⼯作的⽬的是希望得到疫情期间大家线上上网课同学的⼼态,具体的研究可以细化为两个部分,⼀是分析疫情期间不同时间段的学生在家上网课的情感极性和情感强烈程度,⼆是分析突发公共卫⽣事件下不同阶段公众信息的主题特征。 本论文的主要⼯作⾸先就是从⽹上抓取能代表学生⼼态的信息,然后要对这些信息进⾏初步的分类和预处理, 之后使⽤三种技术对数据进⾏分析。我们使⽤⼼态词典研究情感极性和情感强度,使⽤拓展过的多维情感词典对于⽂本进⾏多维情感分类,并利⽤聚类算法分析主题特征,最后利⽤可视化绘图技术总结分析得到结论。详细的分析 ⻅下⾯的内容,主要涵盖的内容如下图2.1所示。

图2-1 主要涉及的技术

2.1 Jieba分词

Jieba分词为python中文分词工具,它有着高效便捷的作用,能够对分词词典进行自定义操作。这是基于前缀词典对词图进行扫描处理,生成句子中各类汉字对应的成词概率。该类分子选择Viterbi算法词性。Jieba分词包括三类分词模式,分别为精确模式类型、全模式模型类型以及搜索引擎模式类型等。其中,精确模式依据表意习惯,这是将句子精确切分为词语,能够符合汉语词句用法的习惯,符合文本研究需要。搜索引擎模式以精确模式为依托,然后对长词展开切分操作,这是适用在搜索引擎查询信息的用途中。jieba分词包整体的工作流程如下图2.2所示:

图2-2 jieba分词包整体的工作流程

2.2 LDA主题模型

在2003年,Blei等创建词袋主题模型模型,将其命名为隐含狄利克雷分布(即LDA),这是一种没有监督的文本隐含语义模型创建分析方式,其架构体系包括文档层级、主题层级以及词层级等,假定在文档集中存在很多文档信息,每个文档对应一组词,词与词间没有排序,LDA获取文档中存在的主题分布信息,参考主题分布情况展开主题聚类研究,进而会通过概率形式确定文档集中各篇文档定的主题内容。

LDA属于一类生成概率的模型,从图2-3中可知,假定在文档集中存在的文档数量为M,其第m篇文档有着的词数为个,假定文档集中出现的主题数量为K,并且第k个主题对应的词数是,文档主题存在的先验分布为超参数是α的狄利克雷分布,这也就表明,当文档m对应的主题分布区间是从到Dirichlet(α),该类主题中词的先验分布为超参数是α的狄利克雷分布,主题k对应的词分布区间是从到Dirichlet(β)。文档集的第m篇文档中n个词对应的主题编号服从多项式分布情况:=。其中主题编号中词的概率分布是多项式分布:。文档主题中狄利克雷分布与主题编号对应的的多项式分布构建Dirichlet-multi共轭情况,从而获得关联的后验分布:,。在主题中词对应的狄利克雷分布与主题编号中词对应的多项式分布构成Dirichlet-multi共轭形式,从而获取的后验分布:。

图2-3 LDA模型图

LDA模型中一个文档生成方式如下所述:

(1)针对第m个文档而言,这是先要在超参数是a的狄利克雷分布中获取样本后生成文档对应的主题分布布;

(2)在主题的多项式分布中获取样本后生成第m个文档对应的第n个主题;

(3)在超参数是a的狄利克雷分布中获取样本后生成主题,其对应的词语分布;

(4)在词语的多项式分布中回去样本后,最后生成词语。

LDA联合概率表达式如下所示:

其中,Α,β都是表示已知的先验输入参数。一般情况下,主要选择吉布斯采样方式进行LDA中的参数求解分析,同时预测文档主题内容。LDA模型适用在长文本主题的提取操作中,这是一类没有监督情况下的主题模型,在进行训练过程中,不需要文档类别标签信息,规避由于人工标注后出现标签质量问题,从而对结果产生的不利影响,LDA能够发掘出语料库的潜在主题,从而获取新主题。鉴于短文本有着稀疏特征,LDA模型在相关领域中并不适用于主题聚类分析。

LDA主题模型评价标准:

困惑度(Perplexity)是评测主题模型对文档d归类于哪种主题所产生的非确定形式标准,一般情况下,选择困惑度形式能够明确最优主题k值。困惑度值和文档d属于哪类主体的不确定程度间呈现出正相关关联,二者都处于低值状态下,这是会产生更好的聚类效果,困惑度表达式如下所示:

其中,代表的是测试集中各个单词对应的频率现象,代表的是文档中各个主题对应的频率现象,代表的是词典中各个单词在主题下对应的概率现象。

2.3 特征融合

特征融合是把用户近似特征融合成高层次全新特征的一类处理模式,从而能够强化分类与聚类效能。底层次有着高分辨率,这是涵盖更多的用户细节特征,能够更加精细的刻画用户形象,有着较弱的语义信息情况。高层次有着低分辨率,存在更强的语义信息,从而会对用户有着更好的解释性,不过却有着较弱的细节表达情况,各个层次下的特征会产生用户刻画的差异化效果。能够把用户原始特征融合成高层次特征,这是会强化特征存在的语义性与可解释性。

表情符号特征融合分析方式:在自媒体中同一条自媒体产生的表情符号,通常是有着共情的表达效果,本文选择表情符号的共现次数,然后展开人工处理,最后完成特征融合。相关的算法如下所述:

(1)核算表情符产生的共现频率,假如在一个自媒体中出现两个表情符,这是会增加1次共现频率。创建表情符聚类阈值。接着对其共现频率进行从高至低的排序,高共现频率的表求符有着优先处理权。

(2)考量每对表情符,参考一个自媒体中出现两个表情符的次数以及共现频率,然后计算表情符间中存在的吸引力,相关计算见式(3-4),代表的是两个表情符产生共现次数,代表的是表情符A对应的出现次数,代表的是表情符B对应的出现次数。假如在任一表情符中已经有着类标签,同时相关的吸引力高于所设阈值,这是需要将此类标签用于另一个表情符的类标签;否则让两个表情符产生全新的类标签。

(3)重复过程(2),直到处理各类表情符号。

选择聚类研究方法,能够聚合有着较高共现频率的特征,不过,并不能一定能够聚合有着近似意义的表情符,譬如。一些表情也是能够表示开心的意思,不过属于小众应用领域,使聚类算法无法将其用于表达开心且高频使用的表情符聚合,因此在人工调整聚合结论过程中,这是需要参考八种情绪类型,分别是喜状态、怒状态、哀状态、惊状态、鼓励状态、尴尬状态、调侃状态以及中性状态等,又是由于在表情符中有着很多针对节日的感情符号,因此能够把节日单独归类,最后出现第9类的节日表情符。

2.4 聚类分析

K-Means算法属于一类没有监督的常用聚类方法,它把节点划分至最短距离的类簇,选择启发迭代方式,计算最小误差平方和值(即SSE),最终获取聚类结果的最优解,其函数表达式如下所示:

其中,k代表的是类簇个数,n代表的是样本数,代表的是第i个样本,代表的是簇j的中心。K-Means有着较少的调参,可以快速收敛与实现,没有较高的时间和内存消耗,能够获取较为理想的聚类效果,把节点划分至最近距离的类簇,其算法有着较强的可解释性。不过,K-Means能够在凸数据集中使用,这是适用在隐含类别有着均衡化状态的数据集,针对数据集有着较为敏感的异常点,其获得的结果有着局部的最优值。

K-Means评估标准:

1)轮廓系数(即SF):这是表现聚类效果的一类评价标准,考量簇内聚合度和簇间分离度给聚类效果产生的整体评价。其轮廓系数的计算如下所示:

其中,表示的是样本存在的簇内不相似度情况,这是样本至同簇其他样本的间距参数。代表的是样本簇间存在不相似度情况,这是样本到其他簇各类样本的最小间距参数。其轮廓系数取值区间范围是[-1,1],轮廓系数和聚类效果间呈现出紧密的正相关关联。

2)CH指标(即Calinski-Harabasz):这是一类内部评价指标,考量类内紧密度和类间分离度的情况,以此从整体层面上评测聚类效果,相关的计算方式如下所示:

(2-7)

其中,k代表的是类簇个数,n代表的是样本数,代表的是类间离差矩阵的迹,这是对分离度进行解析。代表的是类间离差矩阵的迹,以此进行亲密度的描述。该值越高,则表明类间处于更显著的分离状态,类内存在更聚合的情况,从而会出现更优化的聚类效果。

第3章 应用分析及实现

3.1 爬虫原理及其实现

3.1.1 爬虫

爬虫一般指向网站发起请求,获取资源后分析并提取有用数据的程序。其运行过程一般为:模拟浏览器发送 请求(获取网页代码)、提取有用的数据、存放于数据库或文件中。在本项目中,利用 cookie 实现模拟登录,利用网页版微博的高级搜索接口作为入口,可以实现在微博平台的 关键词爬虫,即搜索并储存带有设定关键词的微博。

3.1.2 实现

具体⽽⾔,我们需要的数据是2020年1⽉20⽇到2022年4⽉的疫情中线上教学相关短微博和同时间下某些重点微博下的相关评论,且重点是疫情相关线上教学随机关键词搜索下的微博正⽂,因为我的想法是微博评论的内容会受正⽂影响,且评论

的⽂本普遍短⼩,不能体现疫情下学生⼼态,只能体现学生对新闻所陈述事件的看法,所以我们这个项⽬爬的数据 以短微博⽂本为主。微博的⽹⻚端weibo.cn是⼏个微博接⼝中最好的选择,提供了我们需要的搜索功能,我就可以 借助它来查询特定时间和特定关键词的微博⽂本。爬⾍的主要内容是先在浏览器中请求微博,然后对于得到的内容进⾏解析。

  1. 输入提前注册好的微博账号和密码,设置好需要爬虫的时间范围;

2. 启动爬虫程序,输出结果,形式为 Excel 表格。

由于条件限制,并没有许多微博账号供我们使用,所以在爬虫程序中没有设置账号池,每次模拟登录时只用 了一个账户,导致爬虫速度比较缓慢。考虑到疫情的暴发时间以及大学生的学期课程时间,在本项目中我们分别爬虫并储存了 2019 年至 2021年中 1 月至 6 月的 1-5 号的500条微博,共计有 45000 条左右的微博平台数据。部分结果如图3.1,3.2所示。

图3-1 微博平台爬取数据

图3-2 微博评论数据采集示例

另外还有知乎及 Wondrium、Coursera 外国学习平台数据示例如表 3-3所示,所有数据总量为 60249 条评论

图3-3 Coursera 外国学习平台数据采集示例

3.1.3 请求

请求部分使⽤ requests 库,⽬标是微博⽹⻚端搜索的 url ,为了能够保证在请求时不⽤登陆,可以在请求 的同时传⼊ Cookie ,因为要搜索特定时间和特定关键词的微博,所以在请求时还要传⼊关键词和时间,排序⽅法 要按照时间排序。传⼊的关键词是疫情学生相关的随机关键词,我找到了约50个疫情相关的词语,包括积极词,中性词和消极词,并利⽤ random 模块随机⽣成数字下标,进⾏随机抽取关键词搜索,以求得到的数据能代表当天的⽹⺠主流⼼态。部分关键代码解释如下:

import requests <br>url = 'https://weibo.cn/search/mblog'
 # 网页端微博搜索url
  <br>headers = { <br>'Cookie': '自己的Cookie', <br>'User-Agent': UserAgent().random
   # fake_useragent库 
   <br>}<br>params = { <br>'keyword': self.keyword, 
   # 随机关键词 
   <br>'endtime': self.end_time, 
   # 传入搜索时间,精确到小时,所以爬虫以小时为单位 
   <br>'sort': 'time', # 依据时间对微博进行排序
    <br>}<br>res = requests.get(url=url, params=params, headers=headers) # 仅展示部分代码 <br>|


代码3-1 ⽹⺠主流⼼态代码示例

3.1.4 请求

解析部分使⽤lxml库,详⻅具体代码解读。

from lxml import etree 
# 使用etree对html进行解析 
html = etree.HTML(res.text.encode('utf-8')) 
# 在请求时page从1开始,weibos即每页的微博列表 
# 等到len(weibos)==0就说明微博为空,此时停止即可 
# 我们也不需要太多的文本,每个时间单位爬取大约十页内容即可 
weibos = html.xpath("//div[@class='c' and @id]")

代码3-2 lxml库代码示例

下来解析 weibos 中的每个元素中微博id和微博发布者

# 对于该微博id的获取 
# 利用xpath抽取id属性,体现为@id,后9位是该微博的id号 
weibo['id'] = info.xpath('@id')[0] # M_ItwJTv2Xg 
weibo['id'] = weibo['id'][2:] # ItwJTv2Xg 
# 对该微博发布者进行爬取 
user_info = html.xpath('//div[@class="ut"]/span[@class="ctt"]')[0] 
# 例如'男神优衣裤 男/广东 加关注' 
# '男神优衣裤' '男' '广东' '加关注' 分别是姓名,性别,省份,简介 
# 发布者关注:关注[190] 
following = html.xpath('//div[@class="tip2"]/a[1]/text()')[0] 
# 发布者粉丝:粉丝[28031] 
followd = html.xpath('//div[@class="tip2"]/a[2]/text()')[0] 

代码3-3 元素中微博id和微博发布代码示例

解析正

# 把所有标签中的文本(包括嵌套)提取出来,并且放到一个字符串中 
weibo_content = html.xpath('string(.)') 
# 例如:'无悔无花:我刚刚关注了肺炎患者求助超话,抗击肺炎疫情,我们在一起,共同关注→肺炎患者求助 赞[0] 转发 
[0] 评论[0] 收藏 2020-02-10 10:59:58 来自超话' 
# 然后截取所有 '赞' 之前的内容就是正文 
weibo_content = weibo_content[:weibo_content.rfind(u'赞')] 
# 包括发布微博的具体时间和来自设备都基于此 

代码3-4 解析正文代码示例

解析完所有的数据后,要把每⼀条微博写⼊csv⽂件

result_headers = ['微博id', '发布者昵称', '发布者性别', '发布者地区', '发布者关注数', '发布者粉丝数', 
'微博正文', '发布时间', '点赞数', '转发数','评论数', ] 
result_data = [w.values() for w in self.weibo][wrote_num:] 
with open('topic/' + 'some keyWords' + str(mystart_day) + '.csv', 'a', encoding='utf-8-sig', 
newline='') as f: 
writer = csv.writer(f) 
global boo 
if boo: 
# 第一次要写表头,后序不用写了 
boo = False 
writer.writerows([result_headers]) 
writer.writerows(result_data)

代码3-5 写⼊csv文件代码示例

3.1.5防反爬虫

由于微博平台有着严格的反爬⾍策略,经常会被封号,所以我也采取了一些措施来防反爬虫。首先是设置 了 user-agent ,利 from fake_useragent 中的 UserAgent().random 来⽣成随机的 user-agent ,且每次 爬⾍完毕都会暂停随机⼏毫秒,来防⽌速度过快: sleep(random.randint(6, 10)) ,并且我使⽤了ip全局代理 来通过不同ip进⾏访问,防⽌ip被封。

3.2 分词、数据清洗和词频统计

3.2.1 分词

分词是统计词频的必要步骤之一。

我们的最终目的是提取到每条微博数据的关键信息以便以后对搜集到的所有数据做分析,即需要找出每条微博的关键词。这里使用 jieba 库实现微博文本的分词。jieba 库是一个第三方中文分词库,支持三种分词模式:精 确模式、全模式和搜索引擎模式,这里使用了精确模式,可以将语句精确切分,不存在冗余数据,适合做文本分析。

3.2.2 数据清洗

得到了经过分词的文本数据后,在这时统计词频的话会发现有大量的无用词语,类似于“你的”、“我 的”、“这个”、“那个”等等,所以在统计词频之前还需要经过一个数据清洗的步骤,即删除停用词。 主要方法是:提前创建一个停用词列表“stopwords”,然后遍历每一条经过分词的文本数据,如果句子中有 在停用词列表中的词语,那么将这个词删去。主要步骤如下:

1. 将 2.1 中的爬虫数据按行读入,存在一个 list 中;

2. 创建一个新的临时空字符串,将 list 中的每条文本与停用词列表比较,如果该词不是停用词,那么将此词语添

加到创建的临时字符串中,检查完一条文本后,将此临时字符串输出为清洗后的文本数据。

3. 输出经过清洗的所有文本数据,形式为 txt 文件。

部分清洗结果如图3.4所示

图3-4 部分清洗结果

此时就可以进行词频的统计了,部分结果统计如下表3.1,3.2,3.3所示:

表3-1 微博 2019 年上半年词频数排行前 20 词频表

表3-2微博 2020 年上半年词频数排行前 20 词频表

表3-3微博 2021 年上半年词频数排行前 20 词频表

  • 先来看段例。
示例:'回复@让我再看你一眼 //让我再看你一眼·:#高以翔[超话]# 以翔 这个点了睡意全无 节日现在对于我们就是一种 
悲伤 没有了你世界都乱了 新冠肺炎疫情爆发让多少家庭除夕夜不能团聚 如果你在肯定会教我们正确的心态对待 会为逆行 
英雄打call 会做慈善捐助 因为你是Godfrey@高以翔Godfrey @全世界最好的高以翔Godfrey 仙桃 显示地图 原图 

发现微博正⽂中有很多特殊字符,⽽且有很多格式是我们不需要的。例如微博中的@,这个表⽰微博和某⼈相 关来给其⼀个提⽰,但是@后跟着的是⽤⼾昵称,这与⽂本内容⽆关,所以我们需要将其清洗掉。另外微博中含有 很多表情符,例如 [微笑] ,感觉现代表情的含义是⾮常之丰富和复杂的,但绝⼤多数表情是为⽂本内容服务的, 起到⼀个加强⽂本预期的作⽤,所以我可以将其处理掉,来减少后序任务的复杂性。剩余的例如⽹址、特殊字等请 看下⾯的代码详解。

# 清除用户名(:前的用户名) 
for i in range(len(text)): 
if text[i] == ':' or text[i] == ':': 
text = text[i + 1:-1] 
break 
# 清除网址url 
zh_puncts1 = ",;、。!?()《》【】" 
URL_REGEX = re.compile( 
r'(?i)((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>' + 
zh_puncts1 + ']+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)| 
[^\s`!()\[\]{};:\'".,<>?«»“”‘’' + zh_puncts1 + ']))', 
re.IGNORECASE) 
text = re.sub(URL_REGEX, "", text) 
# 清除@和回复/转发中的用户名 
text = re.sub(r"(回复)?(//)?\s*@\S*?\s*(:|:| |$)", " ", text) 
# 清除中括号包着的表情符号 
text = re.sub(r"\[\S+?\]", "", text) 
# 清除话题内容 
text = re.sub(r"#\S+#", "", text) 
# 清除多个空格 
text = re.sub(r"(\s)+", r"\1", text) 
# 清除常见停用词标中的词,例如:展开、全文、转发、显示原图、原图 等等 
for x in stop_terms: 
text = text.replace(x, "") 
# 清除前后空格 
text = text.strip()

代码3-6 ⽹址、特殊字代码示例

对上述⽰例进⾏应⽤,可以得到以下结果。

原文:'回复@让我再看你一眼·//让我再看你一眼·:#高以翔[超话]# 以翔 这个点了睡意全无 节日现在对于我们就是一种悲 
伤 没有了你世界都乱了 新冠肺炎疫情爆发让多少家庭除夕夜不能团聚 如果你在肯定会教我们正确的心态对待 会为逆行英 
雄打call 会做慈善捐助 因为你是Godfrey@高以翔Godfrey @全世界最好的高以翔Godfrey 仙桃 显示地图 原图 
http://t.cn/Ir1YpaAb0' 
清洗结果:'以翔 这个点了睡意全无 节日现在对于我们就是一种悲伤 没有了你世界都乱了 新冠肺炎疫情爆发让多少家庭除 
夕夜不能团聚 如果你在肯定会教我们正确的心态对待 会为逆行英雄打call 会做慈善捐助 因为你是Godfrey 仙桃' 

3.2.3 词频统计

将文本数据导入 Python 软件生成词频矩阵,部分词频矩阵如表所示。词频矩阵中每行代表一条评论的内容,每列代表一个关键词,矩阵中的 1 表示此评论中含有对应的关键词,而 0 代表的是此评论中不含对应的关键词,如表3.4所示。

表3-3 2020 年上半年部分词频矩阵

通过词频矩阵的形式,可以将每条文本数据转换为 n 维 1/0 值向量的形式,此时可以对比分析每个向量之间的相似性来给文本数据分类。

在进行精准分类之前,需要通过 SPSS 软件大概估计出共有几个类别。将上面计算出的词频矩阵导入 SPSS,再进行分析-分类-系统聚类,经过多次试验发现,系统聚类的方法 选择组间连接-欧氏距离较好,此法采用简单匹配系数度量评论之间的相似性,简单匹配系数是当两条评论在关键 词上的数值相同时出现的频率,频率越高说明两条评论越相似。微博 2019 年上半年经过系统聚类后的谱系、微博 2020 年上半年经过系统聚类后的谱系、Coursera 经过系统聚类后的谱系、Wondrium 经过系统聚类后的谱系如图3-5,3-6所示:

图3-5 微博 2019 年上半年系统聚类分析谱系图

图3-6 微博 2020 年上半年系统聚类分析谱系图

通过 SPSS 的估计后观察谱系图可以发现所有的数据大致被分为了 7 类,接着进行具体的聚类

3.4 情感分析

我们选用了情感分析作为参考大学生对于线上教学的评价标准之一。情感是文本所具有的属性,这里我们使用了 SnowNLP 库,可以粗略判断文本的情感,得出的数值是该文本蕴含积极情感的概率。例如:

代码3-7 蕴含积极情感的概率代码示例

情感计算需要准备情感词表,否定词和程词表,情感计算规则。本作业采⽤的Boson情感词典能良好的展现情 感类型和强度,此外,基于上述SO-PMI算法,我对原有词典进⾏了补充,将发现的新词按强度值为 1 拓展了原有词典。下⾯展⽰⼀些⽰例:

积极词示例: 
爽朗 2.1359760295 
大步 2.13600542481 
欢声笑语 2.15198331531 
喜报 3.03301490396 
消极示例: 
住嘴 -1.58328814932 
惨淡 -1.57775898103 
忧心忡忡 -1.59476173694 
恶性 -1.59597143208

程度词部分,本次作业使⽤知⽹程度词表,我们⼈⼯也对其进⾏了简化,选取了较多的⽇常程度副词,按程度 ⼤致分为四个等级,并对每个等级赋予了相应的程度权值,具体内容如下。

算法的具体流程图3-7如下:

图3-7情感词典流程

核⼼代码解释:

# 核心循环如下 
# 首先对短文本数据清洗,分句分词 
datafen_dist = sent2word(d) 
# 为了减少下一步操作的复杂性,先将词的种类区分 
data_1 = classifyWords(datafen_dist, words_vaule[0], words_vaule[1], words_vaule[2]) 
# 计算情感值,在这个函数中计算了组合的情感值,句子的情感值并将它们累加 
data_2 = scoreSent(data_1[0], data_1[1], data_1[2],returnsegResult(data[0])) 
# 保存 
score_var.append(data_2) 

代码3-8 情感词典核心代码

经过计算,得到了 2019 年至 2020 年每年和每月的积极情感文本百分比,结果如下表3-4:

表3-4 情感文本百分比

经过前端的可视化方法生成折线图可以看出:疫情前都是一些主动去接触在线学习的同学,所以对于在线学 习的评价基本都是积极正面的,然而因为疫情,大家不得不“被迫”在线学习,所以对于在线学习消极评论的比例明显提高,特别是在 2020 年 2 月大学开学并且普遍实行网课的第一个月,积极情绪文本占比最少。而 2021 年疫情后的每月数据比较稳定,可以看出同学们对与线上教学已经比较适应,且评价良好。 总体而言,2020 年的每月积极文本占比均小于 2019 年同期,但是随着时间推移,线上教学的软件、硬件条件 发展以及学生们对于线上教学形式的熟悉,大家对于网课的评价逐渐升高,2021 全年趋于稳定。

图3-7网课的评价趋势图

第4章 实验分析

4.1 实验数据集

本章对于实验对象的选择是的微博数据,数据的选择要保证全面与详细,本次研究选取的数据样本包括了微博用户信息以及他们相互之间的一个关注关系网络、用户发布的博文信息汇总。为保证选用数据的有效性,由于条件限制,并没有许多微博账号供我们使用,所以在爬虫程序中没有设置账号池,每次模拟登录时只用 了一个账户,导致爬虫速度比较缓慢。考虑到疫情的暴发时间以及大学生的学期课程时间,在本项目中我们分别 爬虫并储存了 2019 年至 2021 年中 1 月至 6 月的 1-5 号的 500 条微博,共计有 45000 条左右的微博平台数据。

具体统计特征见表4-1。

表4-1 微博数据集统计信息表

用户数微博数用户平均微博数用户平均粉丝数用户平均关注的人数用户平均好友数
微博数据400004500073727632590

4.2 实验与结果

我爬取了疫情期间2019 年至 2021 年中 1 月至 6 月的 1-5 号的 500 条微博共计50MB数据,这些数据于随机抽取的疫情关键词, 且微博发布时间在每天都是随机且均匀的,然⽽可以看到微博中依然有很多并⾮学生发布的微博,这部分需要进⾏筛选。

图4-1 爬虫数据的展示

除此之外,为了⽅便下⾯的关键事件分析,我还专⻔爬取了⼏个特定时间和关键词的⽂本。为了研究新闻对评论影响这个部分, 我还爬取了50多条视新闻微博号下的共计上千条评论,具体的内容都在相应的⽂件夹下。 但是我们的数据也存在⼀定的问题,虽然说上⾯我们完成了 clean_text() 能够很好的对数据进⾏清洗,然⽽由 于微博搜索引擎的问题,我们爬取到的微博有很⼤⼀部分并⾮是⽤⼾发布,我们认为⼀些官⽅号、官媒号微博不能 代表⽹⺠的⼼态和情绪,所以再后序进⾏操作时,我们根据发布者粉丝 这⼀项对粉丝数⼤于⼀万的微博进⾏了剔除尽可能的保证所有的微博都来⾃于⽹⺠⽽不是其他。

for distribution in distributions: 
pars = distribution.fit(dataCorrect) 
mle = distribution.nnlf(pars, dataCorrect) 
best_fit = sorted(zip(distributions, mles), key=lambda d: d[1])[0] 
distribution = best_fit[0] 
filtLine = distribution.ppf(0.5) 
# 展示一部分结果 
'IrMfqgVcp' 'IrLLnxlV6' 'IrLG17B0T' 'IrLiGmPHY' 'IrKUN65dn' 'IrKgIwTON' 
'IrJQyk6v1' 'IrJx4lyl3' 'IrJp1y8hc' 'IrITomBuN' 'IrGPymng0' 'IrGJy4uBH' 
'IrGGYdtHN' 'IrGDljlG7' 'IrGp9290u' 'IrGjNxyFI' 'IrCzHDIra' 'IrC1TqAxz' 
'IrAQ3E9qR' 'IryC5cLh5' 'IrxRygshq' 'IrxvY0Zau' 'Irxp1aPIL' 'IrxlWy3Io'

代码3-89 核心代码

以上程序得到的数据可以通过 Echarts 形成可视化图表。经过分析数据类型并设计展示方法、图表形式等,最终决定采用大屏展示数据的方法,利用 HTML 和 JS 编程实现网页呈现。其中运用了 Echarts 库和 jQuery 库,方便数据的展示,如图4-2 所示:

图4-2 数据的展示

最终效果如图4-3所示:

图4-3 最终效果图

4.3 线上教学趋势分析

根据聚类分析的类别图,对于所搜集到的评论数据,本研究基于学生体验的立场,从疫情前后对大学生在线 学习状况进行讨论。 通过分析 2019 年至 2021 年聚类后的 7 类文本,统计出每个类别的词频得到高频词,归纳总结其中的关键词

可以将 7 类文本归类,得到相关信息

表4-2 2021 年高关联度关键词及类型定义表

表4-1 2020 年高关联度关键词及类型定义表

表4-3 2019 年高关联度关键词及类型定义表

根据对比疫情前后的微博文本类型可以发现,在疫情爆发学生普遍被要求参加线上教育后,关于“网课感 受”的微博数量大大增加,同时因为疫情前大部分人是主动自愿使用网课学习,而疫情后是被迫要求,2020 年的 微博多出了关于“上课形式”的种类。 在疫情前,大部分人是因为自己的需要,例如“课程种类”中的考研等,主动选择了线上学习,结合情绪分析可以知道,主动选择线上学习的这些同学对于这种学习方式还是比较认可的,例如:

图4-4 认可线上学习

而在疫情后,对于网课的评价形成了对比,有些同学较线下教学更喜欢线上学习的方式,认为网课可以重复 观看,并且不受场地的限制,甚至对于有些人可以节省住宿的费用,上网课不用浪费路途中的时间,自由度高,可以休息得更好等,例如:

图4-5 喜欢线上网课

而有些同学对于线上教学评价比较消极,例如:

图4-6 消极评价线上网课

对于网课的负面评价除了以上觉得网课比线下教学辛苦,作业多,学习质量不高等,还有如下原因:例如硬件设施无法满足上网课的需要:

图4-7 硬件设施无法满足

其他的还有觉得一直面对电子产品会影响身体健康:

图4-8 电子产品会影响身体健康

同时对于线上教学,教师也有消极的评价:

图4-9 教师消极的评价

结合以上信息可以发现有以下问题存在:

1. 研究发现线上教学中外部硬件设备方面的问题在很大程度上影响到学生的学习体验。在评论中,有一部分 网友因为处在信号不稳定的农村偏远地区或是家庭经济条件落后,存在着电子设备数量稀少、性能不足、家中没 有无线网等现实问题,往往导致电子设备无法承载相关教学软件、手机流量不足和无法正常上课等问题KaTeX parse error: Undefined control sequence: \[ at position 11: ^{\mathrm{\̲[̲7]}}

2. 有许多学生反映教师由于对平台功能了解不足,操作不熟练,进而导致上课期间,教师在平台操作上花费 了大量的时间精力,导致课程时间延长、占据学生大量幕前时间和教学时间有效性低等问题。

3. 研究发现微博评论中学生对于网课感受发表了最多的评论,在大约三万条数据中占据了 1/3,线上教学平台 体验是影响学生体验的重要因素之一。疫情的突然爆发,导致线上教学平台承载客户量激增,在运行过程中产生 了不同程度的卡顿、闪退,甚至是平台彻底崩溃。但是也有同学认为网课可以录制上课视频的功能,可以在课后 进行回看、反复播放是优点之一。

4. 学习状态。学生的学习状态决定了学生的学习效率和学习质量。疫情期间,学生的学习环境仅局限于家中 一隅天地,无法体验到与学校所营造出的相同的学习情境性。不同人自律程度和学习态度会对线上教学质量产生 影响。有些人认为“在家中学习只有一个人没老师监管很不自觉”;而也有人认为“地点不重要,重要的是我们的 态度”。同时,由于需要长时间面对电子屏幕,很多微博反映“眼睛吃不消”,学生个人的健康状况也会对教学质 量造成影响。

5. 课业任务。由于教学形式的改变,课程效果的不确定性使得部分教师为了学生能够在新的教学形式下达到 与线下教学相同的教学效果,增加了课后作业的任务量,给学生增加了学业压力,同时由于在家中学习没有相应 的教材书本支持,很多学生对于知识点的理解存在困难。

  • 10
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小王java

学习java的路上,加油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值