編輯導(dǎo)語(yǔ):詩(shī)詞的創(chuàng)作需要遵循很多的規(guī)矩,因此詩(shī)歌是有規(guī)律的。本文作者運(yùn)用多種文本挖掘方法,對(duì)手頭的詩(shī)歌語(yǔ)料庫(kù)進(jìn)行了深入的挖掘和分析,讓我們一起來看看作者是如何完成文本數(shù)據(jù)的探索任務(wù)。
楔子:
許多年之后,面對(duì)書桌上的兩句殘?jiān)~,貶居黃州的東坡居士將會(huì)回想起,他在故鄉(xiāng)眉山見到朱姓老尼的那個(gè)遙遠(yuǎn)的下午。彼時(shí)的東坡還不是東坡,還只是一個(gè)七歲孩童。有一天,他在家附近偶遇一位年約九十的朱姓老尼。
老尼看到蘇軾天資聰穎,就跟他聊起自己年輕時(shí)的經(jīng)歷。她曾跟隨師父進(jìn)入后蜀主孟昶的宮中。一日,天酷熱,孟昶和他的妃子花蕊夫人深夜納涼于摩訶池上。面對(duì)此情此景,蜀主即興賦詞一首,老尼將她印象中僅存的打頭兩句告訴了蘇軾.
四十年后,蘇軾貶居于黃州,想起這段往事,遺憾于孟昶的詞只余兩句,突發(fā)奇想要將這兩句詞續(xù)寫完整。他先猜測(cè)出這首詞的詞牌名——“洞仙歌令”,但要還原整首詞作,必須深刻結(jié)合寫詞人當(dāng)時(shí)之心情以及伴隨而來的意境。
蘇軾因而循著僅存的兩句詞,根據(jù)老尼給他的描述,竭力在腦海中還原蜀主當(dāng)時(shí)的創(chuàng)作場(chǎng)景和心境,最終將詞續(xù)完,成就名作《洞仙歌》:
冰肌玉骨,自清涼無(wú)汗。水殿風(fēng)來暗香滿。繡簾開,一點(diǎn)明月窺人,人未寢,倚枕釵橫鬢亂。
起來攜素手,庭戶無(wú)聲,時(shí)見疏星渡河漢。試問夜如何,夜已三更,金波淡,玉繩低轉(zhuǎn)。但屈指西風(fēng)幾時(shí)來,又不道流年暗中偷換。
以上就是文學(xué)史上有名的“東坡續(xù)詞”,雖說是文學(xué)史上的一段佳話,但筆者從中隱約看到了數(shù)理思維的影子。
詩(shī)詞的創(chuàng)作過程有如在求解一個(gè)“最優(yōu)化問題”:在一定的約束條件下,如詩(shī)詞要遵守的平仄、押韻、對(duì)仗/對(duì)偶、五七變式、詞譜、情境等,詩(shī)詞創(chuàng)作者用文字將自己內(nèi)心的真實(shí)感動(dòng)用語(yǔ)言文字表達(dá)出來;在“戴著鐐銬在跳舞”的情況下,竭力達(dá)到音韻美、精煉美、言辭美、朦朧美、情感美、繪畫美和形式美的至臻境界。
此時(shí),詩(shī)詞之精美和數(shù)理之嚴(yán)密是可以完美結(jié)合的。
既然詩(shī)歌的創(chuàng)作是有規(guī)律的,那么,通過一定的數(shù)據(jù)挖掘手段,我們是能夠從中發(fā)現(xiàn)一些insight的。
在本文中,筆者循著這個(gè)思路,將運(yùn)用若干文本挖掘方法對(duì)手頭的詩(shī)歌語(yǔ)料庫(kù)(該詩(shī)歌原始語(yǔ)料庫(kù)地址為https://github.com/Werneror/Poetry)進(jìn)行深入挖掘和分析,該詩(shī)歌語(yǔ)料庫(kù)的基本統(tǒng)計(jì)數(shù)據(jù)如下:
從上表可以看到,該詩(shī)歌語(yǔ)料庫(kù)中共計(jì)近85萬(wàn)余首詩(shī)歌,詩(shī)歌作者數(shù)量達(dá)29377位之多;其中,字段包括“題目”、“朝代”、“作者”和“內(nèi)容(詩(shī)歌)”。
為了方便后續(xù)的分析,筆者僅取其中的律詩(shī)和絕句,且僅取其中的五言和七言,排律(如《春江花月夜》、《長(zhǎng)恨歌》等)、雜言(如李白的將進(jìn)酒)等就不在本文的分析范圍之內(nèi)。
經(jīng)過數(shù)據(jù)清洗后,最終得詩(shī)544,443,占到原數(shù)據(jù)庫(kù)的59.1%,以下分別是清洗后的詩(shī)歌數(shù)據(jù)統(tǒng)計(jì)結(jié)果和部分樣例:
針對(duì)上述數(shù)據(jù),筆者在本文中主要有兩個(gè)大目標(biāo):
- 構(gòu)建一個(gè)包含熱門題材標(biāo)簽的詩(shī)歌語(yǔ)料庫(kù),用于后續(xù)的詩(shī)歌題材分類和詩(shī)歌生成任務(wù);
- 基于上述詩(shī)歌語(yǔ)料庫(kù)的各類文本挖掘和語(yǔ)義分析,以期得到有趣味的發(fā)現(xiàn)。
針對(duì)上述目標(biāo),本文的實(shí)現(xiàn)路線圖,同時(shí)也是本文的行文脈絡(luò),如下所示(點(diǎn)擊圖片可放大查看):
值得注意的是,上述實(shí)現(xiàn)路徑中,涉及到自然語(yǔ)言處理的兩大組成部分,即自然語(yǔ)言理解(分詞、語(yǔ)義建模、語(yǔ)義相似度、聚類和分類等)和自然語(yǔ)言生成(詩(shī)歌生成和詩(shī)歌翻譯),看完也會(huì)對(duì)自然語(yǔ)言處理有一定的了解。
信息量大,請(qǐng)耐心享用。
1. 詩(shī)歌分詞和熱詞發(fā)現(xiàn)
給定一首詩(shī)歌文本,在其中隨機(jī)取一個(gè)片段,如何判斷這個(gè)片段是否是一個(gè)有意義的詞匯呢?
如果這個(gè)片段左右的搭配變化較多、很豐富,同時(shí)片段內(nèi)部的成分搭配很固定。那么,我們可以認(rèn)為這個(gè)片段是一個(gè)詞匯,比如下圖中所示的“摩詰”就是符合這個(gè)定義,那么它就是一個(gè)詞匯。
在具體實(shí)施的算法中,衡量片段外部左右搭配的豐富程度的指標(biāo)叫“自由度”,可以用(左右)信息熵來度量;而片段內(nèi)部搭配的固定程度叫“凝固度”,可以用子序列的互信息來度量。
在這里,筆者利用Jiayan(甲言)對(duì)這54余萬(wàn)首詩(shī)歌進(jìn)行自動(dòng)分詞,在結(jié)果中按照詞匯出現(xiàn)頻率從高到低進(jìn)行排序,最終從語(yǔ)料庫(kù)中抽取若干有意義的高頻詞。其中,詞匯的長(zhǎng)度從1到4。
抽取結(jié)果如下(點(diǎn)擊圖片可放大查看):
筆者觀察其中部分結(jié)果,發(fā)現(xiàn)一字詞、二字詞才能算得上一般意義上的詞匯,如“不”、“爍”、“歲寒”、“留滯”等 。
三字詞和四字詞一般是多類詞性詞匯的組合,嚴(yán)格上講,應(yīng)該算作短語(yǔ)或者固定表達(dá),如“隨流水”、”云深處”、“人間萬(wàn)事”、“江湖萬(wàn)里”等。
但本文為了表述方便,筆者將它們統(tǒng)一稱之為詞。
下面,筆者分別展示詞長(zhǎng)從1到4的TOP100的高頻詞詞云(點(diǎn)擊圖片可放大查看)。
一字高頻詞中,除去“不”、“無(wú)”、“有”這類“虛詞”,單看“人山風(fēng)日天云春花年月水”這11個(gè)高頻字,暗合了中國(guó)天人合一哲學(xué)傳統(tǒng),作詩(shī)如作畫,作詩(shī)者是把人放到自然環(huán)境、天地歲月這個(gè)時(shí)空大畫卷中,七情六欲、天人感應(yīng),詩(shī)情畫意就由感而生,詩(shī)意盎然了!
“詩(shī)畫本一律”,古人誠(chéng)不我欺!
二字高頻詞中,較為顯眼的是“萬(wàn)里”、“千里”,它們描繪出巨大的空間感,在詩(shī)歌中經(jīng)常跟“宏景”“貶謫”、“思鄉(xiāng)”、“閨怨”等主題捆綁在一起。
此外,“明月”、“故人”、“白云”、“功名”、“人間”、“平生”和“相逢”等詞匯也是橫亙古今的熱門用語(yǔ)。
三字高頻詞中,數(shù)字的使用很是常見,如“二三子”、“二十四”、“一樽酒”、“二千石”等。其中,最值得一提的是詩(shī)人們用數(shù)詞對(duì)時(shí)空的描繪:表達(dá)時(shí)間跨度的,如“二十年”、“四十年”、“五百年”、“十年前”、“千載后”等。
表達(dá)空間距離的,如“千里外”、“三百里”、“百尺樓”……古人總是喜歡把自己置身于浩瀚渺茫的時(shí)空之中,去思考自己匆匆的人生。
正如東坡在《赤壁賦》的感慨:“寄蜉蝣于天地,渺滄海之一粟。哀吾生之須臾,羨長(zhǎng)江之無(wú)窮!”
在四字高頻詞中,空間方位的詞匯較多,如“南北東西”、“江南江北”、“東西南北”等詞。
因四字詞詞長(zhǎng)較長(zhǎng),像“人間萬(wàn)事”、“千巖萬(wàn)壑”、“明月清風(fēng)”、“白云深處”、“相逢一笑”等詞就擁有較高的信息量,能夠還原大部分的詩(shī)歌意境了。
2. 訓(xùn)練含納詩(shī)歌詞匯語(yǔ)義關(guān)聯(lián)性的詞嵌入模型
詞嵌入模型可以從海量的詩(shī)歌文本中自動(dòng)學(xué)習(xí)到字詞之間的關(guān)聯(lián)關(guān)系,據(jù)此可實(shí)現(xiàn)字詞關(guān)聯(lián)度分析、字詞相似度分析、聚類分析等任務(wù)。
然而,計(jì)算機(jī)程序不能直接處理字符串形式的文本數(shù)據(jù),所以筆者首當(dāng)其沖的一個(gè)步驟就是將詩(shī)歌文本數(shù)據(jù)分詞,之后再“翻譯”為計(jì)算機(jī)可以處理的數(shù)據(jù)形式,這由一個(gè)名為“文本向量化”的操作來實(shí)現(xiàn)。
先談分詞,它跟前面的高頻詞挖掘有聯(lián)系,是后續(xù)所有分析任務(wù)的起始點(diǎn)。
結(jié)合前面積累的詞庫(kù),再基于有向無(wú)環(huán)詞圖、句子最大概率路徑和動(dòng)態(tài)規(guī)劃算法對(duì)這54萬(wàn)首詩(shī)歌進(jìn)行分詞操作,F(xiàn)試舉一例:
分詞前:“萬(wàn)物生蕓蕓,與我本同氣。氤氳隨所感,形體偶然異。丘岳孰為高,塵粒孰為細(xì)。忘物亦忘我,優(yōu)游何所覬。”
分詞后:[‘萬(wàn)物’, ‘生’, ‘蕓蕓’, ‘,’, ‘與’, ‘我’, ‘本’, ‘同’, ‘氣’, ‘。’,’氤氳’, ‘隨’, ‘所’, ‘感’, ‘,’,’形體’, ‘偶然’, ‘異’, ‘!, ‘丘岳’, ‘孰’, ‘為’, ‘高’, ‘,’, ‘塵’, ‘!, ‘孰’, ‘為’, ‘細(xì)’, ‘!,’忘’, ‘物’, ‘亦’, ‘忘我’, ‘,’, ‘優(yōu)游’, ‘何’, ‘所’, ‘覬’, ‘!痌
分詞之后再做適當(dāng)處理就可以“喂給”詞嵌入模型(這里是Word2vec)進(jìn)行訓(xùn)練了。
基于Word2vec詞嵌入模型能從大量未標(biāo)注的文本數(shù)據(jù)中“學(xué)習(xí)”到字、詞向量,而且這些字、詞向量包含了字詞之間的語(yǔ)義關(guān)聯(lián)關(guān)系(可以是語(yǔ)義相關(guān)或句法相關(guān)),正如現(xiàn)實(shí)世界中的“物以類聚,類以群分”一樣,字詞可以由它們身邊的字(上下文語(yǔ)境)來定義,而Word2vec詞嵌入模型恰恰能學(xué)習(xí)到這種詞匯和語(yǔ)境之間的關(guān)聯(lián)性。
其基本原理如下圖所示(點(diǎn)擊圖片可放大查看):
訓(xùn)練完該模型后,將其訓(xùn)練結(jié)果投射到三維空間,則是如下景象(點(diǎn)擊圖片可放大查看):
在訓(xùn)練Word2vec的過程中,模型會(huì)從大量的詩(shī)歌文本數(shù)據(jù)中學(xué)習(xí)到詞匯之間的2類關(guān)聯(lián)關(guān)系,即聚合關(guān)系和組合關(guān)系。
聚合關(guān)系:如果詞匯A和詞匯B可以互相替換,則它們具有聚合關(guān)系。
換言之,如果詞匯A和詞匯B含有聚合關(guān)系,在相同的語(yǔ)義或者句法類別中可以利用其中一個(gè)來替換另一個(gè),但不影響對(duì)整個(gè)句子的理解。
例如,“蕭蕭”、“瀟瀟”都是象聲詞,多用于描述雨聲,具有聚合關(guān)系,那么“山下蘭芽短浸溪,松間沙路凈無(wú)泥,蕭蕭暮雨子規(guī)啼”中的“蕭蕭”可以換做“瀟瀟”。
組合關(guān)系:如果詞匯A和詞匯B可以在句法關(guān)系上相互結(jié)合,那么它們具有組合關(guān)系。
例如,“雨打梨花深閉門,忘了青春,誤了青春。賞心樂事共誰(shuí)論?”中的“忘了”和“誤了”都和“青春”存在組合關(guān)系,都是“動(dòng)詞+名詞”的動(dòng)賓結(jié)構(gòu)。
現(xiàn)在來尋找與“兵燓”存在語(yǔ)義關(guān)聯(lián)性的若干詞匯:
結(jié)果大都是跟“戰(zhàn)爭(zhēng)”、“創(chuàng)傷”相關(guān)的詞匯,語(yǔ)義關(guān)聯(lián)關(guān)系捕獲能力較強(qiáng),后續(xù)的熱門詩(shī)歌體裁挖掘任務(wù)也會(huì)用到詞嵌入模型的這個(gè)特性。
3. 度量詩(shī)歌詞匯之間的語(yǔ)義關(guān)聯(lián)關(guān)系 3.1 利用余弦相似性度量詩(shī)歌詞匯關(guān)聯(lián)度
度量詞匯之間的相似度或者關(guān)聯(lián)度,我們一般會(huì)使用兩個(gè)詞匯的詞向量之間的余弦值,詞向量之間的夾角越小,則余弦值越大,越接近1,則語(yǔ)義相關(guān)度越高;反之,相關(guān)度越低。
如下圖所示,展示了“甲兵”、“兵戈”和“烽火”之間的余弦相似度的可視化示意圖(點(diǎn)擊圖片可放大查看):
通過上述詞嵌入模型,similarity(“甲兵”,“兵戈”)= 0.75,similarity(“甲兵”,“烽火”) = 0.37,similarity(“兵戈”,“烽火”)= 0.48。則在這三個(gè)詞匯中,“甲兵”和“兵戈”之間的語(yǔ)義相關(guān)度最高,其次是“兵戈”和“烽火”,最次的“甲兵”和“烽火”。
這種給一個(gè)數(shù)值來識(shí)別詞匯相關(guān)不相關(guān)的方法優(yōu)點(diǎn)在于表達(dá)簡(jiǎn)潔、計(jì)算高效,比如接下來將要進(jìn)行的熱門詩(shī)歌題材發(fā)現(xiàn)/聚類。但是,這種詞匯相關(guān)度的計(jì)算沒有把詞匯之間的相關(guān)度的“因果路徑”直觀的反映出來。
那么,有沒有一種直觀的方法來展示詞匯之間的語(yǔ)義相關(guān)性,并且能看到為什么它們是存在這樣的關(guān)聯(lián)關(guān)系(也就是找到詞匯關(guān)聯(lián)路徑或者語(yǔ)義演變路徑)?
答案是——當(dāng)然有。
我們需要把這個(gè)找尋詞匯語(yǔ)義演變路徑的任務(wù)轉(zhuǎn)換成一個(gè)TSP問題(旅行商問題)。
3.2 利用A*算法找尋詞匯之間的語(yǔ)義演變路徑
TSP問題(Traveling Salesman Problem)又譯為旅行推銷員問題,是數(shù)學(xué)領(lǐng)域中著名問題之一。
假設(shè)有一個(gè)旅行商人要拜訪n個(gè)城市,他必須選擇所要走的路徑,路徑的限制是每個(gè)城市只能拜訪一次,而且最后要回到原來出發(fā)的城市。路徑的選擇目標(biāo),是要求得的路徑路程為所有路徑之中的最小值。
回到詞匯相關(guān)度度量的問題上來,如果我們能在上述訓(xùn)練得到的詞嵌入空間中找到兩個(gè)詞匯之間的最短“語(yǔ)義演變”線路,我們就能直觀的呈現(xiàn)出這2個(gè)詞匯之間產(chǎn)生語(yǔ)義關(guān)聯(lián)的“前因后果”。
要實(shí)現(xiàn)這個(gè)目的,有一個(gè)很棒的算法可以實(shí)現(xiàn) — A*算法(A* search algorithm)。
A*算法,也叫A*(A-Star)算法,是一種靜態(tài)路網(wǎng)中求解最短路徑最有效的直接搜索方法,也是解決許多搜索問題的有效算法。算法中的距離估算值與實(shí)際值越接近,最終搜索速度越快。
下圖中(點(diǎn)擊圖片可放大查看),網(wǎng)狀結(jié)果即是之前構(gòu)建的word2vec詞嵌入空間,節(jié)點(diǎn)是其中分布的詞匯,邊由字詞之間的余弦相關(guān)度構(gòu)成。
筆者基于上面的詞嵌入模型,結(jié)合A*算法來計(jì)算兩個(gè)詞匯之間的最短語(yǔ)義路徑,部分結(jié)果如下所示(點(diǎn)擊圖片可放大查看):
在上圖的5個(gè)詞匯對(duì)中,“漁樵”和“躬耕”之間的語(yǔ)義距離最短,也就是語(yǔ)義相關(guān)度最高,它們之間的語(yǔ)義演變路徑也就越短,中間只隔了2個(gè)詞匯;“燕市”和“寶婺”的語(yǔ)義距離最大,語(yǔ)義相關(guān)度最小,二者的語(yǔ)義演變路徑隔了12個(gè)詞匯。
可以看到,語(yǔ)義關(guān)聯(lián)性越弱(distance值越大)的兩個(gè)詞匯之間的最短語(yǔ)義演變路徑就越長(zhǎng),反之越短。所以語(yǔ)義距離與語(yǔ)義演變路徑長(zhǎng)度呈正相關(guān)關(guān)系,語(yǔ)義關(guān)聯(lián)度與語(yǔ)義演變路徑呈負(fù)相關(guān)關(guān)系。
有了前面的詞嵌入模型和語(yǔ)義相關(guān)度做“鋪墊”,后續(xù)的熱門詩(shī)歌題材發(fā)現(xiàn)就水到渠成了~
4. 用文本聚類進(jìn)行熱門詩(shī)歌題材發(fā)現(xiàn)
先開宗明義,在本文中,關(guān)于“詩(shī)歌題材”中的“題材”二字的定義,筆者認(rèn)為是:作為詩(shī)歌創(chuàng)作材料的社會(huì)生活的某些方面,亦特指詩(shī)人用以表現(xiàn)作品主題思想的素材,通常是指那些經(jīng)過集中、取舍、提煉而進(jìn)入作品的生活事件或生活現(xiàn)象。
一言以蔽之,寫景、摹物、抒情、記事、明理皆是“題材”。
因?yàn)槭孪炔恢肋@54萬(wàn)余首詩(shī)歌中到底會(huì)存在多少個(gè)題材,所以筆者選取的聚類算法沒有預(yù)設(shè)聚類數(shù)這個(gè)參數(shù),且兼顧運(yùn)行效率和節(jié)省計(jì)算資源,能利用前面訓(xùn)練好的word2vec詞嵌入模型和語(yǔ)義關(guān)聯(lián)度計(jì)算。
此時(shí),有個(gè)很好的選擇——社區(qū)發(fā)現(xiàn)算法中的Infomap。
4.1 基于社區(qū)發(fā)現(xiàn)的熱門詩(shī)歌題材發(fā)現(xiàn)
字詞是承載詩(shī)歌題材的最小語(yǔ)義單元,如“五云山上五云飛,遠(yuǎn)接群峰近拂堤。若問杭州何處好,此中聽得野鶯啼”,看到其中的“五云山”和“群峰”,則可以給該詩(shī)打上一個(gè)“山川巍峨”的題材標(biāo)簽。
由此,筆者接下來會(huì)基于社區(qū)發(fā)現(xiàn)算法,結(jié)合“詞匯簇群——詞匯簇群語(yǔ)義特征——題材標(biāo)簽”的思路來發(fā)現(xiàn)熱門詩(shī)歌題材。
先說說基于社區(qū)發(fā)現(xiàn)的大致原理。
我們知道,在社交網(wǎng)絡(luò)中,每個(gè)用戶相當(dāng)于每一個(gè)點(diǎn),用戶之間通過互相的關(guān)注關(guān)系構(gòu)成了整個(gè)線上人際網(wǎng)絡(luò)。
在這樣的網(wǎng)絡(luò)中,有的用戶之間的連接較為緊密,有的用戶之間的連接關(guān)系較為稀疏。其中連接較為緊密的部分可以被看成一個(gè)社區(qū),其內(nèi)部的節(jié)點(diǎn)之間有較為緊密的連接,而在兩個(gè)社區(qū)間則相對(duì)連接較為稀疏。
如何去劃分上述的社區(qū)便稱為社區(qū)發(fā)現(xiàn)的問題。
基于社區(qū)發(fā)現(xiàn)算法的話題聚類、發(fā)現(xiàn),在于挖掘詞匯語(yǔ)義網(wǎng)絡(luò)中居于頭部的大型“圈子”。
將詞匯擬人化,詞匯之間存在的相似度、關(guān)聯(lián)度可以視為詞匯之間的親密程度。那么,詩(shī)歌題材發(fā)現(xiàn)任務(wù)可以看做是找到不同成員組成的“圈子”,圈子的特性可以根據(jù)其中的成員特征來確定。
換言之,題材的名稱可以根據(jù)其中聚合的詞匯的內(nèi)涵來擬定,比如某個(gè)詞匯簇群中包含“衛(wèi)霍”、“甲兵”、“征戰(zhàn)”等詞匯,那么這個(gè)題材可以命名為“戰(zhàn)爭(zhēng)”。
示意圖如下所示(點(diǎn)擊圖片可放大查看):
運(yùn)行社區(qū)發(fā)現(xiàn)算法后,居于頭部的熱門題材詞匯簇群的可視化呈現(xiàn)如下(點(diǎn)擊圖片可放大查看):
其中,不同顏色表征不同的題材,字體大小代表其出現(xiàn)頻次,詞匯之間的距離遠(yuǎn)近表征其相關(guān)程度大小。
經(jīng)聚類得到634個(gè)題材,根據(jù)熱度(題材下轄詞匯數(shù)量)的降序排列呈現(xiàn)最終結(jié)果,如下所示(點(diǎn)擊圖片可放大查看):
4.2 甄別熱門詩(shī)歌題材
在這一環(huán)節(jié)中,筆者的在于根據(jù)一些詩(shī)歌領(lǐng)域知識(shí),找到上述運(yùn)行結(jié)果中熱門題材及其下轄的題材專屬性詞匯。
其中,“題材專屬性詞匯”的內(nèi)涵主要有以下兩點(diǎn):
- 詞匯不能再做進(jìn)一步切割,否則詞義會(huì)發(fā)生變化:如“丈夫”在古漢語(yǔ)中的意義是“男子漢”,在一個(gè)獨(dú)立的詞匯,若將其切割為“丈”和 “夫”,則原意喪失殆盡;
- 詞匯僅在一個(gè)題材中出現(xiàn),具有排他性:如“杖藜”只出現(xiàn)在“云游四方”這個(gè)題材中,不會(huì)出現(xiàn)在“金戈鐵馬”、“對(duì)酒當(dāng)歌”、“悼亡故人”等其他詩(shī)歌題材中。
根據(jù)筆者在前文中的定義,寫景、摹物、抒情、記事、明理皆是“題材”,這里的熱門題材甄別采取“抓大放小”的原則。
此外,雖然聚類出的結(jié)果較為理想,但還是存在些許噪音。比如,出現(xiàn)少許跟題材相關(guān)性不強(qiáng)的詞匯、題材區(qū)分度較低的詞匯、詞匯簇群中的詞匯過少(如低于10個(gè))等,這些都是需要被刨除掉的情況。
經(jīng)過筆者的仔細(xì)甄別,共甄別出23個(gè)熱門詩(shī)歌題材,分別是山川巍峨、田園躬耕、羈旅思鄉(xiāng)、金戈鐵馬、詠史懷古、詠物抒懷、贈(zèng)友送別、愛情閨怨、悼亡故人、樓船畫舫、花開荼蘼、對(duì)酒當(dāng)歌、騏驥駿馬、得道修仙、世事變遷、靜悟禪機(jī)、壯懷激烈、云游四方、黯然神傷、星宿璀璨、報(bào)效君恩、嚶嚶鳥語(yǔ)、蓑笠綸竿等。
當(dāng)然這些并不是全部的題材,限于筆者學(xué)識(shí),仍然有大量題材沒有發(fā)掘出來。枚舉部分結(jié)果如下(點(diǎn)擊圖片可放大查看):
在這一環(huán)節(jié),筆者根據(jù)對(duì)詩(shī)歌背景知識(shí)的了解,篩選出部分熱門詩(shī)歌題材,并形成題材對(duì)應(yīng)的關(guān)鍵詞規(guī)則體系,后續(xù)可用于對(duì)這54萬(wàn)余首詩(shī)歌進(jìn)行基于關(guān)鍵詞的詩(shī)歌題材分類。
值得注意的是,由于這一環(huán)節(jié)挑選關(guān)鍵詞過于苛刻,導(dǎo)致數(shù)量較少,規(guī)則體系不甚健全。
所以,在對(duì)詩(shī)歌語(yǔ)料庫(kù)進(jìn)行正式的詩(shī)歌題材分類前,筆者需要使用一些“小手段”,對(duì)上述熱門題材的關(guān)鍵詞規(guī)則進(jìn)行擴(kuò)充。
5. 根據(jù)線性分類器特征延伸關(guān)鍵詞
在這里,筆者先利用已得到的熱門題材分類體系及其關(guān)鍵詞規(guī)則給這54萬(wàn)余首詩(shī)歌打上題材標(biāo)簽,允許出現(xiàn)同一首詩(shī)歌命中多個(gè)標(biāo)簽的情形。除去其中未命中題材標(biāo)簽的數(shù)據(jù),共計(jì)443,589行,其中多數(shù)詩(shī)歌打上了2個(gè)及以上的題材標(biāo)簽。
部分結(jié)果如下所示(點(diǎn)擊圖片可放大查看):
有了帶標(biāo)簽的數(shù)據(jù)以后,筆者將多標(biāo)簽問題轉(zhuǎn)換為單標(biāo)簽問題,再將上述詩(shī)歌文本及其對(duì)應(yīng)的標(biāo)簽“喂進(jìn)”線性分類器,根據(jù)線性分類器的權(quán)重來找到每個(gè)類別下最具代表性的詞匯,也就是題材專有性詞匯。
這里選擇線性分類器而不是時(shí)下流行的深度學(xué)習(xí)分類器的原因就在于它的可解釋性,能讓我們清楚的知道是哪些顯著的特征(此處是詞匯)讓詩(shī)歌分到這個(gè)題材類別下的。
其大致原理如下圖所示(點(diǎn)擊圖片可放大查看):
在筆者測(cè)試的眾多線性分類器中,即RandomForestClassifier、Perceptron、PassiveAggressiveClassifier、MultinomialNB、RidgeClassifier、SGDClassifier,RidgeClassifier的區(qū)分效果最好,其F1_score為0.519,鑒于是詞袋模型,語(yǔ)義表示較為簡(jiǎn)單,且原本是多標(biāo)簽分類任務(wù),這個(gè)結(jié)果尚可接受。
基于RidgeClassifier的特征詞匯權(quán)重的降序排列結(jié)果,可得到上述23個(gè)熱門詩(shī)歌題材分類中的若干題材專有性詞匯,部分結(jié)果展示如下(點(diǎn)擊圖片可放大查看):
這樣,各個(gè)類別各取TOP500詞匯,經(jīng)過筆者的甄別和梳理后,各個(gè)題材關(guān)鍵詞規(guī)則得到了不同程度的擴(kuò)充,使得該分類標(biāo)簽體系可以較好的輔助完成詩(shī)歌題材多標(biāo)簽分類任務(wù),且后續(xù)可以結(jié)合分類結(jié)果做不斷的擴(kuò)充。
基于這個(gè)更加完善的詩(shī)歌題材分類體系,筆者運(yùn)行完之后得到58W+行數(shù)據(jù),在之前的基礎(chǔ)上增加了14W+行數(shù)據(jù),數(shù)據(jù)規(guī)模提升明顯!
至此,筆者第一個(gè)目標(biāo),即熱門詩(shī)歌題材標(biāo)簽語(yǔ)料庫(kù)構(gòu)建完畢,后續(xù)的文本挖掘任務(wù)可以在此基礎(chǔ)上進(jìn)行。
由分類標(biāo)簽及其分類模型反向推導(dǎo)其中最具代表性的特征詞匯,這是一個(gè)“數(shù)據(jù)—>規(guī)律”的歸納過程,很好的體現(xiàn)了數(shù)據(jù)驅(qū)動(dòng)思維;而模型將學(xué)習(xí)歸納得到的“經(jīng)驗(yàn)”推廣到新樣本的標(biāo)簽預(yù)測(cè)任務(wù)中,則體現(xiàn)了“規(guī)則—>數(shù)據(jù)”的演繹過程。
6. 基于分類標(biāo)簽的各類統(tǒng)計(jì)分析
針對(duì)上述58W+行數(shù)據(jù)構(gòu)成的詩(shī)歌題材語(yǔ)料庫(kù),將其中的題材分類標(biāo)簽和各類meta data(如風(fēng)格、朝代、作者等)做交叉分析,得到很多有意思的分析結(jié)果。
6.1 詩(shī)歌題材&風(fēng)格分析
將詩(shī)歌數(shù)據(jù)集的風(fēng)格標(biāo)簽和題材標(biāo)簽進(jìn)行交叉列表的成分占比分析,得到的結(jié)果如下(點(diǎn)擊圖片可放大查看):
其中,可以發(fā)現(xiàn)一些明顯的統(tǒng)計(jì)描述性特征:
- “贈(zèng)友送別”和“嚶嚶鳥語(yǔ)”這兩個(gè)題材在所有詩(shī)歌風(fēng)格中的占比都較高,是兩個(gè)較為“熱門”的題材;
- “悼亡故人”和“壯懷激烈”這兩個(gè)題材在所有詩(shī)歌風(fēng)格中的占比都較低,是兩個(gè)較為“冷門”的題材。
前面的詩(shī)歌題材分類是多標(biāo)簽分類,也就是可能會(huì)出現(xiàn)同一首詩(shī)歌對(duì)應(yīng)多個(gè)題材標(biāo)簽的情況。在這種情況下,我們可以進(jìn)行題材標(biāo)簽的共現(xiàn)分析,也就是多次同時(shí)出現(xiàn)的題材標(biāo)簽,它們之間會(huì)存在一定的關(guān)聯(lián)性。
現(xiàn)對(duì)標(biāo)簽共現(xiàn)的情況進(jìn)行建模,得到的結(jié)果可視化呈現(xiàn)如下所示(點(diǎn)擊圖片可放大查看):
上圖中,線條的粗細(xì)表示共現(xiàn)的頻次多寡,越粗表示共現(xiàn)頻次越高,反之越低。其中,有幾對(duì)標(biāo)簽對(duì)的共現(xiàn)頻率較高:
- 世事變遷 – 黯然神傷
- 羈旅思鄉(xiāng) – 世事變遷
- 詠史懷古 – 蓑笠綸竿
- 世事變遷 – 金戈鐵馬
- 對(duì)酒當(dāng)歌 – 世事變遷
- 悼亡故人 – 世事變遷
其中,“黯然神傷”和“世事變遷”的相關(guān)性最高,這個(gè)很好理解,畢竟“物是人事事休,欲語(yǔ)淚先流”,類似因感嘆逝事而傷感的詩(shī)句還有“人世幾回傷往事,山形依舊枕寒流”、“一生事業(yè)總成空,半世功名在夢(mèng)中”;“羈旅思鄉(xiāng)”和“世事變遷”之間的相關(guān)性第二高,此類的詩(shī)句有“少小離家老大回,鄉(xiāng)音無(wú)改鬢毛衰”、“去日兒童皆長(zhǎng)大,昔年親友半凋零”等。
此外,我們也可以發(fā)現(xiàn),在出現(xiàn)2個(gè)及兩個(gè)以上題材標(biāo)簽的詩(shī)歌中,“世事變遷”和其他題材同時(shí)出現(xiàn)的概率很大:世事變遷可能導(dǎo)致詩(shī)人黯然神傷;也可能是戰(zhàn)爭(zhēng)導(dǎo)致兵連禍結(jié),產(chǎn)生出“興,百姓苦,亡,百姓苦”的感慨;抑或是“桃李春風(fēng)一杯酒,江湖夜雨十年燈”的對(duì)酒當(dāng)歌。
6.3 詩(shī)歌題材趨勢(shì)分析
筆者將詩(shī)歌數(shù)據(jù)集中的朝代按照時(shí)間順序由遠(yuǎn)及近進(jìn)行排列,并合并其中年代接近的朝代,將其與23個(gè)熱門詩(shī)歌題材做(占比)交叉分析,得到下圖(點(diǎn)擊圖片可放大查看):
在上圖中,可以分別從橫向維度(朝代)和縱向(詩(shī)歌題材)維度來看。
6.3.1 從橫向維度上看
有兩個(gè)題材經(jīng)久不衰,即“贈(zèng)友送別”和“嚶嚶鳥語(yǔ)”。
古時(shí)候由于交通不便,通信極不發(fā)達(dá),親人朋友之間往往一別數(shù)載難以相見,所以古人特別看重離別。
離別之際,人們往往設(shè)酒餞別,折柳相送,有時(shí)還要吟詩(shī)話別,因此“贈(zèng)友送別”就成為古代文人吟詠的一個(gè)永恒的題材。
在這濃濃的感傷之外,往往還有其他寄寓:或用以激勵(lì)勸勉,如“莫愁前路無(wú)知己,天下誰(shuí)人不識(shí)君”;或用以抒發(fā)友情,如“桃花潭水深千尺,不及汪倫送我情”;或用于寄托詩(shī)人自己的理想抱負(fù),如“洛陽(yáng)親友如相問,一片冰心在玉壺”;甚至洋溢著積極向上的青春氣息,充滿希望和夢(mèng)想,如“海內(nèi)存知己,天涯若比鄰”。
“嚶嚶鳥語(yǔ)”題材的詩(shī)歌一般用“比興”的手法來寄寓自己的情感,筆者所了解的有兩類:
一是通過寫鳥語(yǔ)描摹詩(shī)人淡薄、回歸山野自然的平靜心境,這方面的詩(shī)王摩詰寫的最多,如“月出驚山鳥,時(shí)鳴春澗中”、“漠漠水田飛白鷺,陰陰夏木囀黃鸝”、“雉雊麥苗秀,蠶眠桑葉稀”等;
二是通過子規(guī)(杜鵑)、鴻雁等意象來表達(dá)詩(shī)人淡淡的憂傷,如“楊花落盡子規(guī)啼,聞道龍標(biāo)過五溪”的依依惜別之情、“兩邊山木合,終日子規(guī)啼”的思鄉(xiāng)歸家之情、“雁盡書難寄,愁多夢(mèng)不成”的思君心切。
6.3.2 從縱向維度上看
隋末唐初時(shí)期除了上述提及的兩大熱門題材外,關(guān)于“報(bào)效君恩”題材的詩(shī)歌占比較高。
彼時(shí)適逢華夏第三次大一統(tǒng),“貞觀之治”、“開元之治”這兩大盛世榮耀大唐在“朕即國(guó)家”的時(shí)代,廣大熱血青年渴望馳騁疆場(chǎng),建功立業(yè),報(bào)效國(guó)家。
此外,筆者也注意到,從金代到到當(dāng)代,“花開荼蘼”、“羈旅思鄉(xiāng)”、“金戈鐵馬”和“靜悟禪機(jī)”等題材就一直葆有較高的熱度,結(jié)合前面提及的2大經(jīng)久不衰的詩(shī)歌題材,這表明這段時(shí)期的詩(shī)歌創(chuàng)作方向具有一定的延續(xù)性。
從上表中,我們能有一些發(fā)現(xiàn),但如果想更獲取一些更深層次、潛藏在表層數(shù)據(jù)中的信息,我們還需要用高階的數(shù)據(jù)挖掘方法將其轉(zhuǎn)換一下。
在這里,筆者使用多元對(duì)應(yīng)分析的方法將其高維表示(也就是上面的21*23維的圖表)映射為二維表示(分解為2個(gè)二維矩陣,題材為23*2,朝代為21*2),從而更直觀的揭示出詩(shī)歌題材之間、詩(shī)歌題材與朝代之間的關(guān)聯(lián)關(guān)系,如下圖所示(點(diǎn)擊圖片可放大查看):
在上圖中,有兩類坐標(biāo)—外圍有半徑圓圈的紅色點(diǎn)是朝代的,“x”的詩(shī)歌題材的坐標(biāo)。
漢代的坐標(biāo)“孤懸海外”是因?yàn)閿?shù)據(jù)量過小,統(tǒng)計(jì)特征不甚明顯,故筆者在這里不做分析。
在圖的左上角,魏晉、南北朝、隋末唐初、隋這幾個(gè)朝代的圓圈重合度較高,說明它們的詩(shī)歌題材數(shù)量分布較為相似,聯(lián)想到這幾個(gè)朝代前后相繼,這又一次體現(xiàn)了詩(shī)歌創(chuàng)作具有時(shí)代延續(xù)性的特征。
同樣,唐代及其以后的圓圈呈“扎堆狀”,標(biāo)明它們的詩(shī)歌寫作題材的數(shù)量分布較為相似,反映出唐以降的朝代在詩(shī)歌創(chuàng)作題材方面的差異度較小,題材創(chuàng)作方向的創(chuàng)新性不高。究其原因,在于詩(shī)歌在唐代已經(jīng)進(jìn)化到“究極狀態(tài)”:
唐詩(shī)的題材和意境也幾乎無(wú)所不包,修辭手段的運(yùn)用已達(dá)到爐火純青的程度。
它不僅繼承了漢魏民歌、樂府傳統(tǒng),并且大大發(fā)展了歌行體的樣式;不僅繼承了前代的五、七言古詩(shī),并且發(fā)展為敘事言情的長(zhǎng)篇巨制;不僅擴(kuò)展了五言、七言形式的運(yùn)用,還創(chuàng)造了風(fēng)格特別優(yōu)美整齊的近體詩(shī)。
近體詩(shī)是當(dāng)時(shí)的新體詩(shī),它的創(chuàng)造和成熟,是唐代詩(shī)歌發(fā)展史上的一件大事。它把我國(guó)古曲詩(shī)歌的音節(jié)和諧、文字精煉的藝術(shù)特色,推到前所未有的高度,為古代抒情詩(shī)找到一個(gè)最典型的形式,至今還特別為人民所喜聞樂見。
唐詩(shī)代表了中華詩(shī)歌的最高成就,無(wú)疑是中華以及世界文壇上濃墨重彩的筆觸!這對(duì)于想要另辟新境的宋代詩(shī)人來說無(wú)疑是巨大的壓力。正如王安石和魯迅所言:
7. 通過GPT-2生成表達(dá)流暢的詩(shī)歌“世間好語(yǔ)言,已被老杜道盡;世間俗語(yǔ)言,已被樂天道盡”,
“我以為一切好詩(shī),到唐朝已被做完,此后倘非翻出如來掌心之‘齊天大圣’,大可不必再動(dòng)手了”。
從某種程度上講,詩(shī)歌生成是從另一維度對(duì)詩(shī)歌進(jìn)行深度分析。
生成什么詩(shī)歌,跟詩(shī)歌生成模型“吃下去”什么是息息相關(guān)的。詩(shī)歌生成模型的“生成”不是“無(wú)源之水”、“無(wú)本之木”,它是在充分學(xué)習(xí)和吸收前人的若干詩(shī)作后,習(xí)得了一定的“創(chuàng)作手法”,因而能生成效果尚可的詩(shī)歌。
同時(shí),我們也能從生成的結(jié)果中發(fā)現(xiàn)詩(shī)歌創(chuàng)作的一些規(guī)律,做一些深入探究。
7.1 詩(shī)歌生成示例分析
在這一部分,筆者用于訓(xùn)練詩(shī)歌生成模型的語(yǔ)料庫(kù)是基于熱門題材標(biāo)簽體系得到的帶有題材標(biāo)簽(目前是23個(gè))的律詩(shī)(七言和五言)和絕句(七言和五言),它們都滿足詩(shī)歌的結(jié)構(gòu)性、音調(diào)性和語(yǔ)義性的要求。
這里筆者采用的是GPT2(Generative Pre-Training 2nd),它是一個(gè)無(wú)監(jiān)督語(yǔ)言模型,能夠生成具有連貫性的文本段落,在許多語(yǔ)言建模任務(wù)基準(zhǔn)中取得了領(lǐng)先級(jí)表現(xiàn)(數(shù)據(jù)量級(jí)和參數(shù)量級(jí)擺在那里,當(dāng)然跟它的后浪GPT3不能比)。
而且該模型在沒有任務(wù)特定訓(xùn)練的情況下,能夠做到初步的閱讀理解、機(jī)器翻譯、問答和自動(dòng)摘要。
其核心思想可以總結(jié)為“給定越多參數(shù)以及越多樣、越大量的文本,無(wú)監(jiān)督訓(xùn)練一個(gè)語(yǔ)言模型或許就可讓該模型具備更強(qiáng)的自然語(yǔ)言理解能力,并在沒有任何監(jiān)督的情況下開始學(xué)會(huì)解決不同類型的 NLP 任務(wù)”。
在文本的詩(shī)歌生成任務(wù)中,筆者從零到一訓(xùn)練一個(gè)詩(shī)歌生成的GPT2模型,力求讓該模型學(xué)習(xí)到詩(shī)歌數(shù)據(jù)集中的各類顯性特征(題材與詩(shī)歌的關(guān)系、詩(shī)歌與風(fēng)格的關(guān)系、藏頭字和詩(shī)歌的關(guān)系等)和隱性特征(主要是詩(shī)歌的韻律),其大致原理如下圖所示:
相比3年前筆者寫《用文本挖掘剖析近5萬(wàn)首》
時(shí)用的LSTM詩(shī)歌生成模型,GPT2模型進(jìn)步巨大:
- 生成的詩(shī)歌更加通順,每一聯(lián)的出句和入句的銜接也顯得更為自然;
- 能從全局(即整首詩(shī))著眼,記憶能力好,考慮上下文語(yǔ)境,前后生成的詩(shī)句緊密關(guān)聯(lián),不會(huì)出現(xiàn)“跳題材”的情況;
- 能學(xué)習(xí)到詩(shī)歌數(shù)據(jù)中較為隱性的特征,如押韻、平仄、對(duì)仗、疑問語(yǔ)氣等;
- 因擁有上述3個(gè)優(yōu)勢(shì),生成的詩(shī)歌“廢品率”大大降低。
下面,筆者將“花式”呈現(xiàn)GPT2的詩(shī)歌生成能力:
1)生成的詩(shī)歌可能會(huì)和前人寫的詩(shī)句有一定的相關(guān)性,但是GPT2模型可以進(jìn)行“魔改”,很難看出直接的“抄襲對(duì)象”。
例如:以下由GPT2模型生成的七言律詩(shī),每一聯(lián)都能在語(yǔ)料庫(kù)中找到語(yǔ)義最為接近的一句:
戰(zhàn)鼙傳響徹神州,萬(wàn)里中原一白頭。兵后英雄誰(shuí)不死,眼前豪杰已無(wú)憂。乾坤納納歸天地,歲月悠悠老斗牛。安得扁舟成獨(dú)往,五湖煙浪是東流。
2)很多生成的詩(shī)歌能較好的學(xué)習(xí)到韻律,比如符合《平水韻》的用韻規(guī)則:
上一個(gè)示例就是《平水韻》中七律平起(首句入韻)的一個(gè)樣例:
【平仄】
平平仄仄仄平平(韻)
仄仄平平仄仄平(韻)
仄仄平平平仄仄
平平仄仄仄平平(韻)
平平仄仄平平仄
仄仄平平仄仄平(韻)
仄仄平平平仄仄
平平仄仄仄平平(韻)
【押韻】
戰(zhàn)鼙傳響徹神州【州:十一尤】 押韻
萬(wàn)里中原一白頭【頭:十一尤】 押韻
兵后英雄誰(shuí)不死
眼前豪杰已無(wú)憂【憂:十一尤】 押韻
乾坤納納歸天地
歲月悠悠老斗!九#菏挥取 押韻
安得扁舟成獨(dú)往
五湖煙浪是東流【流:十一尤】 押韻
另外再看兩個(gè)case:
即使一些詩(shī)歌不是嚴(yán)格的用韻(即一首詩(shī)只能押一個(gè)韻),也會(huì)自動(dòng)采用鄰韻的方式來緩解韻律失和的問題。
3)對(duì)人張若虛的樂府舊題《春江花月夜》(因?yàn)槭菢犯?shī),字?jǐn)?shù)較多,未參與詩(shī)歌生成模型的訓(xùn)練)中的若干詩(shī)句,采用對(duì)對(duì)子的方法生成下聯(lián),毫無(wú)違和感:
【上聯(lián)】春江潮水連海平,海上明月共潮生 【下聯(lián)】古塔風(fēng)云繞山青,峰頂彩霞共靄暉
【上聯(lián)】滟滟隨波千萬(wàn)里,何處春江無(wú)月明 【下聯(lián)】幽幽如幻五十年,此間塵世有風(fēng)流
【上聯(lián)】江流宛轉(zhuǎn)繞芳甸,月照花林皆似霰 【下聯(lián)】山勢(shì)氤氳浮翠靄,風(fēng)梳楊柳欲飛煙
【上聯(lián)】斜月沉沉藏海霧,碣石瀟湘無(wú)限路 【下聯(lián)】春江漫卷漾煙雨,長(zhǎng)河日夜有緣人
【上聯(lián)】不知江月待何人,但見長(zhǎng)江送流水 【下聯(lián)】只向漁家尋舊跡,試問何處答耕桑
【上聯(lián)】白云一片去悠悠,青楓浦上不勝愁 【下聯(lián)】碧水千層橫漠漠,赤雁南來正飛歌
【上聯(lián)】鴻雁長(zhǎng)飛光不度,魚龍潛躍水成文 【下聯(lián)】漁家小住月相隨,鷗鷺往來船載歌
【上聯(lián)】此時(shí)相望不相聞,愿逐月華流照君 【下聯(lián)】何處覓人猶有約?欲邀仙子去還家
【上聯(lián)】江畔何人初見月?江月何年初照人 【下聯(lián)】天下有地可藏龍,海風(fēng)哪處可觀心
【上聯(lián)】江天一色無(wú)纖塵,皎皎空中孤月輪 【下聯(lián)】楊柳千絲猶有夢(mèng),蒙蒙江上滿船燈
4)嵌入筆者所在的公司名稱—“達(dá)觀數(shù)據(jù)”作為藏頭字,分別以“山川巍峨”、“得道修仙”、“田園躬耕”為題材,生成三首七言律詩(shī):
《其一》
達(dá)摩七十二峰高,天下英雄氣郁陶。
觀海三山云縹緲,登樓千仞勢(shì)岧峣。
數(shù)莖白發(fā)身長(zhǎng)健,百尺丹梯路不遙。
據(jù)險(xiǎn)未能窮勝覽,憑欄徙倚思飄飖。
《其二》
達(dá)者由來本自然,人間何處不神仙。
觀空已悟三千界,閱世方知二十年。
數(shù)點(diǎn)青山隨杖屨,一行白鳥下云煙。
據(jù)鞍更欲凌風(fēng)去,回首孤城落照邊。
《其三》
達(dá)摩萬(wàn)象付評(píng)量,造化從來自一方。
觀物有時(shí)開口笑,看人無(wú)處著心忙。
數(shù)間茅屋臨流水,幾個(gè)漁舟傍夕陽(yáng)。
據(jù)得此中真面目,乾坤何地不滄桑。
5)在訓(xùn)練和生成式引入更多的詩(shī)歌標(biāo)簽信息,如風(fēng)格、題材和藏頭字,引導(dǎo)GPT2朝期望的方向的生成詩(shī)歌。
訓(xùn)練好模型后,筆者輸入詩(shī)歌風(fēng)格(七言絕句、七言律詩(shī))、藏頭字(滄海月明)和題材(金戈忒嗎、世事變遷、靜悟禪機(jī)等),生成如下詩(shī)歌:
【格式】七言絕句 【藏頭字】戢戈為武 【主題】金戈鐵馬
戢兵十萬(wàn)羽林郎,戈壁縱橫百戰(zhàn)場(chǎng)。為報(bào)將軍能破敵,武功原是好封疆。
【格式】七言律詩(shī) 【藏頭字】滄海月明 【主題】金戈鐵馬
滄海干戈一戰(zhàn)場(chǎng),西風(fēng)吹淚灑衣裳。海門萬(wàn)里烽煙息,天地千秋雨露涼。月下樓船喧鼓角,夜深笳鼓動(dòng)旌旗。明年此夕登臨處,獨(dú)倚闌干對(duì)夕陽(yáng)。
【格式】七言律詩(shī) 【藏頭字】滄海月明 【主題】金戈鐵馬
滄波渺渺接長(zhǎng)河,極目蒼茫感慨多。海上樓船三百里,云間樓閣五千過。月明古渡漁歌起,秋入荒城鼓角和。明日相逢又相別,不堪回首淚滂沱。
【格式】七言律詩(shī) 【藏頭字】滄海月明 【主題】金戈鐵馬
滄波渺渺白鷗群,極目蒼茫萬(wàn)里云。海上樓船三萬(wàn)里,天邊烽火一孤墳。月明古渡漁歌起,霜落空山雁影分。明日相逢又相別,故鄉(xiāng)回首淚紛紛。
【格式】七言律詩(shī) 【藏頭字】滄海月明 【主題】世事變遷
滄桑劫火幾興亡,回首滄桑感慨傷。海上樓臺(tái)空劫火,人間禾黍自悲涼。月明古渡漁歌起,風(fēng)靜寒潮雁影長(zhǎng)。明日相逢又相別,故鄉(xiāng)回首一凄涼。
【格式】七言律詩(shī) 【藏頭字】滄海月明 【主題】靜悟禪機(jī)
滄浪萬(wàn)頃白鷗群,此地曾經(jīng)此地分。海上樓臺(tái)今夜月,山中樓閣幾秋云。月明古寺僧初定,潮落空江雁正聞。明日相逢又相別,不知何處是離群。
上述生成結(jié)果,平仄符合,押韻亦可,詩(shī)意也不錯(cuò)。不敢說很完美,但至少很多人寫不出如此觀感的詩(shī)歌。
此外,上述按題材生成的結(jié)果,筆者進(jìn)行了大量的題材詩(shī)歌生成測(cè)試,結(jié)果表明詩(shī)歌題材和生成詩(shī)歌之間的關(guān)聯(lián)性較高,這也從側(cè)面驗(yàn)證了筆者上述構(gòu)建的詩(shī)歌題材語(yǔ)料庫(kù)具有一定的合理性。
此外,筆者還通過生成的詩(shī)句發(fā)現(xiàn)了古今詩(shī)歌表達(dá)方面的一些差異。例如:筆者以“金戈鐵馬”作為生成題材,分別用毛主席《人民解放軍占領(lǐng)南京》和陳老總的《梅嶺三章》中的首聯(lián)打頭,各生成9首詩(shī)歌,結(jié)果如下(點(diǎn)擊可查看大圖):
上面兩張圖中占據(jù)中間C位的是原詩(shī)歌,其余的詩(shī)歌由毛主席和陳老總詩(shī)歌的首聯(lián)“引導(dǎo)”而成,基本含有“金戈鐵馬”相關(guān)的意象,題材貼合度較高,大都跟征戰(zhàn)、戌邊、殺敵保國(guó)有關(guān),比如:
聞道漢家多戰(zhàn)伐,將軍今日重南邦。
旌旗影動(dòng)三軍肅,刁斗聲傳五夜長(zhǎng)。
中原戰(zhàn)血三千里,南國(guó)英魂一斷腸。
西風(fēng)鼓角寒吹雁,南國(guó)旌旗夜渡河。
然而,可能跟學(xué)習(xí)了大量封建時(shí)代的詩(shī)歌有關(guān),這些生成的詩(shī)歌到末尾大都是一個(gè)悲情的基調(diào),略顯消極,如以下幾句:
從此邊城多戰(zhàn)伐,不須笳鼓更悲涼。
一路寒聲送歸雁,秋深不見客愁窗。
我欲從君尋舊隱,扁舟重訪草堂堂。
獨(dú)有英靈知此意,不堪回首淚沾裳。
回首故園歸未得,西風(fēng)蕭瑟?jiǎng)颖琛?/p>
回首不堪惆悵事,夕陽(yáng)芳草滿汀波。
上述生成的詩(shī)句缺乏革命主義的樂觀豪情,這是封建時(shí)代的詩(shī)歌不具備的特質(zhì),但這恰好毛主席和陳老總這兩首詩(shī)歌的與眾不同之處。且看這兩句:
天若有情天亦老,人間正道是滄桑。
投身革命即為家,血雨腥風(fēng)應(yīng)有涯。
“文章合為時(shí)而著,歌詩(shī)合為事而作”,上述的結(jié)果也恰恰從側(cè)面體現(xiàn)了詩(shī)歌創(chuàng)作具有時(shí)代感和現(xiàn)實(shí)感,盡管是寫同一題材,但由于詩(shī)人的人生軌跡和面臨的時(shí)代背景不一樣,胸中所內(nèi)含的氣象也大不相同。
上述由GPT2生成的詩(shī)歌看起來都還不錯(cuò),很多到了以假亂真的地步,這種情況下,我們?cè)撊绾握鐒e出其中哪些是人寫的,哪些是機(jī)器寫的?
機(jī)器寫作詩(shī)歌歸根到底還是一個(gè)統(tǒng)計(jì)學(xué)問題,“解鈴還須系鈴人”,甄別“真?zhèn)巍钡氖虑檫得統(tǒng)計(jì)學(xué)來解決。
7.2 人機(jī)詩(shī)歌創(chuàng)作的差異比較
詩(shī)歌生成建模大致的原理是:通過大量詩(shī)歌語(yǔ)料,詩(shī)歌生成模型能學(xué)習(xí)到任一詩(shī)句中相鄰的字詞之間的依賴關(guān)系。
比如出現(xiàn)一個(gè)“漠”,GPT2按照學(xué)習(xí)到的經(jīng)驗(yàn),會(huì)猜測(cè)接下來會(huì)出現(xiàn)哪個(gè)字,這些字都會(huì)以概率的形式“存放”在GPT2模型的“記憶”之中,如:
“漠”:0.1205,
“北”:0.0914,
“然”:0.0121,
“視”:0.00124,
一般情況下,機(jī)器“作詩(shī)”時(shí)會(huì)選擇過往出現(xiàn)幾率最高的字,以此類推,直到碰到“終止符”才結(jié)束,逐漸生成整首詩(shī)歌。
這是最簡(jiǎn)單的情形,生成的效果也就非常一般,很多時(shí)候是文理不通。
為了保證生成效果,一般會(huì)(同時(shí))用到一些復(fù)雜的生成策略,如Beam Search、Top-k sampling、Top-p sampling(NUCLEUS SAMPLING,核采樣)、Repetition_penalty(對(duì)重復(fù)性進(jìn)行懲罰)、Length_penalty(對(duì)生成過長(zhǎng)的詩(shī)句進(jìn)行懲罰)等。
這樣會(huì)兼顧詩(shī)歌生成的一些其他因素,如流暢度、豐富度、一致性等,詩(shī)歌生成的效果也能得到較大的提升。
筆者基于哈佛大學(xué)的GLTR( Statistical Detection and Visualization of Generated Text)來探究下機(jī)器和人作詩(shī)時(shí)的一些差異,該工具輸入的是詩(shī)歌,輸出的是機(jī)器和人作的詩(shī)歌的字出現(xiàn)概率分布統(tǒng)計(jì),我們從中可以發(fā)現(xiàn)詩(shī)歌“煉字”的一些奧秘。
筆者試舉一例:
在上圖中,色塊的顏色代表的是字所在的概率區(qū)間:紅色代表出現(xiàn)概率TOP10的字,黃色的是TOP100,綠色的是TOP1000,紫色的是TOP10000。
從結(jié)果中,我們可以看到機(jī)器作詩(shī)時(shí),紅色和黃色的字概率分布區(qū)間占比較大,逐字生成時(shí)一般是從頭部的字概率分布中來取,從而導(dǎo)致會(huì)詩(shī)句生成較為常見的表達(dá)。
人創(chuàng)作詩(shī)歌時(shí),各顏色代表的字概率分布區(qū)間占比較為接近,至少是差異不大,最終導(dǎo)致詩(shī)歌的表達(dá)千變?nèi)f化,不落俗套。
古時(shí)詩(shī)人作詩(shī),重在“煉字”。
煉字,指錘煉詞語(yǔ),指詩(shī)人經(jīng)過反復(fù)琢磨,從詞匯寶庫(kù)中挑選出最貼切、最精確、最形象生動(dòng)的詞語(yǔ)來描摹事物或表情達(dá)意。從這個(gè)角度來看,具有統(tǒng)計(jì)學(xué)意義的“選字”策略基本不可取——不是詞不達(dá)意就是容易落“俗套”。
比如,陶淵明的那句“采菊東籬下,悠然見南山”中“見”換成“望”就不好。
雖然按從詩(shī)歌數(shù)據(jù)集學(xué)到的概率來講,“望”在過往出現(xiàn)的概率遠(yuǎn)大于“見”,但“見”通“現(xiàn)”,有“無(wú)意中看見”的含義,標(biāo)明作者是不經(jīng)意間抬起頭來看見南山,表達(dá)了整個(gè)詩(shī)句中那種悠然自得的感觸。
好像在不經(jīng)意間看到了山中美景,符合“山氣日夕佳,飛鳥相與還”這種非常自然的、非常率真的意境,而“望”則顯得有些生硬。
8. 將詩(shī)歌翻譯成通俗易懂的白話文
詩(shī)歌翻譯,也就是將文言文色彩濃重、一般人不易看懂的詩(shī)歌翻譯成現(xiàn)代人容易理解的白話文。
筆者此處用到的模型是兩個(gè)BERT構(gòu)成的Encoder-Decoder,目標(biāo)是輸入一句或者一首詩(shī)歌,生成相應(yīng)的白話文翻譯。
考慮到古現(xiàn)代漢語(yǔ)存在大量詞匯方面的語(yǔ)義延續(xù)性,不像中英互譯這樣,源語(yǔ)句和目標(biāo)語(yǔ)句之間的語(yǔ)義和語(yǔ)法結(jié)構(gòu)差異極大,它們會(huì)有很多共享詞匯,所以訓(xùn)練的語(yǔ)料數(shù)量可以適當(dāng)少些。
詩(shī)歌翻譯模型會(huì)從大量的翻譯語(yǔ)句對(duì)中學(xué)習(xí)到它們之間的語(yǔ)義對(duì)應(yīng)關(guān)系,而且是以較為流暢(較理想的情況下)的形式進(jìn)行輸出。
以下是簡(jiǎn)要原理圖:
筆者編寫爬蟲采集了某詩(shī)歌分享網(wǎng)站上的若干詩(shī)歌及其翻譯數(shù)據(jù),經(jīng)清洗后,得到3萬(wàn)條訓(xùn)練語(yǔ)句。
部分訓(xùn)練數(shù)據(jù)如下表所示:
訓(xùn)練模型后,筆者選取部分未出現(xiàn)在訓(xùn)練集中的語(yǔ)句作為文本翻譯的示例,部分示例如下:
【詞】問君何事輕離別,一年能幾團(tuán)圓月。楊柳乍如絲,故園春盡時(shí)。(菩薩蠻·問君何事輕離別,清,納蘭性德)
【翻譯1】你在什么時(shí)候才能夠回家?只有那美麗的桃花已經(jīng)過去了。
【翻譯2】請(qǐng)你問我為什么這樣的輕易消失呢?一年里正是三次月下的清明之夜。楊柳剛像絲絲般柔軟,就好似在家鄉(xiāng)春天已經(jīng)快要過去了。
【詞】山抹微云,天粘衰草,畫角聲斷譙門。水流明月,風(fēng)送殘花,詩(shī)心韻動(dòng)江樓。(《滿庭芳·山抹微云》,前一句作者是宋,秦觀,后一句作者是GPT2)
【翻譯】遠(yuǎn)處的山峰上是一片輕薄的薄云,在天空中飄散著;烏鴉點(diǎn)綴在枯草叢里,號(hào)角聲響徹四周。明月照耀下清輝的銀河映射向西邊,傳來陣陣寒梅花的音樂,這時(shí)節(jié)讓人肝腸寸斷。
【對(duì)聯(lián)】帝道真如,如今都成過去事。民心所向,自古都是往來人。(楊度自挽聯(lián),上聯(lián)作者是民國(guó),楊度,下一聯(lián)作者是GPT2)
【翻譯】京城大道實(shí)在了解我的知識(shí),就像當(dāng)年地方一樣經(jīng)歷過了。百姓心里依舊保護(hù)著百姓生活世界,自古以來都是從前人們來往的人間吧!
【詩(shī)句】萬(wàn)戶千門入建章,金繩界路柳絲黃。和風(fēng)偏度樂聲細(xì),晴日自隨宮泉長(zhǎng)。(《宮詞·萬(wàn)戶千門入建章》,宋,王仲修)
【翻譯】皇上的宅院已經(jīng)關(guān)閉了建立功名利祿,皇家大道路兩旁的楊柳依舊是那樣的嫩芽。春天來到這里,宮殿高聳入云霄,宮殿中傳出一陣清脆婉轉(zhuǎn)的流水。
【詩(shī)句】沅湘兩水清且淺,林花夾岸灘聲激。洞庭浩渺通長(zhǎng)江,春來水漲連天碧。(《少年湖南歌》,民國(guó),楊度)
【翻譯1】沅江兩岸的流淌在這里是多么高遠(yuǎn)呢?樹叢生的野草和小洲環(huán)繞著江面,河畔的波濤好像是那樣寬闊無(wú)際;春天來了時(shí)節(jié),水面上漲起伏著一片青色。
【翻譯2】沅江兩岸的流淌著一片清澈的江水清澈,茂密的樹林環(huán)繞在河岸上。洞庭湖廣闊無(wú)際,春水滔滔不斷地流向遠(yuǎn)方。
【翻譯3】瀟湘兩岸的流淌著一片清澈的水,樹林間的花瓣隨風(fēng)飄蕩。洞庭湖廣闊無(wú)際,波濤洶涌,波光粼粼,好像是天空相接。
【翻譯4】沅水湘江清澈見底,水波蕩漾,岸邊樹木繁茂如淺的流動(dòng)。洞庭湖浩淼遠(yuǎn)望去,水天相接處連成一片。
從結(jié)果上來看,3萬(wàn)來句的效果還馬馬虎虎,很多翻譯不是直譯過來的,更傾向于“意譯”,機(jī)器翻譯的時(shí)候會(huì)“腦補(bǔ)”一些場(chǎng)景,如對(duì)“山抹微云……詩(shī)心韻動(dòng)江樓”的翻譯,機(jī)器能夠“揣摩”出“這時(shí)節(jié)讓人肝腸寸斷”,開始“有內(nèi)味”了。
如果采用一些手段擴(kuò)充下語(yǔ)料,如將整首詩(shī)歌和對(duì)應(yīng)翻譯逐句拆分、對(duì)白話文部分進(jìn)行文本增強(qiáng)(同義詞替換、隨機(jī)插入、隨機(jī)交換等)和將意譯改為直譯等,訓(xùn)練處的模型可能會(huì)更強(qiáng)大些,翻譯效果能提升不少。
9. 結(jié)語(yǔ)
通過上述詩(shī)歌語(yǔ)料庫(kù)分析流程,筆者想說一下對(duì)于(文本)數(shù)據(jù)挖掘的一些看法:
所謂挖掘,通常帶有“發(fā)現(xiàn)、尋找、歸納、提煉”等內(nèi)涵,既然需要去發(fā)現(xiàn)和提煉。那么,所要找尋的內(nèi)容往往都不是顯而易見的,而是“隱蔽”和“藏匿”于文本之中,或者是人無(wú)法直接在大范圍內(nèi)發(fā)現(xiàn)和歸納出來的。
如果要抽絲剝繭,需要結(jié)合領(lǐng)域知識(shí)(如文中的詩(shī)歌常識(shí)),運(yùn)用多種分析手段(如文中的各類NLU和NLG方法),有時(shí)甚至需要逆向思維(如文中的詩(shī)歌生成),且各類分析最好是一個(gè)前后相繼、互為補(bǔ)充有機(jī)整體,這樣才能以最高的效率來完成文本數(shù)據(jù)的探索任務(wù)。
參考資料:
- 《數(shù)學(xué)與文學(xué)的共鳴》,丘成桐
- 《迦陵說詩(shī).嘉瑩說詩(shī)講稿》, 葉嘉瑩
- 《文本數(shù)據(jù)管理與分析》,翟成祥
- 《文本數(shù)據(jù)挖掘》,宗成慶
- 《古代漢語(yǔ)基礎(chǔ)》,吳鴻清
- 《詩(shī)詞格律》,王力
- 《語(yǔ)言的科學(xué)》,諾姆.喬姆斯基
- 《現(xiàn)代漢語(yǔ)詞匯學(xué)教程》,周薦
- 《語(yǔ)言的認(rèn)知研究和計(jì)算分析》,袁疏林
- 《自然語(yǔ)言處理的認(rèn)知方法》,Bernadette Sharp
- 《自然語(yǔ)言處理入門》,何晗
- https://github.com/Werneror/Poetry
- https://github.com/kpu/kenlm
- https://github.com/jiaeyan/Jiayan
- 《Catching a Unicorn with GLTR: A tool to detect automatically generated text》,http://gltr.io
- 《Better Language Models and Their Implications》,https://openai.com/blog/better-language-models/
- 《自由度+凝固度+統(tǒng)計(jì)的新詞發(fā)現(xiàn)》,https://blog.csdn.net/qq_39006282/article/details/91357603
蘇格蘭折耳喵(微信公眾號(hào):Social Listening與文本挖掘),人人都是產(chǎn)品經(jīng)理專欄作家,數(shù)據(jù)PM一只,擅長(zhǎng)數(shù)據(jù)分析和可視化表達(dá),熱衷于用數(shù)據(jù)發(fā)現(xiàn)洞察,指導(dǎo)實(shí)踐。
題圖來自 Pexels,基于 CC0 協(xié)議
發(fā)表評(píng)論 評(píng)論 (2 個(gè)評(píng)論)