过大年,和人工智能一起对对联!
王平,一個IT老碼農,寫Python十年有余,喜歡專研通過爬蟲技術來掙錢。
春節貼春聯是中國人慶祝春節(過年)的特有習俗。但我真正對對聯有些認識和喜歡,不是從年年貼春聯開始的,而是從《唐伯虎點秋香》那段經典的對對子開始的。那工整又有韻律和意境的對子,配上有節奏的配樂讀出來著實讓人熱血沸騰,大呼過癮。
本文末尾有對對聯的入口,可以與人工智能對(tiao)對(xi)聯(ta)哦~
先來回味一下這段臺詞吧,你的耳邊是否響起了對對子的節奏。。。
對穿腸:一鄉二里共三夫子,不識四書五經六義,竟敢教七八九子,十分大膽!
寧王:對啊,怎麼不對呢?你不給我面子,我可真的要發飆了!
唐伯虎:讓我來試試! 十室九貧,湊得八兩七錢六分五毫四厘,尚且三心二意,一等下流!
對穿腸:好工整啊!
華太師:華安,你來的正是時候。
唐伯虎:沒事,沒事,沒事。
對穿腸:在下是七省文狀元兼參謀將軍,綽號對王之王的對穿腸。閣下是?
唐伯虎:小弟讀過兩年書,塵世中一個迷途小書僮,華安。
對穿腸:好!我就來會一會你!
(兩人互相凝視,蓄勢待發,突然......親了一下......眾人跌倒在地!)
唐伯虎:對不起,我倆惺惺相惜,情不自禁。
對穿腸:言歸正傳,我們開始了。
圖書里,龍不吟虎不嘯,小小書僮可笑可笑。
唐伯虎:棋盤里,車無輪馬無韁,叫聲將軍提防提防。
眾 人:對得好!對得好!
對穿腸:鶯鶯燕燕翠翠紅紅處處融融洽洽。
唐伯虎:雨雨風風花花葉葉年年暮暮朝朝。
眾 人:華安真行啊!對得好!
寧 王:快出對子對死他,對死他!
對穿腸:十口心思,思君思國思社稷。
唐伯虎:八目共賞,賞花賞月賞秋香。
對穿腸:我上等威風,顯現一身虎膽。
唐伯虎:你下流賤格,露出半個龜頭。
對穿腸:我堂堂參謀將軍會輸給你個書僮? 你家墳頭來種樹。
唐伯虎:汝家澡盆雜配魚。
對穿腸:魚肥果熟入我肚。
唐伯虎:你老娘來親下廚!
(對穿腸倒地噴血)
唐伯虎:對對本為消遣作樂,今曰穿腸兄居然對到嘔出幾十兩血,可謂空前絕后,小弟佩服佩服!
十年前,微軟亞洲研究院推出了一個對聯生成引擎,可以根據用戶輸入的上聯自動生成下聯,當時火了一把。那時候我覺得這個好神奇啊。
十年后,人工智能的風已經熱吹了幾年。隨著硬件GPU計算能力的提升,和深度學習框架(TensorFlow,PyTorch,MxNet等等)的推出和發展,人工智能(其實就是更深層的機器學習)首先在圖像處理領域大放異彩,人臉識別、物體檢測等技術應用廣泛。然而,在自然語言處理處理方面,深度學習的應用還沒有圖像處理那么成熟。不過,人工智能作古詩,對對子應用的看起來還不錯。
今天,在春節到來之前,我就來用Python搭建一套人工智能對對聯的系統,供朋友們在春節期間娛樂一下。
一、人工智能的實現
基于深度學習實現的對對聯已經有好多種方法。這次我們主要參考這個實現:
https://github.com/wb14123/seq2seq-couplet
并且,這個作者還提供了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吧。
掃碼關注下方公眾號后,底部回復?對聯?即可和人工智能一起對對聯
Python中文社區作為一個去中心化的全球技術社區,以成為全球20萬Python中文開發者的精神部落為愿景,目前覆蓋各大主流媒體和協作平臺,與阿里、騰訊、百度、微軟、亞馬遜、開源中國、CSDN等業界知名公司和技術社區建立了廣泛的聯系,擁有來自十多個國家和地區數萬名登記會員,會員來自以公安部、工信部、清華大學、北京大學、北京郵電大學、中國人民銀行、中科院、中金、華為、BAT、谷歌、微軟等為代表的政府機關、科研單位、金融機構以及海內外知名公司,全平臺近20萬開發者關注。
▼?點擊下方閱讀原文,免費成為社區注冊會員?
總結
以上是生活随笔為你收集整理的过大年,和人工智能一起对对联!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公共关系礼仪实务章节测试题——公共关系的
- 下一篇: 阿里云网站备案时变更备案的问题解决总结