Py学习  »  Python

今年春节返乡还是一个人? | 教你如何用Python找到有趣的灵魂伴侣

Python网络爬虫与数据挖掘 • 4 年前 • 334 次点击  

最近很多关于晒择偶标准的帖子,活脱脱把知乎变成了另一个“世纪佳缘”,回答清一色的爆照和晒条件,这对于单身狗来说是妥妥的福利。


母胎SOLO的程序员小Q就沉迷其中不能自拔,这是他流着哈喇子发出的第100次感慨“你说说!这些小姐姐照片是真好看!但回答实在太太太多了,怎么才能在这些回答中找到合适的人选呢?Z哥,你能不能从数据分析角度给我点思路啊?”



小Z不胜其扰,被迫接受了这个艰难的任务——基于数据打造一份择偶指南



 数据获取


首先,我们要拿到这些小姐姐们的数据,小Z找到了择偶/相亲相关内容下最热门的一个问题——你的择偶标准是怎样的?


说是问择偶的标准,其实全是希望找到另一半的小哥哥、小姐姐们在答题。目前已经有27000+回答了:



回答爬取这一块,知乎还是比较友善的,只需要在XHR里面找到回答的动态网址,伪装headers的User-Agent就能够欢乐的批量爬取了。


小Z不费吹灰之力就爬到了问题下27664条回答,还包括每条回答的答主昵称、关注人数、点赞数、性别等一大票字段。




数据初窥


1、匿名情况和性别占比


截至日前,这个回答下有13527个用户是匿名的,占比(48.90%)接近半数。需要注意的是,所有匿名用户的性别默认都是男(知乎性别1表示男,0表示女,-1代表未知)。出于职业习惯,小Z以迅雷不及掩耳之势分析了男女占比(剔除了匿名用户的占比):



小Z发现,这个问题下,已经有大神基于内容进行了匹配,在未剔除匿名的情况下,发现男性占比较大。


而我们剔除掉匿名的用户,只基于爬取的性别源数据进行分析,发现男、女、未知三分天下,性别占比相对均衡,可以确定的是,目前回答下有4758个不匿名的小姐姐。(这两套逻辑下的统计结果并不冲突)


2、回答创建时间分布


在看回答创建时间分布前,需要先把知乎默认的时间戳格式转换成我们习惯的时间格式:



回答时间分布:


  • 2018年4月30号,随着问题的提出,第一个哥们开始答题,前期这个问题一直处于日回答数不过50的不温不火状态。时间来到了18年国庆节,可能是单身狗返乡受到亲友们的疯狂质询,导致回答数暴增,10月7日当天,日回答数突破300大关,随后回答数稳定在100左右。


  • 无从考证2018年12月13日发生了什么,那一天有506颗悸动的心将脱单的希望交给了知乎。


  • 19年春节前的返乡期,又是一次情感大拷问,也是回答数的第三个小高潮。及至今日,每天还有60+新增回答。



 缩小脱单范围


“哥们,你看看吧”一番标准汇报式的操作完成之后,小Z有些嘚瑟。


“Emmm,这都哪儿跟哪儿啊!你别给我看这些有的没的行吗!什么男女占比,什么发布时间分布,都关我屁事啊,我需要的是切实的!可以帮助我在上面找到女朋友的数据建议!”



纳尼?这跟我预想的他会猛夸我一顿的结果完全不一样啊!不过他说的确实在理。小Z顿时没了底气。“那行,数据都拿到了,你说说你找女朋友什么条件吧”


小Q45度角仰望天空,露出了少男怀春般的甜笑“什么条件不条件的,我只想找到一个我愿意为她放弃所有预设条件的灵魂伴侣~”


噗!“这才是他单身的根本原因啊!这个人可能被需求压成傻子了,要包容,要包容,要包容”小Z吐完一口老血后不断安慰自己。


小Q继续补充道:“这样吧,你能帮我列一个清单吗?我觉得可能还是要自己聊聊,看合不合拍。哦对了,匿名的就算了,我不喜欢太害羞的”。


