来,和人工智能对对联过大年!
歡迎關(guān)注天善智能,我們是專注于商業(yè)智能BI,人工智能AI,大數(shù)據(jù)分析與挖掘領(lǐng)域的垂直社區(qū),學(xué)習(xí),問答、求職一站式搞定!
對商業(yè)智能BI、大數(shù)據(jù)分析挖掘、機器學(xué)習(xí),python,R等數(shù)據(jù)領(lǐng)域感興趣的同學(xué)加微信:tstoutiao,邀請你進入數(shù)據(jù)愛好者交流群,數(shù)據(jù)愛好者們都在這兒。
作者:? veelion
公眾號:猿人學(xué)Python
春節(jié)貼春聯(lián)是中國人慶祝春節(jié)(過年)的特有習(xí)俗。但我真正對對聯(lián)有些認識和喜歡,不是從年年貼春聯(lián)開始的,而是從《唐伯虎點秋香》那段經(jīng)典的對對子開始的。那工整又有韻律和意境的對子,配上有節(jié)奏的配樂讀出來著實讓人熱血沸騰,大呼過癮。
本文末尾有對對聯(lián)的入口,可以與人工智能對(tiao)對(xi)聯(lián)(ta)哦~
先來回味一下這段臺詞吧,你的耳邊是否響起了對對子的節(jié)奏。。。
對穿腸:一鄉(xiāng)二里共三夫子,不識四書五經(jīng)六義,竟敢教七八九子,十分大膽!
寧王:對啊,怎麼不對呢?你不給我面子,我可真的要發(fā)飆了!
唐伯虎:讓我來試試! 十室九貧,湊得八兩七錢六分五毫四厘,尚且三心二意,一等下流!
對穿腸:好工整啊!
華太師:華安,你來的正是時候。
唐伯虎:沒事,沒事,沒事。
對穿腸:在下是七省文狀元兼參謀將軍,綽號對王之王的對穿腸。閣下是?
唐伯虎:小弟讀過兩年書,塵世中一個迷途小書僮,華安。
對穿腸:好!我就來會一會你!
(兩人互相凝視,蓄勢待發(fā),突然......親了一下......眾人跌倒在地!)
唐伯虎:對不起,我倆惺惺相惜,情不自禁。
對穿腸:言歸正傳,我們開始了。
圖書里,龍不吟虎不嘯,小小書僮可笑可笑。
唐伯虎:棋盤里,車無輪馬無韁,叫聲將軍提防提防。
眾 人:對得好!對得好!
對穿腸:鶯鶯燕燕翠翠紅紅處處融融洽洽。
唐伯虎:雨雨風(fēng)風(fēng)花花葉葉年年暮暮朝朝。
眾 人:華安真行啊!對得好!
寧 王:快出對子對死他,對死他!
對穿腸:十口心思,思君思國思社稷。
唐伯虎:八目共賞,賞花賞月賞秋香。
對穿腸:我上等威風(fēng),顯現(xiàn)一身虎膽。
唐伯虎:你下流賤格,露出半個龜頭。
對穿腸:我堂堂參謀將軍會輸給你個書僮? 你家墳頭來種樹。
唐伯虎:汝家澡盆雜配魚。
對穿腸:魚肥果熟入我肚。
唐伯虎:你老娘來親下廚!
(對穿腸倒地噴血)
唐伯虎:對對本為消遣作樂,今曰穿腸兄居然對到嘔出幾十兩血,可謂空前絕后,小弟佩服佩服!
十年前,微軟亞洲研究院推出了一個對聯(lián)生成引擎,可以根據(jù)用戶輸入的上聯(lián)自動生成下聯(lián),當(dāng)時火了一把。那時候我覺得這個好神奇啊。
十年后,人工智能的風(fēng)已經(jīng)熱吹了幾年。隨著硬件GPU計算能力的提升,和深度學(xué)習(xí)框架(TensorFlow,PyTorch,MxNet等等)的推出和發(fā)展,人工智能(其實就是更深層的機器學(xué)習(xí))首先在圖像處理領(lǐng)域大放異彩,人臉識別、物體檢測等技術(shù)應(yīng)用廣泛。然而,在自然語言處理處理方面,深度學(xué)習(xí)的應(yīng)用還沒有圖像處理那么成熟。不過,人工智能作古詩,對對子應(yīng)用的看起來還不錯。
今天,在春節(jié)到來之前,我就來用Python搭建一套人工智能對對聯(lián)的系統(tǒng),供朋友們在春節(jié)期間娛樂一下。
一、人工智能的實現(xiàn)
基于深度學(xué)習(xí)實現(xiàn)的對對聯(lián)已經(jīng)有好多種方法。這次我們主要參考這個實現(xiàn):
https://github.com/wb14123/seq2seq-couplet
并且,這個作者還提供了70萬條對聯(lián)的數(shù)據(jù),有了這個數(shù)據(jù)就可以訓(xùn)練我們自己的模型了。
做深度學(xué)習(xí)訓(xùn)練是最考驗硬件的,必須上GPU,不然訓(xùn)練可能要一兩個月才能完成。通常深度學(xué)習(xí)的系統(tǒng)環(huán)境是這樣的:
CPU:現(xiàn)在常規(guī)的已經(jīng)足夠,計算主要靠GPU;
內(nèi)存:至少16GB,越多越好;
GPU: NVIDIA,至少是gtx-1060吧。目前最具性價比的是gtx-1080 Ti
OS: Ubuntu 16.04 (普遍使用的版本)
Python: Python 3.6 版 (2.x的版本用的很少了)
深度學(xué)習(xí)框架: TensorFlow、PyTorch和MxNet最流行
我的機器已經(jīng)配置好了TensorFlow和GPU等環(huán)境,不過GPU只是1070,性能有點弱弱。按照說明可以比較容易的配置好訓(xùn)練環(huán)境。訓(xùn)練跑起來后,就聽到GPU風(fēng)扇轉(zhuǎn)起來了,發(fā)熱量有點大。好在是冬天,可以取取暖。要是夏天就只能流汗了~
訓(xùn)練的過程很漫長。。。最終訓(xùn)練了一周。搞人工智能的活兒沒點兒像樣的硬件,還真耗不起青春啊。訓(xùn)練期間,有足夠的時間去完成其它的功能。
二、Web API的建立
上面的github中有個Flask寫的Server。不過,我更喜歡Sanic,就用Sanic寫一個吧。服務(wù)器接收上聯(lián),生成下聯(lián)后返回json數(shù)據(jù),Sanic很容易搞定。如果你用過Sanic,就知道它有多么容易了。
這個Server程序一運行,就先加載訓(xùn)練好的模型。然后給Server寫一個路由響應(yīng)函數(shù)即可。
三、與公眾號對接
這個對接之前沒有做過。通過讀開發(fā)文檔,弄明白了流程:在公眾號后臺設(shè)置服務(wù)器地址用來接收騰訊服務(wù)器發(fā)送的消息,我的服務(wù)器處理后再返回給騰訊服務(wù)器。
舉個例子,關(guān)注公眾號的用戶給公眾號發(fā)送一條上聯(lián),騰訊服務(wù)器收到后轉(zhuǎn)發(fā)給我的服務(wù)器,我的服務(wù)器生成下聯(lián)返回給騰訊服務(wù)器,騰訊服務(wù)器再傳給用戶的微信客戶端。
弄清楚了數(shù)據(jù)傳輸路徑,再結(jié)合文檔中描述數(shù)據(jù)的格式,就可以實現(xiàn)跟微信對接的程序了。
(0)驗證微信消息來源
微信的API通過一個驗證機制來讓我們開發(fā)者服務(wù)器來確認消息是從微信服務(wù)器發(fā)來了,而不是其它人的消息。這個機制官方文檔中有描述,我把它實現(xiàn)為一個函數(shù),其中三個參數(shù)是微信服務(wù)器發(fā)過來的,而里面的token是我在公眾號后臺設(shè)置的,這個token很關(guān)鍵不能讓別人知道,不然他就可以拿它偽裝成微信服務(wù)器了。當(dāng)然,我的token你看到了也沒關(guān)系,我會改成別的哦。
(1)解析微信消息數(shù)據(jù)
微信服務(wù)器傳過來的消息是一個xml結(jié)構(gòu)的數(shù)據(jù),具體格式參見其官方開發(fā)文檔。我用lxml來解析這個xml結(jié)構(gòu):
(2)實現(xiàn)關(guān)注事件自動回復(fù)和關(guān)鍵字回復(fù)
之前已經(jīng)在公眾號后臺設(shè)置了用戶關(guān)注后自動打招呼,和基于關(guān)鍵詞的自動回復(fù)。啟用開發(fā)模式后,這個功能就要我自己實現(xiàn)了:
把設(shè)置的關(guān)鍵詞和回復(fù)內(nèi)容用dict保存,后面添加也很方便。用正則表達式匹配這些設(shè)置的關(guān)鍵詞和微信消息內(nèi)容,速度也夠快。
(3)生成回復(fù)消息
我的服務(wù)器處理完微信服務(wù)器發(fā)過來的消息后,就要生成一個xml格式的消息返回給微信服務(wù)器,它接收后再發(fā)給微信用戶,從而實現(xiàn)最終的自動回復(fù)微信用戶。這個xml格式也是正在開發(fā)文檔中描述。
這樣,與微信服務(wù)器對接的功能就實現(xiàn)了。接下來,把這些功能放到Sanic服務(wù)器程序里面就好了。
不過,我不是這樣做的。而是讓對聯(lián)功能的服務(wù)保持獨立,因為它啟動一次加載人工智能模型太費時間,調(diào)試不方便。把對外的web服務(wù)寫成另外的Sanic服務(wù)程序,兩者之間,通過requests訪問:
完成后測試成功。可惜,只留下下面一條測試的截圖(后面有解釋)
到此為止,一切正常!
。。。。。。
但是,原來公眾號設(shè)置的菜單不見了。后臺顯示開發(fā)模式下要自己開發(fā)這個菜單,沒問題,難不倒我。根據(jù)文檔試了試,竟然不成功?!
為什么呢?權(quán)限那里顯示,菜單開發(fā)的權(quán)限只有在公眾號認證后才能獲得。暈,還要去認證公眾號。好吧,公眾號你贏了。也就是說,前面廢了那么大勁兒從讀文檔到寫程序?qū)拥墓Ψ蛉踪M了,公眾號對接的代碼白寫了~~,有需要的拿走不謝哦。
四、獨立的網(wǎng)頁
我就是不認證,就是不認證!但我可以換個思路,停用開發(fā)模式。增加一個菜單,菜單鏈接對對聯(lián)的網(wǎng)頁就可以了。做這個網(wǎng)頁太簡單了,還是上Sanic。有心的同學(xué),可以在這個網(wǎng)頁上發(fā)現(xiàn)對對聯(lián)的API,你可以使用這個API開發(fā)自己的應(yīng)用哦。
這個網(wǎng)頁就是一個單頁面,布局用bootstrap,用jQuery和服務(wù)器交互。因為就一個簡單頁面,沒有用jinja模板,直接讀取html文件并用 response.html() 返回即可。壞處是每次調(diào)整網(wǎng)頁都有重啟一下服務(wù):
網(wǎng)頁有點簡陋,就是下面的樣子,類似對話流。有興趣的同學(xué)可以通過關(guān)注公眾號和它對對子。
這個系統(tǒng)的搭建,主要是使用Python完成,涉及一點網(wǎng)頁css和js的東西,也涉及系統(tǒng)和網(wǎng)絡(luò)服務(wù)的知識,可以算得上一個全棧開發(fā)的例子。當(dāng)然,主要的還是Python,不管是人工智能還是Web都有Python的用武之地。別想了,趕快學(xué)Python吧。
人工智能對對聯(lián)的入口:
https://www.yuanrenxue.com/couplet
Python的愛好者社區(qū)歷史文章大合集:
2018年P(guān)ython愛好者社區(qū)歷史文章合集(作者篇)
2018年P(guān)ython愛好者社區(qū)歷史文章合集(類型篇)
福利:文末掃碼立刻關(guān)注公眾號,“Python愛好者社區(qū)”,開始學(xué)習(xí)Python課程:
關(guān)注后在公眾號內(nèi)回復(fù)“課程”即可獲取:
小編的轉(zhuǎn)行入職數(shù)據(jù)科學(xué)(數(shù)據(jù)分析挖掘/機器學(xué)習(xí)方向)【最新免費】
小編的Python入門免費視頻課程!!!
小編的Python快速上手matplotlib可視化庫!!!
崔老師爬蟲實戰(zhàn)案例免費學(xué)習(xí)視頻。
陳老師數(shù)據(jù)分析報告制作免費學(xué)習(xí)視頻。
玩轉(zhuǎn)大數(shù)據(jù)分析!Spark2.X+Python 精華實戰(zhàn)課程免費學(xué)習(xí)視頻。
總結(jié)
以上是生活随笔為你收集整理的来,和人工智能对对联过大年!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 317纵联复习
- 下一篇: HTML文本格式化标签(用来调整文本的格