十年前,微软亚洲研究院推出了一个对联生成引擎,可以根据用户输入的上联自动生成下联,当时火了一把。那时候我觉得这个好神奇啊。
十年后,人工智能的风已经热吹了几年。随着硬件GPU计算能力的提升,和深度学习框架(TensorFlow,PyTorch,MxNet等等)的推出和发展,人工智能(其实就是更深层的机器学习)首先在图像处理领域大放异彩,人脸识别、物体检测等技术应用广泛。然而,在自然语言处理处理方面,深度学习的应用还没有图像处理那么成熟。不过,人工智能作古诗,对对子应用的看起来还不错。
今天,在春节到来之前,我就来用Python搭建一套人工智能对对联的系统,供朋友们在春节期间娱乐一下。
一、人工智能对联模型训练
基于深度学习实现的对对联已经有好多种方法。这次我们主要参考这个实现。
并且,这个作者还提供了70万条对联的数据,有了这个数据就可以训练我们自己的模型了。
做深度学习训练是最考验硬件的,必须上GPU,不然训练可能要一两个月才能完成。通常深度学习的系统环境是这样的:
CPU:现在常规的已经足够,计算主要靠GPU;
内存:至少16GB,越多越好;
GPU: NVIDIA,至少是gtx-1060吧。目前最具性价比的是gtx-1080 Ti
OS: Ubuntu 16.04 (普遍使用的版本)
Python: Python 3.6 版 (2.x的版本用的很少了)
深度学习框架: TensorFlow、PyTorch和MxNet最流行
我的机器已经配置好了TensorFlow和GPU等环境,不过GPU只是1070,性能有点弱弱。按照说明可以比较容易的配置好训练环境。训练跑起来后,就听到GPU风扇转起来了,发热量有点大。好在是冬天,可以取取暖。要是夏天就只能流汗了~
训练的过程很漫长。。。最终训练了一周。搞人工智能的活儿没点儿像样的硬件,还真耗不起青春啊。训练期间,有足够的时间去完成其它的功能。
二、给对联建立一个Web API
上面的github中有个Flask写的Server。不过,我更喜欢Sanic,就用Sanic写一个吧。服务器接收上联,生成下联后返回json数据,Sanic很容易搞定。如果你用过Sanic,就知道它有多么容易了。
这个Server程序一运行,就先加载训练好的模型。然后给Server写一个路由响应函数即可。
三、把对联与微信公众号对接
这个对接之前没有做过。通过读开发文档,弄明白了流程:在公众号后台设置服务器地址用来接收腾讯服务器发送的消息,我的服务器处理后再返回给腾讯服务器。
举个例子,关注公众号的用户给公众号发送一条上联,腾讯服务器收到后转发给我的服务器,我的服务器生成下联返回给腾讯服务器,腾讯服务器再传给用户的微信客户端。
弄清楚了数据传输路径,再结合文档中描述数据的格式,就可以实现跟微信对接的程序了。
(0)验证微信消息来源
微信的API通过一个验证机制来让我们开发者服务器来确认消息是从微信服务器发来了,而不是其它人的消息。这个机制官方文档中有描述,我把它实现为一个函数,其中三个参数是微信服务器发过来的,而里面的token是我在公众号后台设置的,这个token很关键不能让别人知道,不然他就可以拿它伪装成微信服务器了。当然,我的token你看到了也没关系,我会改成别的哦。
(1)解析微信消息数据
微信服务器传过来的消息是一个xml结构的数据,具体格式参见其官方开发文档。我用lxml来解析这个xml结构:
(2)实现关注事件自动回复和关键字回复
之前已经在公众号后台设置了用户关注后自动打招呼,和基于关键词的自动回复。启用开发模式后,这个功能就要我自己实现了:
把设置的关键词和回复内容用dict保存,后面添加也很方便。用正则表达式匹配这些设置的关键词和微信消息内容,速度也够快。
(3)生成回复消息
我的服务器处理完微信服务器发过来的消息后,就要生成一个xml格式的消息返回给微信服务器,它接收后再发给微信用户,从而实现最终的自动回复微信用户。这个xml格式也是正在开发文档中描述。
这样,与微信服务器对接的功能就实现了。接下来,把这些功能放到Sanic服务器程序里面就好了。
不过,我不是这样做的。而是让对联功能的服务保持独立,因为它启动一次加载人工智能模型太费时间,调试不方便。把对外的web服务写成另外的Sanic服务程序,两者之间,通过requests访问:
完成后测试成功。可惜,只留下下面一条测试的截图(后面有解释)
到此为止,一切正常!
但是,原来公众号设置的菜单不见了。后台显示开发模式下要自己开发这个菜单,没问题,难不倒我。根据文档试了试,竟然不成功?!
为什么呢?权限那里显示,菜单开发的权限只有在公众号认证后才能获得。晕,还要去认证公众号。好吧,公众号你赢了。也就是说,前面废了那么大劲儿从读文档到写程序对接的功夫全白费了,公众号对接的代码白写了~~,有需要的拿走不谢哦。
四、给对联做一个独立的网页
我就是不认证,就是不认证!但我可以换个思路,停用开发模式。增加一个菜单,菜单链接对对联的网页就可以了。做这个网页太简单了,还是上Sanic。有心的同学,可以在这个网页上发现对对联的API,你可以使用这个API开发自己的应用哦。
这个网页就是一个单页面,布局用bootstrap,用jQuery和服务器交互。因为就一个简单页面,没有用jinja模板,直接读取html文件并用 response.html() 返回即可。坏处是每次调整网页都有重启一下服务:
网页有点简陋,就是下面的样子,类似对话流。有兴趣的同学可以通过关注公众号和它对对子。
这个系统的搭建,主要是使用Python完成,涉及一点网页css和js的东西,也涉及系统和网络服务的知识,可以算得上一个全栈开发的例子。当然,主要的还是Python,不管是人工智能还是Web都有Python的用武之地。别想了,赶快学Python吧。
人工智能对对联的入口:
https://www.yuanrenxue.cn/couplet

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。
***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.con 原创,没有猿人学授权,请勿以任何形式转载。***
对的有问题吧
上联:冷眼看穿
下联:热心对联
冷眼看穿
上联:热肠可除
下联:冷眼看穿
热肠可除
上联:大肚无能
下联:热肠可除
大肚无能
上联:匹夫有责
下联:大肚无能
匹夫有责
上联:天下无敌
下联:匹夫有责
天下无敌
上联:上海自来水来自上海
下联:山西飞机场机西飞山
顺序乱了