admin
08-27 20:39
88次瀏覽
后臺回復“20180717”
下載數據和代碼
編程環境:
Tensorflow
Python 3.6
(實現了一份基于seq2seq的自動對聯的代碼,感興趣的小伙伴可以下載學習)
另外,點擊閱讀原文嘗試微軟的自動對聯系統(
為什么說Encoder-Decoder模型適合作對聯呢?因為相對詩詞等任務來說,對聯要求嚴格的上下聯對仗,老話不是說了嗎,以前兒童詩詞啟蒙時都要學一些對仗規則,比如:天對地,雨對風,大陸對長空,王八對綠豆,鮮艷的山水對ajdcg(后面兩句是本文作者詩才大發胡謅的,請未成年兒童切勿模仿或者在有大人監督場景下模仿@^^@)。這種嚴格的對仗關系意味著極強的映射規律性,而這個用RNN和Encoder-Decoder來說正好是能夠發揮它們長處的地方,所以說Encoder-Decoder加上RNN配置是非常適合用來做對聯的。
對聯的嚴格對仗性可以給個小故事,大家直觀感受下:
相傳俊秀的酸奶少時家貧,其家有片對著地主家的一片竹林,于是他作了副對聯:“門對千桿竹,家藏萬卷書”。地主心說:我幼兒園肄業文憑,你在我面前你這么裝有文化好嗎?于是不爽,命人把竹子砍短,俊秀的酸奶靈機一動把對聯加了一個字,改成:“門對千桿竹短,家藏萬卷書長”。地主氣不打一處來,放出功夫熊貓把竹子全吃了,俊秀的酸奶又改對聯:“門對千桿竹短無,家藏萬卷書長有”。氣得地主直跳腳罵娘。
從這個故事我們可以歸納出中心思想就是:從古至今,有錢就是大爺,可以隨便砍伐樹木破壞生態而不被法律制裁@^^@…..不對,跑偏了,中心思想應該是:肄業的同學都容易創業成功,成為新時達的地主老財,而好好上學的大都免不了家貧的結局…..也不對,你看我這三觀都歪到引力波都達不到的宇宙之外了,中心思想是:對聯是有極強的對仗性的。而這種對仗性代表了什么?代表了語言單元之間極強的規律性,而這是非常適合通過機器來學習并容易做好的事情,這是為何我堅信用Encoder-Decoder做對聯一定能夠做好的原因。
Encoder-Decoder模型
Encoder-Decoder框架可以看作是一種文本處理領域的研究模式,應用場景異常廣泛。下圖是文本處理領域里常用的Encoder-Decoder框架最抽象的一種表示:
圖1.?抽象的Encoder-Decoder框架
Encoder-Decoder框架可以這么直觀地去理解:可以把它看作適合處理由一個句子(或篇章)生成另外一個句子(或篇章)的通用處理模型。對于句子對
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做摘要的思路。關鍵是有沒有那么多訓練數據是帶橫批的,我覺得這個挺懸的。
好了,通過以上方式,我相信能夠構建一個看上去還不錯的對聯自動生成系統。
以上內容來自 《布洛卡區》
極速賽車五碼穩贏技巧"min-height:1em;color:rgb(51,51,51);margin-left:8px;text-align:justify;">只需要找到大量的對聯數據對這個模型進行訓練,那么即可利用這個模型,輸入上聯,機器自動產生下聯了。
值得提的一點是,很明顯,對于做對聯這個事情來說,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做摘要的思路。關鍵是有沒有那么多訓練數據是帶橫批的,我覺得這個挺懸的。
好了,通過以上方式,我相信能夠構建一個看上去還不錯的對聯自動生成系統。
以上內容來自 《布洛卡區》
CSS中div滾動條樣式如何設置HTML div三邊怎么加邊框win7中qq截圖快捷鍵是什么
python寫對聯
鼠年春節用 GPT2 自動寫對聯和對對聯