作者:楊德倫/ 資策會數位教育研究所數位人才培育中心講師
本文旨在訓練一個可以指定情感來進行文字生成的語言模型,將情感融入發文字串當中,作為條件求機率,以便簡潔地進行文字生成。文中所使用的訓練語料,來自NTCIR第14屆資訊檢索評估任務之一的「短文對話」(Short Text Conversation 3),其子任務「中文情緒對話生成」(CECG,Chinese Emotional Conversation Generation)提供了170萬組帶有情緒標記的單輪對話之訓練資料集,整合GPT2-Chinese進行訓練,於前導詞(prefix)後方合併指定的情緒文字,作為發話(post),讓文字生成符合指定情緒的回話(reply)。
前言
NTCIR(NII Test Collection for Information Retrieval;NII Test Collection for Information Resources)是日本情報學研究所(National Institute of Informatics,NII)所舉辦的資訊檢索評估國際會議,目的在於促進相關領域的技術交流。
NTCIR第12屆中,提出了短文對話(Shore Text Conversation,STC)任務,這是聊天機器人實現自然語言對話的第一步,STC希望任務參與者能建置以資訊檢索(Information Retrieval,IR)為基礎的對話系統;NTCIR第13屆的STC-2,除了IR的對話系統外,還考慮到以生成方式為基礎(generative-based),來建置對話系統;NTCIR第14屆提出了STC-3,其中的子任務「中文情緒對話生成」(Chinese Emotional Conversation Generation,CECG)提供了 170 萬組(2017年的1,100,000組,加上2019年的600,000組)帶有情緒標記的單輪對話之訓練資料集,讓建置對話系統的評估參與者,擁有結構化的語料庫進行研究。
在本文中,將以該訓練資料集作為語料來源,整合GPT2-Chinese進行訓練,以簡潔的方式調整前導詞(prefix),生成具有情感的中文對話文字。
訓練語料前處理
CECG子任務提供的170萬組對話語料,是從微博(Weibo)平台擷取而來,因此需要事先將文字從簡體轉換為正體中文,輸出成圖1的格式。個人使用OpenCC(Open Chinese Convert)進行轉換,讀者可依個人偏好來選擇轉換工具。
圖1 轉換成正體中文後的CECG語料
將轉換結果隨機取得兩組資料,如圖2,得知發話(post)與回話(reply)是以["發話","發話情緒"],["回話","回話情緒"]作為一組帶有情緒標記的對話,例如「明天又要去旅行了,超開心!」,而句子後方的「5」,是指該文字的情緒。
情緒一共分為5種,如圖3所示,分別代表:0為Other,1為Like,2為Sadness,3為Disgust,4為Anger,5為Happiness。無論post或是reply,都有對應的情緒標記。
圖2 原始語料的架構
圖3 情緒標記的定義
在正式進行訓練之前,必須先將對話資料進行調整,讓訓練資料符合GPT2-Chinese的訓練格式。
首先,將每一個reply的情緒標記轉換成一個特定的情緒虛擬記號(virtual token),其中情緒標記可轉換成對應的中文字,並在前後加上中括號([ ]),例如1就改成[喜歡],2就改為[悲傷],5就改為[幸福],依此類推;其次,將virtual token放到post的後面,變成「post[virtual token]」;再者,將reply放到最後面,變成「post[virtual token]reply」,「[virtual token]」是由reply的情緒轉換而來;最後,將每一組對話資料,依前述要求進行資料前處理,轉換成圖4的格式。
圖4 訓練格式
轉換完成後,便能進行訓練工作,可以參考圖5的結果。有關GPT2-Chinese訓練的方式,可以參考「使用GPT2-Chinese生成中文小說」,文章當中已經完整地描述訓練的方式,建議讀者閱讀、實作該文章的教學內容之後,再著手進行本次的語言模型訓練。
圖5 經過前處理的實際訓練語料
文字對話生成
訓練結束後,準備使用GPT2-Chinese進行文字對話生成,可以自行準備幾個prefix,格式必須符合「post[virtual token]」。關鍵之處,在於訓練的時候,是將virtual token 放置於post之後,而reply再接於訓練語料的最末端,使用「post[virtual token]」進行生成。
由於virtual token源自於reply的情緒,透過此方法作為條件求出文字生成的機率(條件機率的概念),最後便能引導出對應情緒的文字。以圖6為例,使用「我每天都被自己帥醒,壓力好大[喜歡]」,語言模型大多會生成如「恩,還是你瀟灑!」等較為正面的回話;如圖7所示,若是改成使用「我每天都被自己帥醒,壓力好大[悲傷]」,語言模型大多會生成如「唉,你是在嫉妒我吧?」等較為負面的回話。對話文字生成的指令,可以參考表1的設定。
由於GPT2-Chinese是以段落文章的生成為主,在對話文字生成的過程中,若是指定的文字生成長度超過回話的長度,可能會斷行後生成第二句,通常跟prefix無關,實作上僅需要每一個sample的第一句或第一個段落,額外斷行生成的文字可以略過;若是回話生成的字數不夠,導致前後無法連貫,可以適度地調整生成長度。
圖6 使用[喜歡]來引導生成的結果,大多會生成情感較為正面的對話文字
圖7 使用[悲傷]來引導生成的結果,大多會生成情感較為負面的對話文字
參考指令 |
python generate.py \
--length=15 \
--nsamples=5 \
--prefix="我每天都被自己帥醒,壓力好大[喜歡]" \
--model_path=model/final_model/ |
表1 對話文字生成參考指令
後記
本文使用單輪對話的語料來進行訓練,於前導詞後面指定引導情緒,即可生成具有情感的中文對話文字,然而在實作的過程中,發現整體語料情緒標記為1(Like,訓練用詞為[喜歡])的比例較高,若是透過「prefix[喜歡]」來進行對話文字生成,成效通常都不錯,且經常出現耐人尋味的回話;若將生成時的引導情緒改成3(Disgust)或4(Anger),還是會有不錯的效果,但變化程度則不如1(Like)。
若是讀者對本文的實作過程感興趣,語料無論是從CECG取得,或是自行從網路取得,特定情緒的語料,在訓練資料集當中的分布程度,可能或多或少會影響對話文字生成的效果,以上心得僅供參考。
參考資料
[1] The Free Dictionary: NTCIR
https://acronyms.thefreedictionary.com/NTCIR
[2] NTCIR-14 Short Text Conversation Task (STC-3)
http://sakailab.com/ntcir14stc3/
[3] 建置與評估文字自動生成的情感對話系統
https://doi.org/10.6120/JoEMLS.202011_57(3).0048.RS.CM
[4] 建立和應用具有幽默風格的生成對話系統
https://hdl.handle.net/11296/467aa9
[5] 使用GPT2-Chinese生成中文小說
https://www.cc.ntu.edu.tw/chinese/epaper/0058/20210920_5808.html
[6] [GPT2-Chinese old branch] 中文語言模型訓練與生成
https://youtu.be/c3fHRQonqlM
[7] GPT2-Chinese個人筆記
https://github.com/telunyang/python_web_scraping/blob/master/GPT2-Chinese.md