用Python實現一個人工智慧對對聯

王平發表於2019-01-31

十年前,微軟亞洲研究院推出了一個對聯生成引擎,可以根據使用者輸入的上聯自動生成下聯,當時火了一把。那時候我覺得這個好神奇啊。

機器人對對聯

十年後,人工智慧的風已經熱吹了幾年。隨著硬體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,就知道它有多麼容易了。

對聯 Web api

這個Server程式一執行,就先載入訓練好的模型。然後給Server寫一個路由響應函式即可。

三、把對聯與微信公眾號對接

這個對接之前沒有做過。通過讀開發文件,弄明白了流程:在公眾號後臺設定伺服器地址用來接收騰訊伺服器傳送的訊息,我的伺服器處理後再返回給騰訊伺服器。

舉個例子,關注公眾號的使用者給公眾號傳送一條上聯,騰訊伺服器收到後轉發給我的伺服器,我的伺服器生成下聯返回給騰訊伺服器,騰訊伺服器再傳給使用者的微信客戶端。

對聯與微信公眾號對接

弄清楚了資料傳輸路徑,再結合文件中描述資料的格式,就可以實現跟微信對接的程式了。

(0)驗證微信訊息來源

微信的API通過一個驗證機制來讓我們開發者伺服器來確認訊息是從微信伺服器發來了,而不是其它人的訊息。這個機制官方文件中有描述,我把它實現為一個函式,其中三個引數是微信伺服器發過來的,而裡面的token是我在公眾號後臺設定的,這個token很關鍵不能讓別人知道,不然他就可以拿它偽裝成微信伺服器了。當然,我的token你看到了也沒關係,我會改成別的哦。

驗證token

(1)解析微信訊息資料

微信伺服器傳過來的訊息是一個xml結構的資料,具體格式參見其官方開發文件。我用lxml來解析這個xml結構:

解析xml程式碼例項

(2)實現關注事件自動回覆和關鍵字回覆

之前已經在公眾號後臺設定了使用者關注後自動打招呼,和基於關鍵詞的自動回覆。啟用開發模式後,這個功能就要我自己實現了:

實現關鍵字自動回覆程式碼例子

把設定的關鍵詞和回覆內容用dict儲存,後面新增也很方便。用正規表示式匹配這些設定的關鍵詞和微信訊息內容,速度也夠快。

(3)生成回覆訊息

我的伺服器處理完微信伺服器發過來的訊息後,就要生成一個xml格式的訊息返回給微信伺服器,它接收後再發給微信使用者,從而實現最終的自動回覆微信使用者。這個xml格式也是正在開發文件中描述。

生成回覆訊息程式碼

這樣,與微信伺服器對接的功能就實現了。接下來,把這些功能放到Sanic伺服器程式裡面就好了。

不過,我不是這樣做的。而是讓對聯功能的服務保持獨立,因為它啟動一次載入人工智慧模型太費時間,除錯不方便。把對外的web服務寫成另外的Sanic服務程式,兩者之間,通過requests訪問:

給對聯起一個web服務程式碼

完成後測試成功。可惜,只留下下面一條測試的截圖(後面有解釋)

微信公眾號與對聯對接成功

到此為止,一切正常!

但是,原來公眾號設定的選單不見了。後臺顯示開發模式下要自己開發這個選單,沒問題,難不倒我。根據文件試了試,竟然不成功?!

為什麼呢?許可權那裡顯示,選單開發的許可權只有在公眾號認證後才能獲得。暈,還要去認證公眾號。好吧,公眾號你贏了。也就是說,前面廢了那麼大勁兒從讀文件到寫程式對接的功夫全白費了,公眾號對接的程式碼白寫了~~,有需要的拿走不謝哦。

四、給對聯做一個獨立的網頁

我就是不認證,就是不認證!但我可以換個思路,停用開發模式。增加一個選單,選單連結對對聯的網頁就可以了。做這個網頁太簡單了,還是上Sanic。有心的同學,可以在這個網頁上發現對對聯的API,你可以使用這個API開發自己的應用哦。

這個網頁就是一個單頁面,佈局用bootstrap,用jQuery和伺服器互動。因為就一個簡單頁面,沒有用jinja模板,直接讀取html檔案並用 response.html() 返回即可。壞處是每次調整網頁都有重啟一下服務:

給對聯實現一個web api程式碼

網頁有點簡陋,就是下面的樣子,類似對話流。有興趣的同學可以通過關注公眾號和它對對子。

網頁版人工智慧對對聯樣子

這個系統的搭建,主要是使用Python完成,涉及一點網頁css和js的東西,也涉及系統和網路服務的知識,可以算得上一個全棧開發的例子。當然,主要的還是Python,不管是人工智慧還是Web都有Python的用武之地。別想了,趕快學Python吧。

人工智慧對對聯的入口:
https://www.yuanrenxue.com/couplet

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章