梁 驍,黃文明,2,姚 俊,溫雅媛,鄧珍榮,2**
(1.桂林電子科技大學計算機與信息安全學院,廣西桂林 541004;2.廣西圖形圖像與智能處理重點實驗室,廣西桂林 541004;3.廣西壯族自治區高級人民法院,廣西南寧 530000;4.廣西師范大學電子工程學院,廣西桂林 541004)
詞源于民間,興于五代,盛于兩宋。宋詞是人們對文化生活強烈追求的產物,也是中國傳統文化最重要的文學形式之一。宋詞自動生成研究能幫助普羅大眾學習和自動生成宋詞,對進一步弘揚中華民族傳統文化具有重要意義。近年來,神經生成模型在自然語言處理上得到廣泛應用,其中的古詩詞自動生成研究受到眾多學者的青睞,引起了研究者們濃厚的興趣。
將現有的古詩詞自動生成研究分為傳統方法和基于深度學習的方法。傳統方法通過詩詞領域的專家人為設計規則和約束來生成古詩詞。其中基于模板的方法類似于完形填空,從詩歌中去除一些單詞,再從單詞庫中選擇合適的單詞放入空白處形成新的詩歌。周昌樂等[1]提出基于遺傳算法的宋詞生成方法,從語料庫中隨機選擇一句詞句,用設計好的評估函數評價詞句,并不斷迭代直到生成整首宋詞,但該方法缺乏語義連貫性。Yan等[2]將古詩生成看成給定寫作意圖的摘要生成問題,同時加入一些優化約束。He等[3]將詩歌生成看成統計機器翻譯問題,人為加上平仄押韻等約束。Tosa等[4]和Wu等[5]采用短語搜索的方法生成日本詩。Netzer等[6]采用基于詞聯想的方法生成俳句。Oliveira等[7,8]提出了一種基于語義和語法模板的西班牙詩生成方法。
隨著深度學習技術的發展,國內外的古詩詞生成研究進入新的階段。國外基于深度學習的機器翻譯和詩歌生成方法如下:Cho等[9]提出由兩個遞歸神經網絡RNN組成的編碼解碼器來實現機器翻譯。Gulcehre等[10]采用內存尋址方案實現動態神經機器翻譯。Hopkins等[11]集成了一個循環神經網絡(RNN)和一個有限狀態接受者(FSA)。它生成給定任意主題的英文4行詩。Ghazvininejad等[12]使用一個經過語音編碼訓練的神經語言模型來學習英語詩歌的形式和隱含表達的內容,生成英文韻律詩。這種模式可以有效地學習常見的詩歌音律,如押韻、節奏等。但這些方法使用單向量不能保存上下文的全部信息,并且隨著輸入序列長度的增加會導致循環神經網絡的性能下降。國內基于深度學習的方法如下:首先,基于循環神經網絡[13]的古詩生成方法將每首古詩的詩句通過拼接的方式形成語料庫,用于訓練循環神經網絡,最終得到一個輸出單詞字典大小的概率分布模型;然后,給定初始內容,不斷從概率分布模型中采樣出詩句中的詞語,直到生成完整的古詩?;谘h神經網絡模型[14]給定關鍵詞逐行生成古詩,它由3個部分組成:用于獲取句子的局部表示的卷積神經網絡;獲取已生成詩句的上下文向量的句子級別的循環神經網絡;根據歷史詩句上下文和該句已經生成的字符,輸出下一個字符概率向量的字符級別循環神經網絡。該模型捕獲詩句的全局信息和局部信息,提高模型的特征提取能力。Wang等[15]基于注意力的編解碼框架宋詞生成模型(ICG),將已生成詩句拼接起來作為輸入傳遞給編碼器,由解碼器輸出下一個詞句。該方法基于注意力機制配合長短期記憶神經網絡,可以學習更長的詩歌,在一定程度上提高前后語義的連貫性。Wang等[16]先給每一句詩歌規劃關鍵詞大綱,讓生成的詩句與關鍵詞相關,提高了古詩的主題一致性。Yan17]基于編碼解碼框架,其中編碼器是卷積神經網絡,編碼用戶輸入的意圖關鍵詞,解碼器由句子級別和詞級別兩個循環神經網絡組成。Ghazvininejad等[18]的主題詩生成模型(TPG)與規劃模型相似,不同的是它先生成4個押韻的關鍵詞,將其作為詩句的結尾,保證古詩的押韻。基于序列到序列的古詩生成模型(SPG)[19]在規劃模型基礎上增加了基于注意力機制的關鍵詞擴展模型,用于匹配古詩生成模型,提高了古詩的主題一致性。Yi等[20]基于顯著信息的古詩生成模型(SCG),通過注意力權重提取已生成詩句的顯著語義特征,用于指導解碼器生成上下文連貫的詩句。Liu等[21]通過引入條件變分自編碼器(CVAE)生成具有比喻或擬人修辭手法的現代詩,首次在生成的詩歌中加入修辭元素,讓詩歌變得更加生動形象。
風格作為宋詞的重要元素,對提高意境起著重要作用。宋詞的風格主要有兩類:豪放與婉約。豪放詞直抒胸臆,描述了廣闊的視野,恢宏的氣象;婉約詞詞調蘊藉,婉約含蓄,側重細節描寫。現有的研究主要關注詩詞的通順性和主題一致性方面,對于宋詞風格方面的研究較少,在很大程度上忽視了風格的重要性。另外,宋詞屬于長文本的體裁,詞句較多,現有的生成方法在上下文連貫性上仍存在提升空間。
為此,本文在編碼解碼的文本生成框架基礎上,引入多注意力組件和條件變分自編碼器,提出結合多注意力和條件變分自編碼器的風格宋詞生成方法。在自制的語料庫上進行實驗,探討本文方法對于提高上下文連貫性以及實現風格控制的效果。
在采用門控循環單元(GRU)的編碼解碼文本生成框架基礎上,加入基于自注意力機制的句子表示算法的多注意力組件,用于提取詞句中的顯著信息,提高上下文連貫性。另外,引入條件變分自編碼器,將每條宋詞數據轉化為隱空間中不同風格特征的高維高斯分布,從各自的分布中采樣隱變量來控制宋詞的風格。本文將從帶有注意力機制的基礎框架、多注意力組件和條件變分自編碼器等方面介紹方法的具體實現。
借鑒規劃模型的生成過程,用戶輸入n個關鍵詞(k1,k2,k3,k4,…,kn)作為宋詞的大綱,其中kn是第n行詞句的關鍵詞。輸入關鍵詞kn和第n-1行的詞句,輸出第n行的詞句。
TextRank算法[22]是評估句子或段落中詞語重要性的方法。可使用該算法提取出詞句中最重要的詞語作為關鍵詞。首先將宋詞數據集中所有詞句都拼接起來,對每個詞句分詞。根據分詞后的詞句構造圖,即句子中的每個詞語與它自身左右一定范圍內的詞語連接構成一個無向圖。將圖中邊的權重初始化為1,通過公式(1)進行迭代計算得分,直到收斂為止。最終得到所有關鍵詞的重要性得分表。在訓練階段,根據關鍵詞重要性得分表從現有的宋詞數據集中構建出關鍵詞數據集,即從每個詞句中提取出最重要的關鍵詞。在預測階段,對用戶輸入文本進行分詞,根據關鍵詞得分表提取出關鍵詞。
S(Vi)=(1-d)+
(1)
式中,ωji為詞語Vj連接邊的權值;E(Vi)為連接到詞語Vj的邊;d為阻尼因子,通常設置為0.8;S(Vi)為詞語Vi的分數,初始分數設為1.0。
模型的整體結構如圖1所示,其中橙色部分包括分別處理關鍵詞、源序列的兩個編碼器和先驗網絡(Prior network);綠色部分是處理目標序列的編碼器和后驗網絡(Recognition network),它們共同組成條件變分自編碼器;黃色部分是多注意力組件;粉色部分是注意力機制;紫色部分是解碼器。

