1. 程式人生 > >撩一撩作詩機器人

撩一撩作詩機器人

作詩姬——這個“姬”的叫法應該是從那部著名的燒腦電影《機械姬》中延伸過來的。下圖是《機械姬》這部電影的海報,雖然當時有不少看過這部劇的朋友跟我說看完後整個人都不好了,感覺世界有一天會被機器人玩壞,但我一直很樂觀,我覺得這一天……估計我的有生之年看不到。好了,開個小玩笑我們來看作詩姬究竟是個什麼玩意兒。

圖片描述

作詩機器人作為一個玩具也好一個科學研究的領域課題也罷,很早就有人開始研究了。就但從數學模型角度來說,作詩姬應該屬於隱馬爾可夫模型的變種。

所謂隱馬爾可夫模型HMM就是從時間序列的隨機事件中去統計前後狀態的轉化概率。這種模型在NLP領域應用是非常廣泛的,在作詩姬這種玩具中也少不了它拋頭露面。
遇到這種命題,首先應該想到的是使用RNN模型(LSTM)來進行訓練。因為RNN具有一種天生就最適合擬合隱馬爾可夫模型的構造,所以這個大的思路應該是沒有什麼問題的。可是,中文有中文的特點,而且中文當中有一些令我們中國人最自豪的,最優美的韻律感,同時也是我們自己在嘗試寫詩的過程中最不好把握的東西——平仄和韻腳。隱馬爾可夫模型可以統計出來在一個字後面出現另一個字是多大概率,而且可以有一定自由度地選擇其中的一個字作為下一個接續字——可以選擇概率最大的那個字,這種情況下一旦第一個字確定後,後面整個詩文理論上就是全部確定的;也可以按照概率從大到小排列,用概率的比例去生成一個 “不均勻的骰子”,使得下一個字的產生有一定變化。

圖片描述

用隱馬爾可夫模型生成字的時候,選擇概率較大的字出現的目的是為了讓語句更為通暢,因為兩個字有較大概率緊鄰出現的話大多是因為它們是一個詞,或者在單字詞盛行的古詩文中至少是片語或者常用短語。例如“紅顏”、“春光”、“山河”、“相送”等。而概率小的鄰接字含義很可能表示的是這兩個字從來沒有前後腳出現過,或者偶爾出現過那麼一兩次還是一個屬於前面的詞尾一個屬於後面的詞頭的情況,那如果採用的話自然是狗屁不通。

圖片描述

光是用隱馬爾可夫模型去統計還是不夠的,要生成一個有一定“含義”的詩文是需要有一定的意境和慣用詞彙的。為此,有這樣一本書作為辭典備用,叫做《詩學含英》,不過別找了京東上沒有,這麼偏門小眾的書求助萬能的淘寶吧。由於在五絕和七絕這樣的詩律中是講究押韻和平仄工整的,所以第二三四句實際上是根據第一句來生成的,它們的生成要在規則上與第一句呼應。那麼就要先重點生成第一句,再一句一句按照規則去生成其餘的句子。

圖片描述

先給定一些Keywords,也就是關鍵詞,作為這首詩的梗概、要義、主題,再到《詩學含英》中去尋找相關語彙。這樣會找到一些備選詞(Candidate lines),根據這些詞彙生成所有可能的排列,並且挑選一個最為合適的充當第一句。就是滿足下面的這個等式最大化。

圖片描述

看上去又挺嚇人,其實又是那個的連乘形式,是一系列概率的連乘形式,最大化的意思就是這些挑出來的備選詞在我們統計的隱馬爾可夫模型裡究竟是怎麼排列最順溜,也就是一句話組成的最大似然度的白話解釋。

圖片描述

下面要出場的是這麼個聽著很高科技其實內容很普通的東西,一個叫CSM(Convolutional Sentence Model,卷積句子模型),一個叫RCM(Recurrent Context Model,卷積內容模型),還有一個叫RGM(Recurrent Generation Model,迴圈生成模型)。

圖片描述

圖片描述

圖片描述

圖片描述

圖片描述

圖片描述

由於內容片段都是從《詩學含英》中挑選出來的,又經過了若干次調整順溜的過程,這樣生成的內容就會相對比較通順。這裡還是有一些不好克服的問題,比如平仄和韻律。平仄就不用說了,把平仄規則做進去的話,就需要建立相應的限制條件,在生成的語句中進行過濾,只留下那些符合的,當然後果就是可能那些尚且通順的句子被濾掉了,卻留下了一些不大通順的例子;而韻律方面也是做了一個Trick——就是隻讓二、四兩句押韻,在生成的過程中會生成不止一個第二句,不止一個第四句,讓它們充當候選集,然後過濾掉那些不押韻的而只輸出押韻的。

圖片描述

這篇論文的位置在:http://aclweb.org/anthology/D/D14/D14-1074.pdf,也有對應的程式碼,位置在:https://github.com/XingxingZhang/rnnpg。比較遺憾的是這套程式碼不是TensorFlow的,程式碼裡有C++,有Java,有Python,混搭得很齊全,你會覺得前面談了這麼多RNN相關的理論概念然後突然在這裡用了一個“假網路”。嗯,好吧,如果大家覺得它做得還比較LOW的話(事實上我也覺得它做得確實比較LOW),那麼就試著自己把它改成一個TensorFlow版本的玩玩吧。大家請注意,這個工程是需要下載一個叫做MISC.tar.bz2的檔案的,這裡有所有的平仄和韻腳的相關文字,用來做過濾用的。

網上現在也有一些其他的產品可以生成類似的結果,比如稻香居作詩機,雖然筆者不確定它百分之百是使用RNN抑或其變種來製作的。當然,作詩機本來也可以不用RNN來做,就用基於統計的隱馬爾可夫模型加“查字典”過濾的方式一樣能夠生成。

圖片描述

圖片描述

如果你在想給妹子寫個有她名字的藏頭詩而搜腸刮肚難以思考的時候,估計它……嗯,也幫不上什麼忙,你需要重新寫一個有藏頭功能的作詩姬。反正演算法的本質在基本理解之後,自由發揮的空間就有了。

圖片描述

我想可能你也發現了,這些詩文雖然聽起來文縐縐的,而且用詞比較雅緻。但是敘事的連貫性、意境這些東西跟人作的詩還是遠沒法比。所以,這些東西當做玩具應該還是比較稱職的,真的指望它幫你搞定妹子……嗯,後果自負吧。所以我們還是撩機器人吧……

推薦圖書:

白話深度學習與Tensorflow
ISBN:978-7-111-57457-6
作者:高揚
定價:69.00元
技術暢銷書《白話大資料與機器學習》姊妹篇。以插圖、類比和大量示例趣說深度學習網路的關鍵理念、演算法與TensoeFlow實踐,涵蓋BP網路、CNN、RNN、深度殘差網路、受限玻爾茲曼機、強化學習、對抗學習,以及多個有趣應用。YY大資料專家撰寫,李學凌、朱頻頻、王慶法、王海龍聯袂推薦。

圖片描述

另外CSDN公眾號(ID:csdnnews)還提供此本書籍的贈書,歡迎前往參與。