不一样的七夕礼:最美情话+AI 作诗

640?wx_fmt=jpeg


作者 | 月小水长  来源 | 月小水长(ID:inspurer)


七夕到了,程序猿同志们都在想怎么送女朋友礼物,送包包?太俗气!送口红?没有新意!


没有点子的同志们不妨看看这篇,满满的干货:LDA 主题模型提取知乎情话中最美的意象 + AI 根据提取出的意象自动写情诗!送给女朋友一首这样的情诗,比口红包包什么的的有格调!


640?wx_fmt=jpeg


动手实现

不想看代码的同志可以跳过这部分去文末看实现效果和代码下载链接。


爬取知乎高赞回答


以话题【你听过哪些让人怦然心动的情话或者诗句?】为例,爬取该话题下质量最高的前 100 个回答。


640?wx_fmt=png


首先分析接口,不难定位到回答在图示所在的接口返回的内容中。


640?wx_fmt=png


切换到 headers 栏可查看该请求的 URL 地址为

https://www.zhihu.com/api/v4/questions/285989317/answers?include=data%5B%2A%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_labeled%2Cis_recognized%2Cpaid_info%2Cpaid_info_content%3Bdata%5B%2A%5D.mark_infos%5B%2A%5D.url%3Bdata%5B%2A%5D.author.follower_count%2Cbadge%5B%2A%5D.topics&limit=5&offset=10&platform=desktop&sort_by=default


需要注意 offset 这个参数即可,用于请求翻页,一页答案的个数由参数 limit 决定。


编码发现,对于请求头信息,需要在代码中给出 user-agent 和 cookies,cookies 需要自己手动去知乎登录后获取。这部分代码如下:


 
 

在返回的 json 内容里答案分布在字段 content 和 excerpt 中,需要拼接,又由于内容里有许多富文本标签,不利于后续处理,在此利用正则表达式作了富文本过滤。


为了加速爬虫,使用了 concurrent.futures 中的 ThreadPoolExecutor,即线程池对象。


 
 

同时需要获取线程执行结束后的结果,引入 concurrent.futures 中的 as_completed 方法,其用法如下:


 
 

as_completed()方法是一个生成器,在没有任务完成的时候会阻塞,一旦有某个任务完成,会 yield 这个任务,从而执行 for 循环下面的语句,然后继续阻塞住,循环到所有的任务结束。


最后使用 pandas 模块把答案保存到 csv 文件中。


 
 

这样就完成了三步走中的第一步!


LDA 模型抽取回答主题得到常见意象


当今社会是一个高度信息化的社会,如何从浩如烟海的文本中提取出主题,是一个具有挑战性的话题。主题提取有很多方法,其中最常见的就是隐含狄利克雷分布(Latent Dirichlet allocation),简称LDA。


LDA 是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。


关于 LDA 的原理,我这里简单阐释下,有两个概率分布模型,一个是文档关于主题的,另一个是主题关于单词的,在初始条件下,这两个概率分布模型都不是准确的,甚至是随机给出的,根据贝叶斯公式,由这两个概率分布可以计算出文档关于单词的概率分布,而这个概率分布,也可以直接根据文档统计得出,如果不相符,则调整初始的两个概率分布,直至根据贝叶斯公式间接计算出的文档-单词概率分布模型同基于文档统计直接计算出来的概率分布模型相吻合。至于具体怎么调整概率分布,有兴趣的同学可以查阅相关资料。


在 Python 中,有直接实现了 LDA 的库 pyLDAvis,我们只需要指定单词个数上限和主题个数等参数即可,同时 pyLDAvis 也提供了非常好的动态交互可视化界面的 API。


上一步我们将高赞回答保存到了 csv,这一步首先加载这个文件,然后进行分词处理(也可自行设置停用词),分词向量化、调整 LDA 模型的参数,最后将数据填进模型,抽取出主题,并可视化出来。

这部分代码如下:


 
 

抽取出的 5 个主题中的前 20 高频词汇如下:


 
 

最后可视化:


 
 

640?wx_fmt=png


可交互的动态图表还是非常具有视觉冲击力的:


640?wx_fmt=gif


根据抽取出的主题 AI 作诗


AI 作诗是一门非常具有挑战性的自然语言处理课题,在尝试了很多模型未果后,我发现了九歌——人工智能诗歌写作系统,来自清华大学自然语言处理与社会人文计算实验室的研究成果,于是就索性采用九歌的接口,这个接口没有高级的反爬措施,但是请求结果却很奇怪,需要多次请求才能返回正确结果;根据上一步的提取出来的主题作诗,同时做了个简单的封装,其效果如下:


比如输入【情话】【大海】,会生成如下的诗歌:


 
 

输入【爱】 【月亮】,生成诗歌:

 
 

非常含蓄的诗词,深究发现采用了多种修辞和艺术手法,读起来也别有一番韵味。


640?wx_fmt=gif


相信这样的七夕礼物,一定别有一番情趣。


相关代码:

https://github.com/Python3Spiders/ValentineDay.git



(*本文为 Python大本营转载文章,转载请联系原作者


社群福利

扫码添加小助手,回复:大会,加入2019 AI开发者大会福利群,每周 一、三、五更新技术福利,还有不定期的抽奖活动~ 640?wx_fmt=jpeg



AI 开发者大会「七夕」特价


2019 AI开发者大会重磅嘉宾更新: 阿里、华为、Google Brain、Amazon、微软中国、百度、京东、小米、快手、科大讯飞、商汤、旷视、图森、云知声、思必驰... “硬核AI技术大会,一年参加一次就够了”。 虽然是「七夕」 活动,没有男(女)朋友可以参加吗? 当然可以啦,性别不限,两人组队购票,即享优惠~
640?wx_fmt=png 推荐阅读:


640?wx_fmt=png 你点的每个“在看”,我都认真当成了喜欢

                                                                                                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值