圖1 模型整體結構Fig.1 Overall structure of the model
本文將帶有注意力機制的編碼解碼框架[14]作為基礎。編碼部分包括3個編碼器,其中一個編碼器將關鍵詞轉化成隱藏狀態K={k1,k2,…,kn}。另一個編碼器將目標序列文本Y={y1,y2,y3,…,yn}轉化成隱藏狀態序列T={t1,t2,t3,…,tn},計算公式如下:
tj=GRU(e(yj),tj-1),
(2)
式中,e(yj)表示目標序列文本Y中第j個詞的詞嵌入。
編碼器將源序列文本X={x1,x2,x3,…,xn}轉換成隱藏狀態序列H={h1,h2,h3,…,hn},計算公式如下:
hj=GRU(e(xj),hj-1),
(3)
式中,e(xj)表示源序列文本X中第j個詞語的詞嵌入。
解碼器將目標序列文本Yin={ys,y1,y2,y3,…,yn}轉化為隱藏狀態序列S={s1,s2,s3,…,sn},其中ys表示詞牌指示向量[15]。計算公式如下:
st=GRU(e(yt-1),vi-1,ct,st-1),
(4)
式中,將隱藏狀態hn、條件變分自編碼器(2.3小節)提取到的隱變量z和風格標簽r的拼接作為解碼器的初始隱藏狀態。vi-1是多注意力組件(2.2小節)提取的語義向量;ct是通過注意力機制計算的上下文向量,用于提供源序列和關鍵詞的全局信息,計算公式如下:
(5)
式中,將關鍵詞編碼器的最后一個隱藏狀態kn作為式中h0;hj為H第j個隱藏狀態;atj為該隱藏狀態的注意力權重,計算公式如下:
(6)
式中,etj的計算公式如下:
(7)
式中,Va,Wa,Ua都是需要訓練的參數。
常見的上下文處理方法是將詞句通過編碼器轉換成單個向量,并通過后續生成的詞句來更新該向量。單個向量不能存儲宋詞長文本的全部特征。無意義的詞也會混入該向量中,如虛詞、停用詞等。為此,引入多注意力組件提取詞句的多種語義特征,過濾非顯著特征,從而提高上下文的連貫性。
多注意力組件基于自注意力機制的句子表示算法[23,24],計算詞句的多注意力權重矩陣,提取詞句的3種重要語義特征并保存在指定的語義向量v中。多注意力權重矩陣的計算公式如下:
A=Ws2tanh(Ws1HT),
(8)
式中,Ws1是參數矩陣,維度為[da,2u];da是超參數,2u表示隱藏狀態的維度;Ws2是參數矩陣,維度為[r,da];r是超參數,設置為3;A=[a1,a2,a3],是多注意力權重矩陣,每行表示詞句某種語義的權重向量。為避免A的每行權重向量相似度高,導致每個注意力權重向量提取同一語義特征的問題,在損失函數中引入一個懲罰項[20],迫使每個注意力權重向量都具有明顯的差異。懲罰項公式如下:
(9)
將多注意力權重矩陣A按行加和并歸一化得到向量a:
(10)
在得到a后,通過式(11)計算存儲多種語義的句子表示:
M=aH,
(11)
M是包含多種語義的句子表示,根據新生成的M更新語義向量vi:
vi=?(vi-1,M),v0=0。
(12)
多注意力權重矩陣A在詞句“花色烘晴草色浮”上的表現如圖2所示。

