前言:
我們先看四首詩,這里面,兩首是唐詩人元稹的作品,兩首是作詩機的作品。你能看得出來嗎?
七絕《清明》
對鏡空嗟白發(fā)新,微吟還喚夢中人。
登樓入望青山舊,隔斷紅塵二十春。
五律《清明》
清明來向晚,山淥正光華。
楊柳先飛絮,梧桐續(xù)放花。
鴽聲知化鼠,虹影指天涯。
已識風云意,寧愁雨谷賒。
七絕《寒食》
今年寒食好風流,此日一家同出游。
碧水青山無限思,莫將心道是涪州。
五律《寒食》
傷心曾失所,君子欲何歸?
瑤草誠難補,黃花孰可依。
愁侵燈自照,老去葉初飛。
世事同為客,青山對拂衣。
筆者在17年前(2000年)在自己的個人網(wǎng)站上用“稻香老農(nóng)”的網(wǎng)名發(fā)布了第一代算法的作詩機產(chǎn)品,是國內(nèi)第一款機器合成詩詞的軟件,至今已經(jīng)被使用超過2億次。
2017年初,采用第二代算法的作詩機發(fā)布在公眾號“作詩機”上。上面四首中的其中兩首,就是采用第二代算法機器直接輸入題目進行機器合成的。
公眾號“作詩機”有兩個功能板塊:
1、超級詞匯:提供字、詞匯的各種屬性、關(guān)聯(lián)查詢。
2、智能創(chuàng)作:自動作詩,填詞。
使用第三代算法的軟件正在調(diào)試,預計年內(nèi)發(fā)布。
我這里盡可能用最通俗的語言剖析一下作詩機的第二代算法。網(wǎng)上時常見到一些大學、科研機構(gòu)研究的機器合成算法,遺傳算法、精英策略、輪盤賭算法等等……寫得很深奧,其實說白了,都差不多一個意思。
機器作詩的三個步驟
總的來說,二代算法的作詩機寫一首詩,經(jīng)歷了三個步驟:
第一步、事先讓機器學習約50萬首律詩和絕句,形成幾個能表現(xiàn)“題目”,“句子”和“詞匯”三者關(guān)系的數(shù)據(jù)庫。
第二步、根據(jù)題目,用和題目相關(guān)的詞匯形成每個句子的第一個詞匯,然后再形成每個句子,然后機器先合成出一首原型詩。
第三步、即時根據(jù)格律要求、詞匯間關(guān)系的緊密程度,優(yōu)化原型詩,直到符合格律或達到設(shè)定的優(yōu)化次數(shù),最后輸出。
壹、步驟一:機器學習了什么?
舉個例子,機器學習李白的《望廬山瀑布》:
日照香爐生紫煙,遙看瀑布掛前川。
飛流直下三千尺,疑是銀河落九天。
1、首先是分詞(把句子分割成詞匯),一個是題目需要分詞,一個內(nèi)容需要分詞。
(1)題目通過算法可以分為:望/廬山/瀑布。其中廬山和瀑布都是專用名詞。機器會認為這首的主題有可能是“廬山”或者“瀑布”。
但到底是“廬山”還是“瀑布”呢?這又是另外一個預先就要先計算好的課題:
我們可以把這首詩里的詞匯取出來,再去匹配其他詩詞,如果發(fā)現(xiàn)在一定的適配度下,以哪個詞為題的詩詞更多,我們就會認為這首詩的主題哪個詞。(當然,通過計算,我們的結(jié)果是:這首詩的主題是“瀑布”而不是“廬山”)。
(2)然后就是內(nèi)容分詞,詩內(nèi)容很容易,就2-2-2-1或2-2-1-2不外乎這兩種。
Tips:詞如何分詞?詞的分詞則麻煩一些,詞有幾十個詞牌有領(lǐng)字(也叫一字逗、一字領(lǐng)),可以先根據(jù)詞譜來分詞。然后再用常規(guī)的分詞技術(shù),常見有領(lǐng)字的詞牌有《沁園春》等三十幾個詞牌(見文末的附錄)。
例詩內(nèi)容分詞后的效果:
日照/香爐/生/紫煙,遙看/瀑布/掛/前川。
飛流/直下/三千/尺,疑是/銀河/落/九天。
2、分詞完,我們要形成三種數(shù)據(jù):
推薦詞數(shù)據(jù)庫:詞匯之間前后關(guān)系的數(shù)據(jù)庫。
共現(xiàn)詞庫:能表現(xiàn)題目和詞匯關(guān)系的數(shù)據(jù)庫。
對詞庫:對仗詞數(shù)據(jù)庫。
(1)推薦詞數(shù)據(jù)庫:把幾十萬首詩過一遍,去掉重復的,我們會得到大約120萬組“前后推薦詞”,什么叫“推薦詞”?
這一首里:“日照”是“香爐”的前推薦詞?!跋銧t”則是“日照”的后推薦詞。推薦詞數(shù)據(jù)庫不只預示詞匯間的前后關(guān)系,更重要的是,預示詞匯間“有沒有關(guān)系”。如果有很多詩詞句子里都有日照和香爐,不管先后,我們可以理解為日照和香爐“很有關(guān)系”,由于古詩詞的特殊性,大多數(shù)詞匯前后關(guān)系不重要,可以互為推薦詞。
(2)共現(xiàn)詞庫:什么叫共現(xiàn)詞?
在一種主題的中,共同出現(xiàn)的詞匯。
李白這首《望廬山瀑布》,題目我們通過機器分詞,然后用詞性篩選,我們得到主題:“瀑布”。
我們已經(jīng)事先通過另一個機器學習程序,把數(shù)十萬首詩詞做了分類,比如瀑布,我們得到大約有三四百首以瀑布為主題的詩詞。這幾百首詩里經(jīng)常共同出現(xiàn)的詞匯,我把他它們叫共現(xiàn)詞。
比如經(jīng)常在瀑布這個主題里出現(xiàn)的詞匯(共現(xiàn)詞)大致是:峰前、銀河、飛泉、清谷、壁山、煙霞……
體會下,這些詞匯是不是和“瀑布”關(guān)系密切?
(3)對仗詞庫:我們知道律詩中間兩聯(lián)需要對仗,所以,機器在學習形成前兩個庫的同時,從中間兩聯(lián)同時獲得了對詞,大約得到100萬組不重復的對詞。
對詞哪個對子重復最多,猜猜?居然是“天上”對“人間”,北京那家夜總會起名字人莫非研究過?
Tips:對仗詞只是詩里有嗎?不是,不少詞里也有。有些詞牌某兩句會推薦使用對仗句(如《浣溪沙》),或者某個一字逗后面推薦使用幾組對仗句(如《滿江紅》)。
詞里的對仗句也出了很多名句,如“無可奈何花落去,似曾相識燕歸來?!保秩纭白栽陲w花輕似夢,無邊絲雨細如愁?!?/p>
推薦使用對仗的詞牌有十幾個,見文后附錄。我不知道這里用“詞牌推薦使用”是否合適,也可能是某人用對仗出了名句,大家就跟著學了,而后就成了慣例。
有一點提醒,從詞里獲得的對仗詞,往往無法用在詩里面。因為律詩里獲得的對仗詞,平仄也是相對的,而詞里則未必,因為詞詩根據(jù)詞譜填的。
3、這三個數(shù)據(jù)庫都可以使用超級詞匯工具查詢:
以瀑布為例:
這里,“走得近”的詞就是我上面說的共現(xiàn)詞。
貳、步驟二:根據(jù)題目機器合成出一首原型詩。
這個里有三個問題要解決:
怎么根據(jù)題目獲取和題目相關(guān)的詞匯。
怎么根據(jù)詞匯形成句子。
律詩怎么處理。
1、從用戶的題目獲取詞匯:從上面的共現(xiàn)詞庫獲取。
如上面說到的“瀑布”,我們已經(jīng)從三四百首瀑布里獲得了瀑布的共現(xiàn)詞:
瀑布:飛流、銀河、飛泉、清谷、壁山、煙霞……
仔細看看,是否這些詞匯放在寫“瀑布”的詩里意思還是合適的?
這里我們選四個分配給四個句子。每個句子就有了一個共現(xiàn)詞。
2、如何讓詞匯形成句子:從前后推薦詞庫里獲得,我還還是以瀑布為例:
在公眾號超級詞匯里,查找瀑布,我們看到:
荷花的前推薦詞為:千尋、奔騰、倒懸、飛來、窗前……
荷花的后推薦詞為:半空落、出空微、穿危石、掛峰頭、飛晴雨……
這個時候,哪怕閉上眼睛,隨便把“前推薦詞” “瀑布” “后推薦詞”,一組合,都是連貫的句子:
千尋瀑布半空落
飛來瀑布出空微
倒懸瀑布掛峰頭
窗前瀑布飛晴雨
3、律詩的合成。絕句中間加上兩聯(lián),就是律詩,分別用對詞庫。
Tips:其實,在我的軟件里,不管你選擇什么體裁,軟件都是寫一首七言律詩,然后裁剪成你要體裁。
五律:七律砍掉前兩字,就是五律。
七絕:“絕”本來就是“截”的意思,七律砍掉任意連續(xù)的兩聯(lián)就是七絕。
五絕:七絕砍掉前兩字,就是五絕。
4、到了這一步結(jié)束,我們已經(jīng)把詞匯都填進去了:
通過用戶的題目,為每一句分配了一個共現(xiàn)詞。(這也確定了整首詩的大致意思)
把每一句的共現(xiàn)詞,用“前推薦詞” 共現(xiàn)詞 “后推薦詞”已經(jīng)寫好了句子。(這里確保了每個句子的連貫性)
只是:平仄還沒有考慮,押韻還沒有考慮。后面第三步會說明如何交叉、優(yōu)化和收斂到符合格律、符合押韻。
Tips:詩的平仄還好,就平仄。詞就麻煩很多,不少地方不止是要求仄,還要求是仄里的去聲或者入聲。
正如李清照在《詞論》中提出“蓋詩文分平側(cè),而歌詞分五音,又分五聲,又分六律,又分清濁輕重?!?/span>
但從技術(shù)的角度來說,由于作詩機詩按平水韻,平水韻有106個韻部(特別是有些窄韻、險韻和啞韻,可選詞匯很少);詞按詞林正韻,有19個韻部。就從這點來說,詩可選的詞匯限制多很多。
叁、最后一個步驟:優(yōu)化和輸出。
這個時候,只要從四個共現(xiàn)詞(絕句為例)中,以格律為約束條件,通過交叉和迭代,收斂到同一個韻部就可以了。
交叉、迭代技術(shù)性比較強,這里就不詳細解釋了,總之,目的就是優(yōu)化。
二代算法為了保證趣味性,比如每次都要形成不同的詩詞,不能優(yōu)化到最佳值,否則最佳值只有一個,那就沒有趣味性了。二代算法只優(yōu)化到符合格律(平仄、押韻)為止,把更多的選擇用候選句的形式提供給使用者。
理論上,給機器足夠的時間進行足夠的交叉迭代,機器是可以寫出很中規(guī)中矩的詩詞來的。
Tips:詞的自動生成:
詞除了平仄押韻外,還有一些特殊的格式。僅疊句就很多,舉一些名句:
疊一字的如:陸游《釵頭鳳》“一懷愁緒,幾年離索。錯!錯!錯!”
疊兩字的如:李清照《如夢令》“爭渡,爭渡,驚奇一灘鷗鷺。”
疊三字的如:李白《憶秦娥》“秦娥夢斷秦樓月。秦樓月,”
疊四字的如:辛棄疾《丑奴兒》:“愛上層樓。愛上層樓,”
疊五字的如:辛棄疾《東坡引》:“羅衣寬一半,羅衣寬一半”
疊六字的如:賀鑄《琴調(diào)相思引》“動管色,催行色;動管色,催行色;”
最為特殊的,當屬《調(diào)笑令》(也叫古調(diào)笑、宮中調(diào)笑、調(diào)嘯詞、轉(zhuǎn)應(yīng)曲)。
我們看一個唐詩人戴叔倫的《轉(zhuǎn)應(yīng)曲》:
邊草,邊草,(仄韻一)
邊草盡來兵老。(仄韻一)
山南山北雪晴。(轉(zhuǎn)平韻)
千里萬里月明。(平韻)
明月,明月,(前句最后兩個字反轉(zhuǎn))(反轉(zhuǎn)后轉(zhuǎn)仄韻二)
胡笳一聲愁絕(仄韻二)
說明:“明月”處是將上句的最后兩個字“月明”翻轉(zhuǎn)二來。最后一句則和翻轉(zhuǎn)后的“月“押韻。所以,這首詞短短幾句,有三個韻。
肆、效果測試:
只需輸入標題,比如我們輸入“天涯”:
七絕《天涯》作詩機
千里迢迢返故廬,平生寂寞故人疏。
江山不見鶯花老,落日相逢歲又除。
Tips:作詩機的作品,點擊其中一句,候選句會提供無窮無盡的同一個格律的候選句。每次點擊出10句,總可以挑選到合適的。
伍、三代算法和二代算法:
可以簡單這么理解:
二代算法:使用了唐宋詩人數(shù)千人大眾的基因。
三代算法:讓李白娶李清照,取兩個“精英”結(jié)婚后的基因。
希望屆時能給大家?guī)砀蟮捏@喜。
附錄一:含有領(lǐng)字格的詞牌:
|沁園春|壽星明|
|水龍吟|龍吟曲|莊椿歲|小樓連苑|
|摸魚兒|摸魚子|買陂塘|邁陂塘|雙蕖怨|
|齊天樂|臺城路|五福降中天|如此江山|
|洞仙歌|
|行香子|
|八聲甘州|
|醉太平|
|憶舊游|
|蘭陵王|
|二郎神|
|法曲獻仙音|
|長亭怨慢|
|絳都春|
|鶯啼序|
|金人捧露盤|銅人捧露盤引|上西平|西平曲|
|暗香|紅情|
|雙雙燕|
|望遠行|
|酷相思|
|黃鶯兒|
|翠樓吟|
|八六子|
|憶少年|十二時|
|眉嫵|百宜嬌|
|六丑|
附錄二:詞譜里有推薦使用對仗句子的詞牌有
|浣溪沙|攤破浣溪沙|山花子|
|鷓鴣天|思佳客|
|水調(diào)歌頭|
|沁園春|壽星明|
|西江月|步虛詞|江月令|
|踏莎行|轉(zhuǎn)調(diào)踏莎行|
|南歌子|南柯子|風蝶令|
|憶江南|望江南|夢江南|江南好|
|望海潮|
|漁歌子|
|金人捧露盤|銅人捧露盤引|上西平|西平曲|
|八六子|