今年春節,推薦三個 AI 工具為你寫春聯
- 2019 年 11 月 30 日
- 筆記
by 超神經
盼望著,盼望著,春節就要來了,今年春節有什麼值得期待的事情么?不如趁著爸媽還沒來得及催婚催生之前,先好好在家裡表現一番。
比如給家裡寫寫春聯,或者再原創訂製幾個送給親友,那我這裡有三個機器人,能夠幫你對對聯,了解一下。
會對對聯的 AI
這都 9012 年了,突然腦子一熱打算找個 AI 來寫個對聯,藉助萬能的互聯網,還真找到了三個 AI 工具。
微軟對聯
上線時間:2015 年
https://duilian.msra.cn/app/couplet.aspx
微軟的對聯 AI ,是微軟亞洲研究院的一個網頁產品。 它最早要追溯到 2004 年關於自動對聯的設想。
經過了這些年的變更,最新的版本由 15 年推出,它能快速的完成對對聯的任務。

而且會提供多個選項,如果還不滿意,會在每個對應的字上給你幾種選擇 。最人性化的在於可以按需要嵌入你喜歡的字。
王斌給您對對聯
上線時間:2017 年 10 月
https://ai.binwang.me/couplet/
這是一個簡潔的網頁對聯繫統,據說這是一位深藏不露的工程師的「練手項目」。

它於 2017 年 10 月發布,面世後意外的受到了廣大吃瓜群眾的喜愛,因為據說可以是一天的快樂源泉,還有網友專門錄製了測試影片,上傳到 bilibili 上。
而它使用的方式也很簡單,給上聯,立馬回復你下聯,毫無商量的餘地,乾淨利落。
作者在網上抓取了幾百萬組對聯數據,用 seq2seq 模型懸鏈除了現在的工具,完成後也將自己的數據集和模型都開源在了 Github 上。
AINLP 的對聯機器人
上線時間:2019 年 1 月
它算是 AI 對聯界的一位萌新,於一周前誕生,是一個接入公眾號的 AI 模型。作者是在看到了一份對聯的語料庫之後,技癢難耐創作出來的。
使用的方法是在公眾號的後台回復「上聯 輸入上聯內容」,會得到下聯,當然也有它對不出來的時候。
如果你忘記了輸入上聯,那後台就是一個聊天機器人。
是騾子是馬,拉出來對對聯
為了比較一下這三個 AI 工具的效果,我們進行了幾輪測試,輸出的順序依次是微軟對聯、王斌對對聯、AINLP 對聯的結果。
Round 1 :上聯 誰是李飛飛



這一輪,除了微信機器人有些讀不懂之外,另外兩位選手都還算正常
Round 2 :上聯 王思聰吃熱狗



對於校長這個行為, AINIP 的機器人無法給出結果,直接開始賣萌了,哈哈哈哈,看來果然 AI 不知思聰富。
Round 3 :上聯 人工智慧寫春聯



這一輪三者各有特色,微軟給出的「三叉神經」是要笑死我么,AINLP 的「鬼斧神工」也是有些莫名,第二位「自由自在」顯得平淡了幾分。
Round 4 :上聯 落霞與孤鶩齊飛



對於這個經典的句子,王斌對對聯給的結果也太調皮了吧。(事實上微軟在選項里也提供了標準答案)
Round 5 :上聯 爆竹聲聲辭舊歲



言歸正傳,還是要寫春聯。
可最後這一輪,結果上來看,都可以拿來掛門前了哇。
如何訓練 AI 寫春聯?
看完了這些小工具,基本上能看出中國傳統文化里,不僅古詩詞、對子、對聯,這些語言單元之間有著極強的規律性,非常適合通過機器來學習並容易自動化完成的事情。
1. 使用 Encoder-Decoder 模型
Encoder-Decoder 框架可以看作是一種文本處理領域的研究模式,應用場景異常廣泛。

