藏頭唐詩生成

Ya-Liang Allen Chang
5 min readJan 12, 2019

--

我們的藏頭詩生成網站https://poem.cschen.io/poems

<機器學習守德好帥 >
機鶴金爐濟,器從萬衲鶴;
學書連山語,習淚石流宅。
守宰獨無容,德高百百多;
好竹雲山岸,帥此自言我。

帥此自言我!好詩、好詩!

這是我們守德機器學習專論( Special Topics/Directions on Machine Learning, SDML)的final project──藏頭唐詩生成

起源

SDML的作業三是做歌詞生成,只要給一句歌詞、控制(下一句的詞性、押韻跟長度),用簡單的seq2seq就可以生出一句漂亮的歌詞:

<輸入> SOS 灵魂 不再 悲戚 EOS n v v r uj nz NOP ing NOE 6 NOR
<輸出> SOS 夜空 亮 起 你 的 星星 EOS

控制的正確率可以train到90%以上,效果意外的好,而作業三想探討seq2seq能學到這些控制的原因。

我們覺得這些控制相當有趣,想看看用這些控制能不能生成一個完整的東西,比如說···唐詩?

藏頭唐詩生成

唐詩生成是老題目了,很多人都做得不錯,比如2014的RNNPG、2016的 Chinese Poetry Generation with Planning based Neural Network可以生出主題是「啤酒」的詩,而守德自己也有一篇;GitHub上也能找到很多資源,如AcrosticPoemchinese-poetryChinese_poem_generator

不過大多數的方法都要有給主題、從主題延伸相關詞彙,而藏頭詩沒有給主題、我們也沒有相關詞彙的資料庫,要用seq2seq生成一首完整的詩也不簡單。

我們試了很多種不同的training data:

  • 給藏頭跟控制,讓seq2seq生一句詩
  • 給藏頭、部分詩詞跟控制,讓seq2seq生一句詩
  • 給藏中、部分詩詞跟控制,讓seq2seq生一句詩
  • 給藏頭、上一句詩跟控制,讓seq2seq生一句詩
  • 給所有藏頭跟控制,讓seq2seq生一整首詩

(這邊的控制是平仄、詞性、句末押韻跟作者)

不過結果都不是很理想,一開始只用全唐詩裡面的五言絕句(約兩千多首),資料量太少,生出來的perplexity會很高,都是重複的字:

Input: 所有藏頭跟控制 Output:整首詩

後來加入五言律詩,生出來的結果會比較有語意,但不太顧藏頭:

Input: 不同位置的藏頭跟控制 Output:整首詩

Train來train去,都沒有生出一個好的model。眼看再一個禮拜就是final presentation了,不如寫一個網站拿別人生的詩來···

NTM+Seq2Seq

···不不不,我是說,拿別人生好的詩來當training data,再加上我們的control signal,應該就能生成我們想要的藏頭詩(畢竟如果原本就是詩了,過seq2seq的model之後應該不會太差)。

之前有大神用Golang實作的ntm,可以不用給主題、直接生成藏頭詩,生出來的詩有藏頭、有詞意,但沒有押韻跟對仗;剛好我們的model可以學這些控制。

於是我們的model變成:

給藏頭
→ 丟進NTM生沒有格律的詩
→ 加上控制丟進seq2seq
→ 生出最後符合格律跟藏頭的詩!

結果生出來的詩的詞意還不錯,各項控制的準確率也相當高:

在test set上的evaluation
左邊是原本真正的詩句(ground truth),右邊是我們的model給藏頭生出來的結果(output),其實滿像的

Demo

最後我們把NTM Go server + Python Seq2Seq server+ Rails 前後端串起來,做了一個demo網站,

只要給想藏頭的四或八個字,還有作者風格,後端會隨機套用一首詩的押韻/詞性/平仄,生成一首符合(基本)格律的詩喔

我們的藏頭詩生成網站https://poem.cschen.io/poems

可以到https://poem.cschen.io/poems玩玩看~

結語

我們用NTM+seq2seq生出符合格律的藏頭詩,這個題目說明seq2seq的控制效果不錯,在研究上的意義/創新並不是很大,不過頗具娛樂性質XD

--

--

No responses yet