圖2 多注意力權重Fig.2 Multi-attention weight
圖2的3個注意力權重主要用于提取“晴草花”的語義特征。a在詞句上的表現如圖3所示。

圖3 加和并歸一化的注意力權重Fig.3 Attention weight added and normalized
受Zhao等[25]和Sohn等[26]的多樣性文本生成模型的啟發,為了控制生成的文本風格,在基礎框架上引入條件變分自編碼器,將每條宋詞數據轉化成隱空間的風格特征分布。在訓練階段,輸入源序列、關鍵詞、目標序列和風格標簽。通過誤差反向傳播,降低KL散度(KL divergence)損失,讓先驗分布接近后驗分布,從后驗分布中采樣隱變量z。在預測階段,輸入源序列、關鍵詞和風格標簽,從先驗分布中采樣隱變量z。
2.3.1 先驗網絡和后驗網絡
構建先驗網絡和后驗網絡,分別計算先驗分布和后驗分布的均值和方差,如式(13)和(14)所示:
[μ,σ2]=MLP(tn,hn),
(13)
[μ′,σ′2]=MLP(hn),
(14)
式中,μ,σ2分別是后驗分布的均值和方差;μ′,σ′2分別是先驗分布的均值和方差。最后通過KL散度估計兩個高維高斯分布的信息損失。
為解決采樣過程不可導的問題,采用了重參數技巧[27],從均值u和偏差σ2的高緯高斯分布中采樣隱變量z等價于從標準正態分布中采樣一個β,再對其進行線性變換,如式(15)所示:
z=μ+β*σ,
(15)
式中,從β到z只涉及線性變換,β是固定的。
2.3.2 變分下界
通過KL散度公式衡量先驗分布和后驗分布的相似度來判斷生成質量。但這兩個分布的KL散度的計算涉及數據的真實分布,難以直接計算。為此,通過最大化變分下界(ELBO),替代直接計算兩個分布的KL散度。變分下界如下式所示:
ELBO=Eqφ(z|y,hn)[logpθ(y|z,hn,r)]-
KL(qφ(z|y,hn)‖pθ(z|hn))],
(16)
式中,φ是后驗網絡的參數,θ是先驗網絡的參數。z是隱變量,y是目標序列,r是風格標簽的詞嵌入。qφ(z|y,hn)是后驗分布,pθ(z|hn)是先驗分布。公式右邊的第一項是重構的似然估計,目的是讓生成的詞句和真實的詞句盡可能地接近。第二項是后驗分布和先驗分布的KL散度,用于衡量后驗分布相比先驗分布的信息損失。
2.3.3 弱化解碼器
GRU解碼器因解碼能力強容易忽略隱變量z,無法控制文本風格。為此,在訓練階段,用未知詞語(UNK)替換解碼器的部分輸入單詞,迫使解碼器無法僅通過先前生成的單詞來預測下一個單詞,需要更多地依賴隱變量z。
2.4.1 目標函數
解碼器生成目標序列Yout={y1,y2,y3,…,yn,ye},其中ye表示結束字符。目標函數如下式所示:
yt=argmaxyP(y|st),
(17)
式中,st為在t時刻的隱藏狀態,yt-1為上一時刻的輸出,最終生成t時刻最可能的字符yt。
2.4.2 損失函數
損失函數在重構損失的基礎上,加入多注意力的懲罰項和KL散度損失。損失函數如下式所示:
loss=ldecoder-lkl+lp,
(18)
式中,ldecoder是重構損失,采用交叉熵損失函數,保證了數據壓損的質量;lkl是KL散度損失正則項;lp是多注意力的懲罰項。
采用Request庫和BeautifulSoup庫,從古詩文網和Github上公開的中文詩歌庫中爬取20 000首宋詞,對其進行數據清洗,剔除存在亂碼的詞句,最終形成包含15 200首宋詞的語料庫。將其中的1 000首作為驗證集,1 000首作為測試集,剩余的作為訓練集。由于語料庫的宋詞數量較少,首先使用60 000首古詩作為預訓練模型。
語料庫僅存在少部分具有風格標簽的宋詞,其中婉約詞452首,豪放詞105首。從中隨機選擇50首婉約詩詞和50首豪放詩詞作為測試集,剩余的宋詞作為訓練集微調中文BERT模型,在測試集上的準確率為0.81。通過微調后的BERT模型對所有宋詞數據做風格標注。
本實驗的目的是驗證本文方法能否生成婉約或豪放的宋詞,以及是否在上下文連貫性上有所提高。實驗環境如下:硬件環境采用Intel?Xeon?Bronze 3104 CPU 1.7 GHz處理器;內存32 GB;NvidiaQuadro P2000顯卡,顯存8 GB。軟件環境主要采用python,cuda,tensorlfow深度學習框架和jieba分詞。
鑒于宋詞數據較小,模型參數設置過大會導致過擬合,所以模型設置的詞嵌入、隱藏狀態、隱變量、語義向量、上下文向量的維度分別為300,256,256,128,128。優化器采用小批量(64)隨機梯度下降算法,并采用Adadelta算法[28]調整學習速率。預測階段采用集束搜索算法,集束寬度為10。
宋詞包含多種格式的詞牌。為此,需要定義指示矩陣,矩陣的每一行向量分別表示不同的詞牌指示向量,作為解碼器的初始輸入,告知解碼器正在生成何種詞牌的宋詞。
由于詩歌生成任務與機器翻譯任務相似,因此使用BLEU算法[29]自動評估生成的宋詞。計算基準方法和本文方法的BLEU-1,BLEU-2,BLEU-3,BLEU-4的分數,然后取平均值作為最終的BLEU分數。
借鑒文獻[1-3]的人工評估方法,從意境、語句流暢性、上下文連貫性和意義等方面判斷古詩的質量。每方面滿分5分,分數越高表示宋詞在該評估方面的質量越高。讓系統生成50首宋詞,邀請10位碩士及以上的學者為生成的宋詞打分,最后取平均值作為最終得分。
本文方法(MACVAE)與4個基準方法ICG[15],TPG[18],SPG[19],SCG[20]的自動評估和人工評估結果見表1。3個基準方法TPG,SPG,SCG都在規劃模型基礎上改進。首先規劃在語義上相互關聯的關鍵詞作為主題大綱,依據大綱生成宋詞ICG未加入主題大綱,通過一個詞句生成整首宋詞。從表1可觀察到,這3個方法比ICG方法的上下文連貫性高,表明加入關鍵詞主題大綱的生成方法對一致性具有重要影響。

