摘? 要:文本生成技術(shù)在近年開(kāi)始深受研究者的青睞,其中就包括了古詩(shī)和歌詞的自動(dòng)生成。文章設(shè)計(jì)了一個(gè)基于深度學(xué)習(xí)的歌詞與古詩(shī)自動(dòng)生成系統(tǒng)。生成過(guò)程主要包括了數(shù)據(jù)預(yù)處理、歌詞和古詩(shī)生成模型搭建、歌詞和古詩(shī)生成模型訓(xùn)練、使用訓(xùn)練好的模型生成歌詞和古詩(shī)。通過(guò)測(cè)試,該歌詞和古詩(shī)生成系統(tǒng)比傳統(tǒng)的機(jī)器寫(xiě)作系統(tǒng)效果更好,語(yǔ)義更準(zhǔn)確。
關(guān)鍵詞:自動(dòng)生成;深度學(xué)習(xí);訓(xùn)練模型
中圖分類(lèi)號(hào):TP391.41 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2021)01-0025-03
Design of Automatic Generation System of Lyrics and Ancient Poems
Based on Deep Learning
PENG Tao
(Jiangxi Youth Vocational College,Nanchang? 330045,China)
Abstract:Text generation technology has been deeply loved by researchers in recent years,including the automatic generation of ancient poems and lyrics. This paper designs an automatic generation system of lyrics and ancient poems based on deep learning. The generation process mainly includes data preprocessing,lyrics and ancient poems generation model building,lyrics and ancient poems generation model training,using the trained model to generate lyrics and ancient poems. Through the test,the lyrics and ancient poems generation system has better effect and more accurate semantics than the traditional machine writing system.
Keywords:automatic generation;deep learning;training model
0? 引? 言
古詩(shī)作為中國(guó)古代文學(xué)藝術(shù)的結(jié)晶,是中華民族文化藝術(shù)寶庫(kù)中非常重要的部分。那些歷久彌新的古詩(shī)展示了古代文人墨客的多彩生活,更包含了中國(guó)國(guó)民精神的全部符碼。歌詞作為音樂(lè)的核心,美妙的音樂(lè)必然少不了高品質(zhì)的歌詞,所以歌詞和古詩(shī)自動(dòng)生成技術(shù)的研究是非常有意義的。筆者在教授計(jì)算機(jī)課程過(guò)程中,發(fā)現(xiàn)班上一些學(xué)生對(duì)歌詞和古詩(shī)也很感興趣,在業(yè)余時(shí)間,就帶領(lǐng)這些學(xué)生利用所學(xué)的深度學(xué)習(xí)知識(shí)設(shè)計(jì)開(kāi)發(fā)了歌詞和古詩(shī)自動(dòng)生成系統(tǒng),該系統(tǒng)已經(jīng)進(jìn)入測(cè)試階段,目前能夠較好地完成歌詞和古詩(shī)自動(dòng)生成。該系統(tǒng)的開(kāi)發(fā),不但將所學(xué)知識(shí)應(yīng)用于實(shí)踐,讓學(xué)生體會(huì)到所學(xué)知識(shí)的用武之地,還陶冶學(xué)生了情操,積極響應(yīng)國(guó)家提出的課程思政教育,積極推進(jìn)素質(zhì)教育。
1? 系統(tǒng)功能概述
基于深度學(xué)習(xí)的歌詞和古詩(shī)自動(dòng)生成系統(tǒng)是通過(guò)神經(jīng)網(wǎng)絡(luò)對(duì)數(shù)據(jù)集進(jìn)行學(xué)習(xí)和語(yǔ)義分析后訓(xùn)練出模型,再利用模型和GUI圖形界面為用戶(hù)提供古詩(shī)和歌詞生成服務(wù)的系統(tǒng)。對(duì)于歌詞生成來(lái)說(shuō),用戶(hù)需要先輸入10個(gè)字作為歌詞的前奏,系統(tǒng)會(huì)根據(jù)前10個(gè)字預(yù)測(cè)下一個(gè)字,以此類(lèi)推,當(dāng)然系統(tǒng)會(huì)自動(dòng)分析一句歌詞什么時(shí)候結(jié)束,用戶(hù)可以根據(jù)自己的喜好生成大量的歌詞文本,再加以修飾,效果就會(huì)非常好。對(duì)于古詩(shī)生成來(lái)說(shuō),可以利用關(guān)鍵字生成古詩(shī)或者藏頭詩(shī),用戶(hù)可以自己輸入關(guān)鍵字,非常的方便,生成的古詩(shī)格式是保證正確的。系統(tǒng)流程圖如圖1所示。
本系統(tǒng)的核心功能:
(1)生成歌詞:通過(guò)用戶(hù)輸入的歌詞前奏,利用系統(tǒng)的模型生成歌詞文本。
(2)生成古詩(shī):通過(guò)用戶(hù)輸入關(guān)鍵字,利用模型生成意境相似的古詩(shī)。
(3)生成藏頭詩(shī):通過(guò)用戶(hù)輸入4個(gè)關(guān)鍵字,利用模型生成藏頭詩(shī)。
基于深度學(xué)習(xí)的歌詞和古詩(shī)自動(dòng)生成系統(tǒng)由多個(gè)模塊構(gòu)成,總體可以分為服務(wù)于LSTM神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)預(yù)處理模塊、LSTM神經(jīng)網(wǎng)絡(luò)模塊和GUI服務(wù)模塊。數(shù)據(jù)預(yù)處理模塊主要是對(duì)3.4萬(wàn)首中文歌詞和10.6萬(wàn)首傳統(tǒng)古詩(shī)進(jìn)行預(yù)處理,轉(zhuǎn)換成One-Hot編碼,神經(jīng)網(wǎng)絡(luò)才能進(jìn)行矩陣計(jì)算、學(xué)習(xí)。LSTM神經(jīng)網(wǎng)絡(luò)模塊是最核心的模塊,該模塊是歌詞和古詩(shī)生成最關(guān)鍵的部分,訓(xùn)練參數(shù)的選擇十分重要,需要通過(guò)不斷進(jìn)行對(duì)比、調(diào)參,記錄損失值和準(zhǔn)確率來(lái)最終確定模型參數(shù),通過(guò)用戶(hù)交互界面,方便用戶(hù)使用該系統(tǒng)。
在LSTM神經(jīng)網(wǎng)絡(luò)模塊中分為訓(xùn)練模塊和生成模塊,首先必須有足夠的數(shù)據(jù)用于訓(xùn)練模塊,該模塊是最重要的模塊,訓(xùn)練之后要保存模型,用于重構(gòu)模型以生成歌詞和古詩(shī)??梢哉f(shuō)訓(xùn)練模塊的獨(dú)立的,最終只有生成模塊會(huì)有數(shù)據(jù)交互,同時(shí)與GUI界面關(guān)聯(lián)起來(lái)。本系統(tǒng)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)使用的是RNN循環(huán)神經(jīng)網(wǎng)絡(luò)以及LSTM長(zhǎng)短期記憶模型用于訓(xùn)練。深度學(xué)習(xí)框架使用TensorFlow和Keras,激活函數(shù)使用softmax,損失函數(shù)使用交叉熵?fù)p失函數(shù)和sequence_loss函數(shù),優(yōu)化器使用Adam。
本文使用中華詩(shī)詞庫(kù)和3.4萬(wàn)首中文歌兩個(gè)數(shù)據(jù)集進(jìn)行訓(xùn)練和效果測(cè)試,建立兩個(gè)文本生成模型并進(jìn)行訓(xùn)練,學(xué)習(xí)得到較優(yōu)的文本生成模型。能夠?qū)崿F(xiàn)端到端隨機(jī)生成一首古詩(shī)或給出關(guān)鍵字的藏頭詩(shī)以及具有語(yǔ)義的歌詞。
數(shù)據(jù)預(yù)處理模塊是準(zhǔn)備工作,在深度學(xué)習(xí)領(lǐng)域當(dāng)中,準(zhǔn)備數(shù)據(jù)是非常煩瑣的工作,本系統(tǒng)研究的中文歌詞沒(méi)有開(kāi)源的數(shù)據(jù)集可供使用,需要爬蟲(chóng)獲取,古詩(shī)數(shù)據(jù)集是開(kāi)源的中華詩(shī)詞庫(kù),JSON格式。數(shù)據(jù)操作流程為:
(1)去除指定無(wú)用的符號(hào)。
(2)文本只保留漢字。
(3)將文本轉(zhuǎn)為向量并輸入算法中。
最后則是GUI服務(wù)模塊,使用Tkinter實(shí)現(xiàn),是Python自帶的標(biāo)準(zhǔn)圖形庫(kù),設(shè)計(jì)人機(jī)交互界面,便于用戶(hù)進(jìn)行相關(guān)操作。
系統(tǒng)整體結(jié)構(gòu)圖如圖2所示。
2? 系統(tǒng)核心功能
2.1? 數(shù)據(jù)預(yù)處理
數(shù)據(jù)預(yù)處理主要包括了爬取歌詞、收集古詩(shī)、文本篩選、文本向量化和功能性處理。爬蟲(chóng)主要運(yùn)用于歌詞的獲取,本系統(tǒng)采用Python的爬蟲(chóng)框架Pyspider爬取了非常多歌詞,但是不能直接用于訓(xùn)練,要先手動(dòng)刪除不需要的標(biāo)點(diǎn)符號(hào),留下中文歌詞,對(duì)于有些用網(wǎng)絡(luò)詞語(yǔ)改編的歌詞也不作為訓(xùn)練集。古詩(shī)使用開(kāi)源的中華詩(shī)詞庫(kù)。數(shù)據(jù)中可能存在部分符號(hào)的問(wèn)題,例如中英文符號(hào)混用、每行存在多個(gè)冒號(hào)、數(shù)據(jù)中存在其他符號(hào)等問(wèn)題,因此需要對(duì)數(shù)據(jù)進(jìn)行清洗。通過(guò)文本篩選得到了比較干凈的歌詞和古詩(shī)文本,但是這樣的文本對(duì)于神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō)是不能直接訓(xùn)練的。需要對(duì)歌詞和詩(shī)句進(jìn)行分詞,為了最后生成的歌詞和古詩(shī)的長(zhǎng)度的整齊性及便利性,需要先按單個(gè)字符進(jìn)行拆分,對(duì)所有文本分詞處理之后應(yīng)對(duì)單個(gè)字符進(jìn)行向量化,每個(gè)不同的字符對(duì)應(yīng)唯一的向量,便于之后計(jì)算出值后轉(zhuǎn)換為對(duì)應(yīng)的詞。最后,需要統(tǒng)計(jì)詞頻,刪除掉出現(xiàn)次數(shù)較低的詞。本文歌詞數(shù)據(jù)集采用的是中文歌詞,所有歌詞存放在一個(gè)txt文檔中,每一行存儲(chǔ)一首歌詞;古詩(shī)數(shù)據(jù)集數(shù)據(jù)采用的是全唐詩(shī),一共包含105 336首唐詩(shī),數(shù)據(jù)格式為詩(shī)歌內(nèi)容,存放在JSON文檔中。
2.2? 歌詞和古詩(shī)生成模型
建立歌詞和古詩(shī)生成模型,需要三個(gè)步驟:搭建、訓(xùn)練和保存。
2.2.1? 搭建模型
核心結(jié)構(gòu)是兩層LSTM神經(jīng)網(wǎng)絡(luò),需要注意的是每次都定義一個(gè)新的BasicCell,而不是定義一個(gè)BasicCell之后多次調(diào)用。LSTM神經(jīng)網(wǎng)絡(luò)在處理序列數(shù)據(jù)方面非常有效,雖然RNN與CNN都能進(jìn)行序列建模,但本質(zhì)上有不同。在搭建模型過(guò)程中還使用了Embedding層,稱(chēng)為嵌入層,相當(dāng)于一個(gè)網(wǎng)絡(luò)層,在模型第一層中使用,其目的是將有索引的標(biāo)簽映射到高密度低維向量,達(dá)到降維的作用,可以防止One-Hot向量維度過(guò)大導(dǎo)致的運(yùn)算速度過(guò)慢的問(wèn)題,該層通常用于文本數(shù)據(jù)建模。使用LSTM神經(jīng)網(wǎng)絡(luò)模型還有一個(gè)必不可少的全連接層(Dense層),它能夠根據(jù)特征的組合進(jìn)行分類(lèi),大大減少特征位置對(duì)分類(lèi)帶來(lái)的影響。
2.2.2? 訓(xùn)練模型
創(chuàng)建session會(huì)話進(jìn)行訓(xùn)練,由于訓(xùn)練集比較大,所以歌詞生成模型訓(xùn)練30個(gè)周期,古詩(shī)生成模型訓(xùn)練100個(gè)周期。輸入每一輪的損失值,通過(guò)每輪訓(xùn)練后損失值的變化判斷LSTM神經(jīng)網(wǎng)絡(luò)模型性能是否發(fā)生欠擬合,再比較LSTM神經(jīng)網(wǎng)絡(luò)模型在訓(xùn)練集和測(cè)試集的正確率判斷LSTM神經(jīng)網(wǎng)絡(luò)模型是否發(fā)生過(guò)擬合。若發(fā)生欠擬合則應(yīng)該增加LSTM神經(jīng)網(wǎng)絡(luò)模型的深度或者增加訓(xùn)練的時(shí)間,若發(fā)生過(guò)擬合則應(yīng)該采取正則化的方法或者Dropout抑制過(guò)擬合。
2.2.3? 保存模型
歌詞生成模型保存為H5文件,古詩(shī)生成模型保存為DATA-00000-OF-00001文件。Keras框架使用model.save()方法保存模型,TensorFlow框架使用tf.train.Saver類(lèi)來(lái)保存模型。
2.3? 生成歌詞和古詩(shī)
2.3.1? 歌詞生成
生成歌詞需要用戶(hù)先輸入10個(gè)字,定義“抽樣函數(shù)”,作用是從模型中得出當(dāng)前文本的下一個(gè)字符的概率分布,將分布重新調(diào)整,根據(jù)重新加權(quán)的分布隨機(jī)抽樣下一個(gè)字符,在當(dāng)前文本的末尾添加新字符。定義生成歌詞函數(shù),通過(guò)調(diào)用“抽樣函數(shù)”和model.predict()方法,用前10個(gè)字預(yù)測(cè)下一個(gè)字,直到for循環(huán)結(jié)束。
生成歌詞的核心代碼為:
def create_music(gen):
for i in range(300):
x_p = np.zeros((1, maxL))
for t, char in enum(sent):
x_p[0, t] = chartoid[char]
forecast= model.predict(x_p, verbose=0)[0]
nextIndex = sample(forecast, diversity)
nextChar = idtochar[nextIndex]
gen += nextChar
return gen[1:]
2.3.2? 古詩(shī)生成
生成古詩(shī)分為用戶(hù)輸入關(guān)鍵字生成古詩(shī)和輸入4個(gè)字藏頭詩(shī),每次預(yù)測(cè)其實(shí)是根據(jù)一個(gè)序列預(yù)測(cè)一個(gè)新的詞,需要詞的多樣化,因此可以按預(yù)測(cè)結(jié)果的概率分布進(jìn)行抽樣。藏頭詩(shī)就是固定每句詩(shī)的第一個(gè)字,按照藏頭來(lái)預(yù)測(cè)該行的詞。
生成古詩(shī)的核心代碼為:
def create_poetry():
st= sess.run(ini_s)
while :
x = np.zeros((b_size, 1))
x[:, 0] = char2id[c]
p, st = sess.run([probs, last_s], feed_dict={X: x, init_s: st})
p = np.squeeze(p)
pos = int(np.sorted(np.sum(p), np.random.rand() * np.sum(p)))
c = id2char[pos]
return gen[1:36]
系統(tǒng)主界面如圖3所示。
古詩(shī)生成界面如圖4所示。
歌詞生成界面如圖5所示。
3? 結(jié)? 論
本文在闡述完開(kāi)發(fā)基于深度學(xué)習(xí)的歌詞和古詩(shī)自動(dòng)生成系統(tǒng)的背景和意義,完成系統(tǒng)設(shè)計(jì)后,使用Python語(yǔ)言對(duì)系統(tǒng)進(jìn)行實(shí)現(xiàn),主要使用了RNN以及LSTM神經(jīng)網(wǎng)絡(luò)模型進(jìn)行歌詞和古詩(shī)的自動(dòng)生成。生成過(guò)程設(shè)置兩個(gè)階段,每個(gè)階段包括一個(gè)RNN檢測(cè)模型,使用中華詩(shī)詞庫(kù)數(shù)據(jù)集訓(xùn)練得到生成古詩(shī)的模型,使用中文歌詞數(shù)據(jù)集訓(xùn)練得到生成歌詞的模型,通過(guò)訓(xùn)練好的RNN進(jìn)行古詩(shī)和歌詞的生成,得到具有語(yǔ)義的古詩(shī)和歌詞。
參考文獻(xiàn):
[1] 池云仙,趙書(shū)良,羅燕,等.基于詞頻統(tǒng)計(jì)規(guī)律的文本數(shù)據(jù)預(yù)處理方法 [J].計(jì)算機(jī)科學(xué),2017,44(10):276-282+288.
[2] 肖燁晗.基于自然語(yǔ)言生成技術(shù)的人工智能應(yīng)用 [J].科技傳播,2019,11(7):155-156.
[3] 馬然.基于深度學(xué)習(xí)的自然場(chǎng)景文本識(shí)別系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) [D].長(zhǎng)春:吉林大學(xué),2015.
[4] 段軍紅,李曉宇,慕德俊.一種非完全標(biāo)注的文本分類(lèi)訓(xùn)練方法 [J].微處理機(jī),2019,40(1):20-24.
[5] 張克君,史泰猛,李偉男,等.基于統(tǒng)計(jì)語(yǔ)言模型改進(jìn)的Word2Vec優(yōu)化策略研究 [J].中文信息學(xué)報(bào),2019,33(7):11-19.
作者簡(jiǎn)介:彭濤(1974—),女,漢族,江西龍南人,講師,碩士,主要研究方向:計(jì)算機(jī)應(yīng)用。