得!匿名算了是吧,那我直接筛掉!灵魂伴侣是吧,那肯定接受异地,地区匹配先省略了!能放弃所有预设条件是吧,那学历年龄身高哥也不用给你去正文苦哈哈的匹配了!


问题的重点,就在于如何设计一套合适的逻辑来从数据中清洗和筛选出目标小姐姐们。


沉思片刻,小Z制定了一个四步脱单法来解决这个问题:


1、既然是灵魂伴侣,那如果回答连30字都没有超过,不是抖机灵就是敷衍,怎么能承担起“灵魂”二字呢!必须PASS掉!



搞定,这一步下来,目标群体还有4244个小姐姐



2、数据最重要的特性之一就是时效性,别看回答数量这么多,真正抓得住的幸福才是属于自己的幸福,如果一个答主最近一次更新答案的时间超过了一个月,那只有两种可能,要么是她已经找到了,要么她已经对这个方式失去了兴趣。所以,加上时间条件,筛选出最近30天还活跃的小姐姐们。



经过本轮筛选,小姐姐的数量直接从4244个缩小到598个。



3、小Z发现,有一些小姐姐在回答中强调照片OR内容已删,已经找到。这类回答当然要继续PASS。



还剩下562位~



4、对于相貌平平无奇,条件一般的小Q来说,去追已经被众星捧月的小姐姐们,难度实在是太大了。于是小Z根据经验暴力设置了两个阈值:


  • 知乎账号被关注人数超过1500以上的,对小Q来说算是大V了,PASS!

  • 回答点赞超过150或评论条数超过100的,说明已经有狼群盯上,激烈的竞争不适合与世无争的小Q。



四步走下来,名单已经成功锐减到480了,剩下的都是些走心的(回答字数多)、热乎的(最近更新)、正在择偶中且竞争还不算激烈的小姐姐们。小Z长舒一口气后,又有了新的困惑:“这样筛选得到的名单,虽然说范围精确多了,能不能再进一步,给他一个优先级排序呢?



 引入指数,暴力排序


问题的核心要给他找一份相对不错,又竞争尚小的名单。而相对不错,又竞争压力尚小,怎么量化呢?将发际线挠退了2厘米后,小Z有所顿悟。


在这个回答下,点赞越多说明答主在某个方面越受青睐,评论越多则表示主动出击的人越多,竞争可能更激烈。而前面已经对点赞和评论数进行了清洗,大热不在,如何在小热中进行排序呢?


这里,小Z用每个回答的点赞数除以评论数,得到一个赞评指数,用来衡量平均一个评论能够获得多少赞,数值是越高越好的。


举个栗子:

回答A有130个赞,30条评论,回答B有130个赞,60条评论,点赞数相同的情况下,B的评论更多,竞争更加激烈,从竞争的角度看,选择A更加明智;回答C和D分别有50条评论,而C的点赞数要高于D,在评论数相同的情况下(竞争激烈程度相近),我们应该选择更受青睐的C。


从赞评指数来看,A的4.33 > B的2.17;C的2.24 > D的1.70,看来,评赞指数能够为我们的选择提供优先级指导。


于是,小Z用暴力的赞评指数对剩下的小姐姐进行排序,并取TOP30,得到了最终的脱单大名单。



不错不错,有心了有心了。”小Q接过名单,忍俊不禁,乐呵呵的去按ID索伴,至于后续嘛,外号铁公鸡的小Q破天荒的请小Z吃了一顿丰盛的烧烤。



源码地址https://pan.baidu.com/s/1H9UQfKudfdfk-hXKzSW-Iw 提取码:7uwb,你可以自定义自己的筛选规则找到属于自己的灵魂伴侣。


有人问脱单最重要的是什么?当然是脸皮厚!!!


—    —

看完这里有收获?请转发分享给更多人
学习Python就关注:Datanami


近期文章:

文章长文带你在python里玩转Json数据

Python数据分析、挖掘常用工具

牛逼!50行代码,实现AI文章生成器!

14张思维导图,教你建立Python核心知识体系!

丰巢刷脸取件被小学生破解,号称3D,深度学习加持的人脸识别究竟靠谱吗?


点「在看」的人都变好看了哦!
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50039
 
334 次点击