當前位置:法律諮詢服務網 - 中國稅務 - 使用Encoder-Decoder模型自動生成對聯的思路

使用Encoder-Decoder模型自動生成對聯的思路

在我看到第壹篇Encoder-Decoder模型的論文的時候,我就覺得用這個來作對聯自動生成是再合適不過的了,做詩詞應該也是比較適合的,但是相對詩詞,用它來做對聯肯定更合適。今天的文章就講講這方面的內容。這篇文章主體內容是2015年底形成的,本來我的打算是收集些訓練數據,讓Encoder-Decoder+Attention生成些對聯把這篇文章補充些例子再發出去,不過因為精力原因,遲遲沒有做這個實驗,短期內可能也沒時間做,所以幹脆就現在分享出來,哪位有精力和興趣可以實際做壹下試試,這看上去沒啥實際用處,但是還是挺好玩的壹件事。不過我確信用這個模型做對聯生成壹定可以做好。

為什麽說Encoder-Decoder模型適合作對聯呢?因為相對詩詞等任務來說,對聯要求嚴格的上下聯對仗,老話不是說了嗎,以前兒童詩詞啟蒙時都要學壹些對仗規則,比如:天對地,雨對風,大陸對長空,王八對綠豆,八戒對悟空(後面兩句是本文作者詩才大發胡謅的,請未成年兒童切勿模仿或者在有大人監督場景下模仿@^^@)。這種嚴格的對仗關系意味著極強的映射規律性,而這個用RNN和Encoder-Decoder來說正好是能夠發揮它們長處的地方,所以說Encoder-Decoder加上RNN配置是非常適合用來做對聯的。

對聯的嚴格對仗性可以給個小故事,大家直觀感受下:

相傳解縉少時家貧,其家有片對著地主家的壹片竹林,於是他作了副對聯:“門對千桿竹,家藏萬卷書”。地主心說:我幼兒園肄業文憑,妳在我面前妳這麽裝有文化好嗎?於是不爽,命人把竹子砍短,解縉靈機壹動把對聯加了壹個字,改成:“門對千桿竹短,家藏萬卷書長”。地主氣不打壹處來,放出功夫熊貓把竹子全吃了,解縉又改對聯:“門對千桿竹短無,家藏萬卷書長有”。氣得地主直跳腳罵娘。

從這個故事我們可以歸納出中心思想就是:從古至今,有錢就是大爺,可以隨便砍伐樹木破壞生態而不被法律制裁@^^@…..不對,跑偏了,中心思想應該是:肄業的同學都容易創業成功,成為新時達的地主老財,而好好上學的大都免不了家貧的結局…..也不對,妳看我這三觀都歪到引力波都達不到的宇宙之外了,中心思想是:對聯是有極強的對仗性的。而這種對仗性代表了什麽?代表了語言單元之間極強的規律性,而這是非常適合通過機器來學習並容易做好的事情,這是為何我堅信用Encoder-Decoder做對聯壹定能夠做好的原因。

|Encoder-Decoder模型

Encoder-Decoder框架可以看作是壹種文本處理領域的研究模式,應用場景異常廣泛。下圖是文本處理領域裏常用的Encoder-Decoder框架最抽象的壹種表示:

圖1. 抽象的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框架應用問題。我們所需要做的就是配置好Encoder-Decoder框架的具體模型,比如Encoder和Decoder都采用RNN模型來做,圖2展示了用Encoder-Decoder框架做對聯下聯自動生成的架構圖。

? 圖2. Encoder-Decoder生成下聯

只需要找到大量的對聯數據對這個模型進行訓練,那麽即可利用這個模型,輸入上聯,機器自動產生下聯了。

值得提的壹點是,很明顯,對於做對聯這個事情來說,Encoder-Decoder框架加上Attention應該會顯著提升產生下聯的質量,原因還是因為它是要求嚴格對仗的,所以在生成下聯某個字的時候,找到對應上聯相應字作為生成的重點參考信息無疑是非常重要的。比如看到上聯的“三”字,Attention模型使得下聯產生對應字“壹”的時候重點參考上聯的“三”這個字,應該知道對應的應該是壹個數字型漢字。圖3是加上Attention模型的示意圖。

? 圖3. Attention模型

這裏再插上壹句,作為對聯下聯生成任務來說,使用Encoder-Decoder來做這個事情,我相信漢字之間的對仗關系應該能夠很好地被學會,但是如何保證生成下聯語義能夠壹致其實並不壹定能夠很好地解決。這是什麽意思呢?意思是可能機器看到上聯“風雲三尺劍”,極有可能對出下面的內容:“雨風萬丈刀”,單看每個字對仗的都很工整,但是作為壹個整體,語義看上去不那麽協調。(註:其實如果真對出這個下聯,想想其實還是挺豪情萬丈的,是吧?這其實跟人在意識上會把連續出現的字通過想象組合出壹種合理語境有關。)

當然如果訓練數據夠大的話,這個問題應該不會太大,因為本質上Encoder-Decoder在解碼階段是能夠學會語言模型的,而很明顯語言模型的引入對於生成下聯的可讀性和語言壹致性是很有幫助的。但是如果訓練數據不是那麽大,我相信通過使用大量古詩來訓練壹個詩詞語言模型,在Decoder生成階段,每個時間節點t生成很多可能的候選漢字,然後利用這個語言模型+Beam Search應該能夠使得生成的對聯保證壹定的語義壹致性。

到此為止,作為對聯生成其實還有個問題,就是上下聯對應漢字的平厭問題,這個也可以類似語言模型壹樣作為後處理的步驟進行篩選過濾。不過我覺得Encoder-Decoder也極有可能會學會這種平厭關系,因為這個規律還是很明顯的,這點不確定,得通過實驗來證明這壹點。

情形二:對聯由機器完全自動生成

上面講的是如果上聯是人給出的,機器如何自動產生和順的下聯。那麽如果問題難度增加壹下,如果上聯也不知道,機器能夠完全自動生成完整的壹幅對聯嗎?

很明顯,情形壹是情形二的子問題,假設我們分兩步來完全自動地生成對聯,第壹步是不論用什麽方法,先生成壹句上聯。第二步根據上聯自動生成下聯。第二步明顯可以使用情形壹訓練出的模型來做。所以情形二的關鍵問題轉換為:如何在壹無所知情況下生成壹句上聯?

我覺得這個子問題可以通過如下方式解決:使用RNN構建壹個古詩詞的語言模型,然後上聯通過這個RNN語言模型自動生成,這從道理上是講得通的。也就是說,整體架構如圖4所示。

圖4? 完全自動生成對聯

此外,對於對聯來說,還遺留壹個小問題,就是對聯的橫批如何生成的問題。因為壹般對聯還需要配上壹個橫批來歸納上下聯的主旨。這個其實思路也是類似的,可以把上下聯看做壹個整體作為Encoder的輸入,Decoder用來生成橫批即可,這個類似於用Encoder-Decoder+Attention做摘要的思路。關鍵是有沒有那麽多訓練數據是帶橫批的,我覺得這個挺懸的。

好了,通過以上方式,我相信能夠構建壹個看上去還不錯的對聯自動生成系統。

  • 上一篇:生活中有哪些稅收的現象
  • 下一篇:手抄報花朵插畫-三八節手抄報怎麽畫簡單又漂亮
  • copyright 2024法律諮詢服務網