数学建模预测模子实例–表明墙影响气力化模子
数学建模预测模子实例–大学生体测数据模子
python机器学习–线性回归
The Leaky Integrate-and-Fire (LIF) Neuron Mode-LIF神经元模子
创建模子的目的
本篇文章中,假设获取到了某高校表明墙建墙以来至2020年12月21日发布的所有说说的文字内容,发布时间,点赞数,批评数。目的是通过前期数据挖掘探索性数据分析等创建表明墙影响气力化模子,进而得出发布寻物类消息的最佳时机以及连续影响力,最大影响人数等指标。
数据分析的根本过程包括:获取数据、数据清洗、中文分词聚类、探索性数据挖掘、数据可视化、基于SIR模子的表明墙影响气力化模子。
获取数据
在这里我们用selenium模拟登录qq空间,然后用xpath分析网页
- #coding: utf-8from imp import reloadimport timefrom selenium import webdriverfrom lxml import etreeimport pandas as pddef text(friend, user , pw): # 获取欣赏器驱动 driver = webdriver.Chrome(executable_path='chromedriver') # 欣赏器窗口最大化 driver.maximize_window() # 欣赏器所在定向为 qq 登岸页面 driver.get('http://i.qq.com') # 所以这里需要选中一下 frame,否则找不到下面需要的网页元素 driver.switch_to.frame('login_frame') # 自动点击账号登岸方式 driver.find_element_by_id('switcher_plogin').click() # 账号输入框输入已知 QQ 账号 driver.find_element_by_id('u').send_keys(user) # 暗码框输入已知暗码 driver.find_element_by_id('p').send_keys(pw) # 自动点击登岸按钮 driver.find_element_by_id('login_button').click() time.sleep(10) # 让 webdriver 操纵当前页 driver.switch_to.default_content() # 跳到说说的 url,friend 你可以任意改成你想访问的空间 driver.get('http://user.qzone.qq.com/' + friend + '/311') next_num = 0 # 初始“下一页”的 id while True: # 下拉滚动条,使欣赏器加载出动态加载的内容 # 我这里是从 1 开始到 6 竣事分 5 次加载完每页数据 for i in range(1, 6): height = 20000 * i# 每次滑动 20000 像素 strWord = "window.scrollBy(0," + str(height) + ")" driver.execute_script(strWord) time.sleep(4) # 许多时候网页由多个或组成,webdriver 默认定位的是最外层的 frame # 所以这里需要选中一下说说所在的 frame,否则找不到下面需要的网页元素 driver.switch_to.frame('app_canvas_frame') selector = etree.HTML(driver.page_source) divs = selector.xpath('//*[@id="msgList"]/li/div[3]') # 这里使用 a 表现内容可以连续不清空写入 with open(r'C:\Users\15643\Desktop\公众号\表明墙\data2.csv',"a",encoding='utf-8')as f: for div in divs: #qq_name = div.xpath('./div[2]/a/text()') qq_content = div.xpath('./div[2]/pre/text()') qq_time = div.xpath('./div[4]/div[1]/span/a/@title') qq_zan = div.xpath('./div[5]/div[2]/a[2]/text()') qq_comment = div.xpath('./div[4]/div[2]/a[3]/text()') #qq_name = qq_name[0] if len(qq_name) > 0 else '' qq_content = qq_content[0] if len(qq_content) > 0 else '' qq_time = qq_time[0] if len(qq_time) > 0 else '' f.write("{}.{}.{}.{}\n".format(qq_content,qq_time,qq_zan,qq_comment)) print(qq_time, qq_content,qq_zan,qq_comment) # 当已经到了尾页,“下一页”这个按钮就没有 id 了,可以竣事了 if driver.page_source.find('pager_next_' + str(next_num)) == -1: break # 找到“下一页”的按钮,因为下一页的按钮是动态变革的,这里需要动态纪录一下 driver.find_element_by_id('pager_next_' + str(next_num)).click() # "下一页"的 id next_num += 1 # 因为在下一个循环里首先还要把页面下拉,所以要跳到外层的 frame 上 driver.switch_to.parent_frame()if __name__ == '__main__': friend = 'xxxx' # 朋侪的 QQ 号,朋侪的空间要求允许你能访问 user = 'xxxx' # 你的 QQ 号 pw = 'xxxx' # 你的 QQ 暗码 text(friend, user, pw)
复制代码 最终获取到一个包罗所有说说内容,发布时间,点赞数,批评数的excel文件,随后再将说说文本提取到一个txt文件里面便于之后举行分词。
最终获取到的数据:说说数据.xlsx
说说文本.txt
数据:表明墙数据 提取码:klh0
数据清洗—中文文天职词
首先先对txt里的说说数据举行分词、并删去停用词,无效符号。思量到表明墙中一些词语的连贯性,我们引入了自界说词典
求同好
大橘
首医
墙墙
表明墙
一教
二教
随后运用jieba分词库举行分词处置处罚
- import jieba# 加载停用词列表def load_stopword(): f_stop = open('stopword.txt', encoding='utf-8') # 自己的中文停用词表 sw = [line.strip() for line in f_stop] # strip() 方法用于移除字符串头尾指定的字符(默认为空格) f_stop.close() return sw# 中文分词而且去停用词def seg_word(sentence): file_userDict = 'dict.txt' # 自界说的词典 jieba.load_userdict(file_userDict) sentence_seged = jieba.cut(sentence.strip()) stopwords = load_stopword() outstr = '' for word in sentence_seged: if word not in stopwords: if word != '/t': outstr += word outstr += " " print(outstr) return outstrif __name__ == '__main__': with open("qq_word.txt", "r",encoding='utf-8') as f: content=f.read() result = seg_word(content)
复制代码 分词竣事后再应用 jiaba.analyse.extract_tags() 中默认的TF-IDF模子对文档举行分析。
TF-IDF的根本思想是:词语的重要性与它在文件中出现的次数成正比,但同时会随着它在语料库中出现的频率成反比下降 。也就是说TD-IDF综合思量了两方面因素,清除了那些看似词频很高实则是无效常见词的情况(比方:的,包括)。因此某个词对文章的重要性越高,它的TF-IDF值就越大
- #关键词提取import jieba.analyse as analyseanalyse.extract_tags(result, topK=5, withWeight=True, allowPOS=())#词云制作import matplotlib.pyplot as pltfrom wordcloud import WordCloudimport jiebaimport oswc = WordCloud(background_color = "white", #设置配景颜色 #mask = "图片", #设置配景图片 max_words = 1500, #设置最大显示的字数 #stopwords = "", #设置停用词 font_path = r'C:\Users\15643\Desktop\公众号\表明墙\qihei55.ttf', #设置中文字体,使得词云可以显示(词云默认字体是“DroidSansMono.ttf字体库”,不支持中文) #max_font_size = 50, #设置字体最大值 #random_state = 30, #设置有多少种随机生成状态,即有多少种配色方案 width=1920, height=1080, margin=5, )myword = wc.generate(result)#生成词云myword.to_file(os.path.join(r'C:\Users\15643\Desktop\公众号\表明墙\wordcloud.png'))#展示词云图plt.imshow(myword)plt.axis("off")#plt.savefig(r'C:\Users\15643\Desktop\公众号\表明墙\wordcloud.png')plt.show()
复制代码
从以上效果可以看出,提取到的分词数据所制成的词云图与关键词相呼应,表明“表明,求助,吐槽,失物招领,一周cp”是表明墙的主题内容。表明墙不愧为表明墙,表明照旧占了绝大多数。
探索性数据分析–表明+吐槽
确定思路
在举行过初始的数据清洗之后我们找到了表明墙的五大主题,为了方便接下来的分析,我们将这五大主题划归为三大类:表明,吐槽,寻物,在这里我们认为前两类是带有显着且强烈的情感暗示的内容,因此这两类说说的点赞,批评,以致发布时间大概会遵循某种分布。以下为对这两类说说的分析
注:为包管数据的真实性,我们删去了新冠疫情期间的所有表明墙数据(2020/3-2020/8)
时间分析
为了衡量表明墙发布这两类投稿的偏好时间,我们对一天三个时间段表明墙针对这两个主题说说的发布情况举行了统计。
[code]##以吐槽说说的分析过程为例import numpy as npimport pandas as pdexcel_path_1 = r'C:\Users\15643\Desktop\吐槽全.xlsx'df1 = pd.DataFrame(pd.read_excel(excel_path_1))time_new = pd.to_datetime(df1['time'],format='%H:%M:%S')df1['hour']=time_new.dt.hourm=[]a=[]e=[]for i in range(len(df1)): if 8 |