Hi,大家好,这里的建模A君,今年深圳杯和东三省用同一套赛题,这里A君先简单介绍一下A题建模思路,详细思路会放在群里!
“尖叫效应”是心理学中的一个著名效应。例如在一个人潮涌动的公众场合,如果有人
突然歇斯底里地尖叫,往往能快速吸引人们的注意力并博取眼球。在网络信息传播中,“尖
叫效应”也无处不在。一些网络平台利用大数据和人工智能,获取并分析用户浏览记录和兴
趣爱好等信息,大量推送段子、恶搞、色情等低俗内容。无论是从满足人们的猎奇心理,还
是引发人们的指责批评,传播者都能从中获取高额的流量和点击率。
“回声室效应”指的是在一个相对封闭的媒体环境中,一些意见相近的声音不断重复,
甚至夸张扭曲,令处于其中的大多数人认为这些声音就是事实的全部 , 不知不觉中窄化自己
的眼界和理解,走向故步自封甚至偏执极化。在现代社会中,由于互联网以及社交媒体的发
展,在网络信息传播中“回声室效应”愈发明显。部分商业网站会分析记录用户的搜寻结果
以及使用习惯,持续地将一位用户所喜欢的内容提供给该用户,导致一个人在同一网站中接
受到的资讯被局限于某个范围内。
“尖叫效应”与“回声室效应”容易导致“信息茧房”的形成。所谓“信息茧房”指的
是,在信息传播中人们自身的信息需求并非全方位的,只会选择自己想要的或能使自己愉悦
的信息,久而久之接触的信息就越来越局限,最终将自己桎梏于像蚕茧一般的“茧房”中,
失去对其他不同信息的了解能力和接触机会。
在全新的信息传播格局下,如何破除“尖叫效应”与“回声室效应”,走出“信息茧房”,是当前迫切需要解决的现实问题,即如何从信息传输的顶层设计、推荐算法的公平性和广大网络用户的责任担当等方面,帮助公众对新闻事件乃至社会现实有一个相对准确、清晰的认识和判断,并在主流意识和个性化信息之间找到平衡点,使得网络舆论环境更具理性和建设性。请回答以下问题:
1 针对某些话题,在微信、微博、Facebook和Twitter等社交媒体上下载相关数据,定量描述该话题(或信息)的传播过程,并分析其影响因素。该数据分析需至少针对两种不同的话题展开讨论,其中一个话题最终观点趋于相同(中立共识),另一话题最终观点趋于两极分化(观点极化)。
2 建立数学模型刻画中立共识和观点极化的产生机制,探索“尖叫效应”、“回声室效应”与“信息茧房”的形成机制,并讨论话题的吸引度、用户的活跃度、用户心理、不同用户间的相互影响、平台推荐算法等因素对形成这些现象的影响。
3 根据问题2建立的数学模型,制定破除“尖叫效应”和“回声室效应”、规避“信息茧房”的策略。
4 基于上述数据分析与数学模型,针对如何破除“信息茧房”撰写1~2页报告,分别对政府的顶层设计、主流媒体的引领和广大网络用户的责任担当提出相应的解决方案或建议。
本题其实已经有现成的模型和解法了,需要先对数据进行爬取,爬取数据后对数据进行舆情分析,分析以后得到大部分主题模型(也就是我们仓间的词图云),或者用LDA模型分析主题也可以。
得到主题后分析关联度,这里需要对信息信息茧房有个评分模型,也就信息茧房的程度值,关于这点我还在思考,思路出来后第一时间开放。
这里先给出LDA的详细实现
数据预处理
该步骤可自行处理,用excel也好,用python也罢,只要将待分析文本处理为csv或txt存储格式即可。注意:一条文本占一行
例如感想.txt:
我喜欢吃汉堡
小明喜欢吃螺蛳粉
螺蛳粉外卖好贵
以上句子来源于吃完一个汉堡还想再点碗螺蛳粉,但外卖好贵从而选择放弃的我
去除停用词
import re
import jieba as jb
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
return stopwords
# 对句子进行分词
def seg_sentence(sentence):
sentence = re.sub(u'[0-9\.]+', u'', sentence)
#jb.add_word('词汇') # 这里是加入自定义的词来补充jieba词典
sentence_seged = jb.cut(sentence.strip())
stopwords = stopwordslist('自己搜来的停用词表.txt') # 这里加载停用词的路径
outstr = ''
for word in sentence_seged:
if word not in stopwords and word.__len__()>1:
if word != '\t':
outstr += word
outstr += " "
return outstr
inputs = open('感想.txt', 'r', encoding='utf-8')
outputs = open('感想分词.txt', 'w',encoding='utf-8')
for line in inputs:
line_seg = seg_sentence(line) # 这里的返回值是字符串
outputs.write(line_seg + '\n')
outputs.close()
inputs.close()
该步骤生成感想分词.txt:
我 喜欢 吃 汉堡
小明 喜欢 吃 螺蛳粉
螺蛳粉 外卖 好贵
句子 来源于 吃完 一个 汉堡 再点碗 螺蛳粉 外卖 好贵 选择 放弃
构建LDA模型
假设主题个数设为4个(num_topics的参数)
import codecs
from gensim import corpora
from gensim.models import LdaModel
from gensim.corpora import Dictionary
train = []
fp = codecs.open('感想分词.txt','r',encoding='utf8')
for line in fp:
if line != '':
line = line.split()
train.append([w for w in line])
dictionary = corpora.Dictionary(train)
corpus = [dictionary.doc2bow(text) for text in train]
lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=4, passes=100)
# num_topics:主题数目
# passes:训练伦次
# num_words:每个主题下输出的term的数目
for topic in lda.print_topics(num_words = 20):
termNumber = topic[0]
print(topic[0], ':', sep='')
listOfTerms = topic[1].split('+')
for term in listOfTerms:
listItems = term.split('*')
print(' ', listItems[1], '(', listItems[0], ')', sep='')
可视化——pyLDAvis
import pyLDAvis.gensim_models
'''插入之前的代码片段'''
import codecs
from gensim import corpora
from gensim.models import LdaModel
from gensim.corpora import Dictionary
train = []
fp = codecs.open('感想分词.txt','r',encoding='utf8')
for line in fp:
if line != '':
line = line.split()
train.append([w for w in line])
dictionary = corpora.Dictionary(train)
corpus = [dictionary.doc2bow(text) for text in train]
lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=4, passes=100)
# num_topics:主题数目
# passes:训练伦次
# num_words:每个主题下输出的term的数目
for topic in lda.print_topics(num_words = 20):
termNumber = topic[0]
print(topic[0], ':', sep='')
listOfTerms = topic[1].split('+')
for term in listOfTerms:
listItems = term.split('*')
print(' ', listItems[1], '(', listItems[0], ')', sep='')
d=pyLDAvis.gensim_models.prepare(lda, corpus, dictionary)
'''
lda: 计算好的话题模型
corpus: 文档词频矩阵
dictionary: 词语空间
'''
#pyLDAvis.show(d) #展示在浏览器
# pyLDAvis.displace(d) #展示在notebook的output cell中
pyLDAvis.save_html(d, 'lda_pass4.html')
运行结果: