论如何知道一个人近年来关注了啥
任务背景:
爬取水木社区某位贴主在所有发帖版面的帖子,分析随时间变化,贴主关注话题的变化。
主要步骤:
1.爬取帖子
这部分的实现源码存于“水木爬虫”文件夹中,运行环境为python3。
1)获取发帖版面:首先是spiderman_007.py,在代码中可设置待爬的贴主id。以贴主VChart为例,运行可得到该贴主发帖的版面及该版面的页数,记录在文件中“VChart.txt”中,
关键代码:
1 # 查找发贴版面并记录版面信息 2 while page_num < url[topical]: 3 content = get_url_content(now_url) 4 page_num += 1 5 page_str = str(page_num) 6 now_url = base_url + page_str # 构造爬虫的网页链接 7 soup = BeautifulSoup(content, 'html.parser') # 用BeautifulSoup提取网页中的文本内容 8 i = 0 9 name = 'VChart' 10 while i < 20: 11 # 查找标签获取贴主id 12 new_name = soup.find_all("li")[i].next_element.next_sibling.next_element.next_element.next_element 13 14 # 若查找到一条记录就记录信息并跳出循环进行下一版面的查找 15 if new_name == name: 16 f.write("\'" + topical + "\'" + ": " + str(url[topical]) + ", ") 17 i = 21 18 page_num = url[topical] + 1 19 elif new_name is None: 20 i = 21 21 i += 1
View Code
部分截图如下:
2)爬取帖子:根据Vchart.txt中的信息,运行spiderman.py可得到该贴主截至目前发布的帖子,记录在文件“VChart_texts.txt”中。
关键代码:
1 # 爬取每个版面的贴主的帖子并写入文件 2 now_url = base_url + page_str # 构造爬虫网页链接 3 soup = BeautifulSoup(content, 'html.parser') # 使用BeautifulSoup提取网页中的文本信息 4 i = 0 5 name = 'VChart' 6 while i < 20: 7 # 获取每一页所有的贴主id 8 new_name = soup.find_all("li")[i].next_element.next_sibling.next_element.next_element.next_element 9 10 if new_name == name: 11 new_url = base_url_+soup.find_all("li")[i].next_element.next_element.get('href') 12 f.write(new_url) 13 f.write("\n") 14 15 content_ = get_url_content(new_url) 16 soup1 = BeautifulSoup(content_, 'html.parser') 17 s = soup1.select(".sp") 18 f.write(s[2].previous_sibling()[0].get_text()) 19 l = len(s) 20 j = 2 21 while j < l-2: 22 s1 = s[j].get_text() 23 j += 1 24 f.write(s1) 25 time.sleep(1) 26 i += 1
View Code
部分截图如下:
2.对帖子进行排序、分词、聚类
1)排序:对帖子按时间进行排序,运行sort_data.py可得VCharttexts_sorted.txt,
关键代码:
1 # 根据一段帖子文本中的时间信息排序,返回一个list 2 def list_sort(list1): 3 pattern = re.compile("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}") 4 5 print(list1) 6 list2 = re.findall(pattern, str(list1)) 7 list3 = list(zip(list2, list1)) 8 list3 = sorted(list3, key=lambda item: item[0]) 9 list4 = [] 10 for temp in list3: 11 list4.append(temp[1]) 12 return list4
View Code
部分截图如下:
2)分词:将帖子按一定时间段分为不同文件,以每一年为一段为例,该贴主的帖子发帖时间为2004-2018年,共分为15个文件存于文档->VChart->time中,运行fenci_time.py可以得到每一段时间文档的分词及词频结果,存于time文件下。
关键代码:
1 # 分词写并写入文件 2 def segmented(file, text): 3 ans = re.sub('[^\w\u4e00-\u9fff]+', "", text) # 正则表达式过滤出汉字 4 ans = "".join(ans.split()) 5 # seg_list = jieba.cut(ans) # 精确模式(默认是精确模式) 6 # print("[精确模式]: ", "/ ".join(seg_list)) 7 words = jieba.cut(ans, cut_all=False) 8 word_freq = {} 9 stopwords = stopwordslist('ting.txt') # 去除停用词 10 for word in words: 11 if word in word_freq: 12 word_freq[word] += 1 13 else: 14 word_freq[word] = 1 15 16 freq_word = [] 17 for word, freq in word_freq.items(): 18 freq_word.append((word, freq)) 19 freq_word.sort(key=lambda x: x[1], reverse=True)
View Code
3)分词:运行fenlegeci.py可以得到对所有贴子进行分词、排序并统计词频的文件“fencihou.txt”。
4)取出无用词:将fencihou.txt文件中的内容复制到Excel中,需要手动删去一些无意义和体现不出贴主发贴话题的词,例如“中”“提到”“大作”“水木”等。
5)计算百分比:运行cout_frequency&percent.py可以根据5)、6)中得到的结果得到每个词在每个时间段的词频百分比,生成文件“统计.xls”。词频百分比=该词的词频÷该时间段所有词的词频总数×100%。
关键代码:
1 # Excel文件读写操作 2 readbook = xlrd.open_workbook(r'统计_all.xlsx') 3 sheet = readbook.sheet_by_name('Sheet1') 4 nrows = sheet.nrows 5 f = xlwt.Workbook(encoding='utf-8') 6 table = f.add_sheet('data') 7 8 table.write(i, j, 0) 9 f.save("统计.xls")
View Code
部分截图如下:
6)生成.csv文件:在A1处填上“word”,将文件另存为“VChart时间词频百分比.csv”,即存为.csv格式的文件,注意编码方式要选择“UTF-8”。该文件可以被用于在weka软件中进行聚类。
7)聚类:打开weka->Explorer->Open file,选则打开6)中的csv文件。
选则Cluster,点击Choose选则SimpleKmeans算法进行聚类。
点击下图红框处可以设置KMeans相关参数。选则“Classes to clusters evaluation”并按“word”聚类,点击“Start”即可运行。
运行结束后,左下角会有运行记录,右键选则Save result buffer可以得到结果文件。
为了方便查看内容,推荐使用Notepad++打开文件。
8)获取聚类结果:weka的运行结果文件中有很多用不到的信息,运行clustering文件夹下的get_class_words.py文件可以得到每一类的词的信息,形式如下:
3.展示
对每一类词随时间变化的展示,主要参考了https://github.com/TangliziGit/ColumnsAnimation.git中的项目。
1)统计每一类词的词频百分比在各个时间段内的平均值,用于展示。
2)使用ColumnsAnimation->data中的getdata.py可以得到自己的展示数据的data.json文件。
3)在data.json文件开头添加“var TotalData=”并另存为“data.js”放在ColumnsAnimation目录下,打开animation.html即可看到展示效果。
例如,在2004年,各个话题的词频百分比如下:
在2005年,各个话题词频百分比变化为:
这两年里,贴主的最关注的话题由“军事科学”转向“模拟飞行”。对军事的爱好丝毫不减,只是转向了虚拟空间。同时,增加了对软件工程的关注度,与软件工程相关的电脑设备等话题关注度也有所提高,并且一如既地关注网络技术。
各话题词频变化统计展示至2018年,项目中的11-24.mp4为效果录屏文件,录屏效果如下:
由图可看出从2004-2018年,随时间变化,通过聚类得到的贴主关注的10个话题的变化。
本项目地址:https://git.coding.net/Ruidxr/ShuiMu.git
转载于:https://www.cnblogs.com/ruidxr/p/10023571.html
论如何知道一个人近年来关注了啥相关推荐
- 2018 中国AI人才大调查:14张图表解读他们来自何处,又将去往何方?
AI科技大本营按:本篇内容来自由 CSDN 出品的<2018 人工智能产业路线图>V2.0 版中 1.6 章人才分析篇,通过对相关 AI 人才各维度的数据分析,我们尽可能勾勒中国 AI 人 ...
- 重磅!「肠道菌群」项目征集,百万科研经费助力细分领域全新突破
▲ 点击关注 查看更多精彩内容 疫情之下,科研不停,肠道菌群的研究热度持续高涨.近期国内外肠道菌群研究成果多面开花,诸多重磅研究相继发表,令学界振奋.术业有专攻,领域有细分,阅微基因在此之际,投入百 ...
- 重磅!Nature子刊发布稳定学习观点论文:建立因果推理和机器学习的共识基础...
来源:AI科技评论 整理:AI科技评论 2月23日,清华大学计算机系崔鹏副教授与斯坦福大学Susan Athey(美国科学院院士,因果领域国际权威)合作,在全球顶级期刊Nature Machine I ...
- 期刊 | 人类遗传学领域期刊速览
Genetics Impact Factor 老牌遗传学杂志,自1916年以来发表过大量经典论文.由美国遗传学学会出版,旨在通过提高我们对遗传学的理解来加深我们对生活世界的理解.发表从微生物到人类的生 ...
- AJHG | 人类遗传学领域一流期刊推荐
美国人类遗传学杂志 American Journal of Human Genetics, AJHG AJHG创刊于1948年,由美国人类遗传学学会成立,是人类遗传学领域的同行评审月刊.涵盖人类遗传的 ...
- 中国 AI 开发者真实现状:人才依赖海外引进,本科 AI 教育盛行
近几年,人工智能之风吹遍全球,伴随着国内互联网的迅猛崛起,越来越多的开发者们,开始从事 AI 相关的工作和研究.但同时,由于这是一个从 0 到 1 的新领域,可参考的历史案例较少,也因此很多 AI 开 ...
- 数据猿·金猿榜丨2017工业大数据领域最具潜力创业公司
[数据猿导读] "2017工业大数据领域最具潜力创业公司"盘点源于数据猿推出的"金猿榜"系列内容,旨在通过媒体的方式与原则,发掘大数据领域最具潜力的创新型企业 ...
- 901虎年期待和变元的哥德尔数配置——哥德尔原著英译本拆解汉译之五
虎年期待和变元的哥德尔数配置--哥德尔原著英译本拆解汉译之五 丑牛之年走到了它的尽头,又一轮时序循环将要开始了.为这个尽头和起点,我做了一副对联,按华夏传统用浓墨书写,填在自家的门上.算是概略了这即将 ...
- 助力AR眼镜轻量化,国内攻破二维扩瞳几何光波导量产
光学作为AR智能眼镜最核心的技术之一,决定着产品体积重量.外观设计.佩戴体验.产品定位和应用场景等,重要性不言而喻.如今大家都在关注AR眼镜的轻量化,不难发现光波导是一个愈发关键的技术路径,其凭借&q ...
最新文章
- 青蛙跳台阶c语言递归函数,青蛙跳台阶问题的四种解法
- 8 - 9 template两大功能 : simple_tag、模板继承
- python3 处理 html转义字符
- mysql表一定要主键吗_最滋补五脏的食物表,一定要给家人存下
- 计算机网络-信道复用技术
- 训练时发生的错误:Couldn‘t open shared file mapping: <000001910A228862>, error code: <1455>
- plt导致的_tkinter.TclError: no display name and no $DISPLAY environment variable的问题
- 2021-02-22 【转载】什么是GCJ-02火星坐标系;为什么天地图没有偏移
- 怎么卸载mysql2008_SQL Server 2008怎么卸载?SQL Server 2008完全卸载教程
- 解决kindeditor上传图片时发生“服务器发生故障”的问题
- delphi xe 之路(14)使用FireMonkeyStyle
- UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler(边倒角)
- [Python]提取docx/网页超链接
- linux字体不识别不了怎么办,Docker容器不识别宋体等字体的解决方案
- nginx的反向代理和负载均衡
- 租用游艇问题 石子合并问题 动态规划实验
- 微服务(Microservice)那点事
- 2019年度工作回顾——管理方向转型
- redis php 书,predis VS phpRedis
- 计算机服务里打印设置在哪,电脑打印页面设置在哪