表1 BLEU評估和人工評估結果Table 1 BLEU evaluation and artificial evaluation results
TPG先根據用戶輸入的關鍵詞得到每句話的最后一個詞語,這些詞語都押韻且與用戶輸入相關,旨在提高押韻性。SPG在規劃模型的基礎上,另外訓練了基于注意力機制的關鍵詞擴展模型來匹配生成模型。SPG在上下文連貫性上較TPG有了進一步提高,表明增加的關鍵詞擴展模型對提高上下文連貫性有一定幫助。
SCG通過注意力機制的權重提取輸入序列的顯著信息,用于指導生成的下文與上文連貫。SCG相比于SPG在連貫性上的評分有所提升,表明提取上文詞句中的重要詞語用于指導下文的生成,對提高上下文連貫性具有重要幫助。
相較于基準方法,本文方法在序列到序列模型的基礎上,引入多注意力組件提取詞句中的重要語義,在上下文連貫性上有一定的提升;引入CVAE控制文本風格,基本實現了婉約類和豪放類宋詞的生成,提高了宋詞的意境。
生成的婉約詞示例如圖4所示。整首宋詞側重于細節描寫且上下文連貫。但第4句“留我青山作暮眠”和最后一句“海岸江海與蘇煙”描繪廣闊的場景,屬于豪放詞句,原因是風格標注的不完全準確性。

圖4 生成示例1Fig.4 Generated example 1
生成的豪放詞示例如圖5所示。整首宋詞描繪了廣闊的場景,整體上下文連貫,符合豪放風格的宋詞。

圖5 生成示例2Fig.5 Generated example 2
為提高宋詞的上下文連貫性及實現風格控制,引入多注意力組件提取詞句的多種重要語義,突出詞句中的重要詞語。另外,引入CVAE控制生成宋詞風格。在自制的語料庫上進行基準方法和本文方法的對比實驗,本文的方法在上下文連貫性上有一定提升。實現了宋詞風格的控制,在意境上有所提升。通過分類器標注的風格分類標簽并非完全準確,后續期望通過大量的語料庫和人工標注方式,進一步提高風格宋詞的生成質量。