抽象的 Encoder-Decoder 框架
Encoder-Decoder 框架可以這麼直觀地去理解:可以把它看作適合處理由一個句子(或篇章)生成另外一個句子(或篇章)的通用處理模型。對於句子對<X,Y>,目標是給定輸入句子 X,期待通過 Encoder-Decoder 框架來生成目標句子 Y。X 和 Y 可以是同一種語言,也可以是兩種不同的語言。而 X 和 Y 分別由各自的單詞序列構成:

Encoder 顧名思義就是對輸入句子 X 進行編碼,將輸入句子通過非線性變換轉化為中間語義表示 C:

對於解碼器 Decoder 來說,其任務是根據句子 X 的中間語義表示 C 和之前已經生成的歷史資訊 y1,y2….yi-1 來生成i時刻要生成的單詞 yi

每個 yi 都依次這麼產生,那麼看起來就是整個系統根據輸入句子 X 生成了目標句子 Y。
這種場景是典型的 Encoder-Decoder 框架應用問題。所需要做的就是配置好 Encoder-Decoder 框架的具體模型,比如 Encoder 和 Decoder 都採用RNN模型來做。

Encoder-Decoder生成下聯
只需要找到大量的對聯數據對這個模型進行訓練,那麼即可利用這個模型,輸入上聯,機器就可以自動產生下聯了。
Encoder-Decoder 框架加上 Attention 應該會顯著提升產生下聯的品質,原因還是因為它是要求嚴格對仗的,所以在生成下聯某個字的時候,找到對應上聯相應字作為生成的重點參考資訊無疑是非常重要的。
比如看到上聯的「三」字,Attention 模型使得下聯產生對應字「一」的時候重點參考上聯的「三」這個字,應該知道對應的應該是一個數字型漢字。

Attention模型
使用 Encoder-Decoder 來做這個事情,漢字之間的對仗關係應該能夠很好地被學會,但是如何保證生成下聯語義能夠一致其實並不一定能夠很好地解決。這是什麼意思呢?意思是可能機器看到上聯「風雲三尺劍」,極有可能對出下面的內容:「雨風萬丈刀」,單看每個字對仗的都很工整,但是作為一個整體,語義看上去不那麼協調。(註:其實如果真對出這個下聯,想想其實還是挺豪情萬丈的,是吧?這其實跟人在意識上會把連續出現的字通過想像組合出一種合理語境有關。)
本質上 Encoder-Decoder 在解碼階段是能夠學會語言模型的,而很明顯語言模型的引入對於生成下聯的可讀性和語言一致性是很有幫助的。
但是如果訓練數據不是那麼大,相信通過使用大量古詩來訓練一個詩詞語言模型,在 Decoder 生成階段,每個時間節點 t 生成很多可能的候選漢字,然後利用這個語言模型+Beam Search 應該能夠使得生成的對聯保證一定的語義一致性。
作為對聯生成其實還有上下聯對應漢字的平仄問題,也可以類似語言模型一樣作為後處理的步驟進行篩選過濾。
2.使用 RNN 完成
使用 RNN 構建一個古詩詞的語言模型,然後上聯通過這個 RNN 語言模型自動生成。

圖完全自動生成對聯
此外,對於對聯來說,還遺留一個小問題,就是對聯的橫批如何生成的問題。因為一般對聯還需要配上一個橫批來歸納上下聯的主旨。
這個其實思路也是類似的,可以把上下聯看做一個整體作為 Encoder 的輸入,Decoder 用來生成橫批即可,這個類似於用 Encoder-Decoder+Attention 做摘要的思路。
參考文獻:
1. https://blog.csdn.net/malefactor/article/details/51124732
《使用Encoder-Decoder模型自動生成對聯的思路》by 張俊林
2.https://mp.weixin.qq.com/s/ettmrvz0SMpdBd5HU1xhnw
《第一屆人工智慧對對聯大賽》by 公眾號:想當然
3.https://duilian.msra.cn/app/couplet.aspx
微軟對聯工具
4.https://ai.binwang.me/couplet/
王斌自動對對聯繫統
5.微信公眾號對聯工具:AINLP
超神經百科
單詞
decoder
[ˌdi:ˈkoʊdə(r)] n.解碼器
multivariate
[mʌltɪ'veərɪɪt] adj. 多變數的
片語
Beam search 定向搜索

