李建敦,羅宜元,呂 品
(上海電機學院 電子信息學院,上海 201306)
對于劇本中的角色網絡(character network)挖掘問題來講,角色發現較直觀,因此判定角色之間關聯與否及關聯強弱是關鍵[1]。鑒于語料庫的規模及其在行文風格、所屬流派等方面的不確定性,致使裸眼分析、手工構建、定性分析或純粹的語義類方案[2],如基于自然語言處理(na-tural language processing,NLP)[3]等算法,在可靠性、可擴展性與效率等方面表現不佳。相比之下,統計分析類方法在計算精度的保證下,算法效率更高。目前,主流的統計類方法基本上圍繞兩個指標來刻畫角色關系,即引用距離與對白距離。
角色引用距離類方法假設,如果多個角色同時出現在一個時空內,如連續劇、劇本的連續幾幕、單獨場次、小說的章節或段落、預定義的文本窗口(寬度為閾值θ)等[4-7],那么他們兩兩之間就應該有直接關系,權重為他們協同出現次數或引用距離的反比例函數[8,9]。此類方法對角色協同出現的時空采用閾值估計方法,精度無法保障;同時,協同在場的角色語義上并非一定有關系,因此該基本假設適用面有限;最后,連接也未能反映角色間的偏序關系。
圍繞劇本的主體元素,即對白來刻畫角色間關系,較引用距離類方法更優。基本思路是將前后相繼對白的主體(即隸屬角色)進行有序關聯(who-talk-to-whom),其權重可以是對白規模(如行數、字數等)、對白中某角色被提及次數等[10,12]。該類方法實現了連接的有向性,而且圍繞劇本主體(平均占比>80%)的對白進行分析,較好提升了模型的可靠性與精度[13]。然而,相鄰對白并非一定有關系,且其偏序關系在非語義分析下較難確定,因此該類方法依然存在過度關聯的問題。再者,以提及某角色頻次為連接權重與實際往往并不相符,因為除了問候、命令等特殊場合外,社交場合中我們幾乎不會直呼對方姓名。
通過上述分析發現,無論是圍繞引用距離還是對白距離開展的角色網絡建模,都存在噪聲過多(引入過多冗余連接)、精度不高的問題。為此,圍繞劇本中廣泛存在但并不占主體地位的舞臺說明元素,以65部西方經典戲劇為語料庫,本文提出了一種亞線性角色網絡抽取方法。總體上,該方法綜合了上述兩個指標的優勢,并在精度與效率上有較大提升。具體來說,該方法通過解析舞臺說明文字來確定兩兩角色是否協同在場;另外,同時在場僅僅構成了直接關系的必要條件,連接的最終生成還需來自對白上下文的舞臺說明來佐證。與全文掃描相比,該方法視對白段落為整體,僅僅針對劇本中的輔助文本,即舞臺說明,進行線性掃描,遍歷規模遠低于劇本長度N,因此是亞線性算法。
本文的語料庫由65部歐洲多幕劇構成,出自3位不同時代的劇作家,即威廉·莎士比亞(William Shakespeare),亨利克·易卜生(Henrik Ibsen)與喬治·蕭伯納(George Bernard Shaw)。所有劇本數據均為HTML格式,來源于麻省理工大學在線經典文獻項目(Internet Classic Archive)[14]與Gutenberg項目[15],劇本目錄詳見表1。下節將面向此數據集,進行角色網絡的深度高效挖掘。
總體來講,本文主要面向劇本文本,特別是其中的舞臺說明部分進行統計分析。詳細地,該方法由預處理、識別角色與關聯角色3個步驟組成,重點是有向含權連接的建模。相關源代碼,參見作者在Github上發布的classicPlayParsing項目[16]。
鑒于語料庫中不同劇本在元素到樣式的映射上存在異構性,從提高方法可擴展性的思路出發,非常有必要對其進行標準化處理。本文關注3種元素,即角色(protagonists)、對白(dialogues)與舞臺說明(stage directions),而如何識別并標記它們是預處理階段的主要工作。通過將異構的HTML文件轉化為標準的XML文件格式,劇本元素就可以通過樣式來辨識(參見表2)。

表1 語料庫詳情

表2 語料庫詳情

Algorithm I: 預處理與標記
Input:HF,LL,I,R,S
Output:XF
Begin:
(1) ScanHFto initializell,i,rands;
(2) Compare withLL,I,R,Sto identifyHF’s style;
(3) For line inHF:
(4) If this is a character line and ‘but’ in line:
(5) Truncate words from ‘but’ to the end line;
(6) Write line intoXF;
End

算法Ⅱ以標準文件XF為輸入,并通過搜索舞臺說明中的有向指示詞匯,完成含時舞臺的增量枚舉,從而將不定代詞解析為具體角色名。具體地,如果當前為開場行(算法Ⅱ第2至4行),那么基于鍵值對新建一個含時舞臺對象
Algorithm Ⅱ: 含時舞臺迭代
Input:XF
Output:RXF,DS
Begin:
(1) Forln,line inXF:
(2) If ‘Scene’ in line:
(3) Append
(4) pre_stage =Null;
(5) temp = []
(6) If this is a stage direction line:
(7)cur_stage=pre_stage;
(8) If ‘Enter’ in line:
(9) Append followed characters to temp;
(10) Append temp tocur_stage;
(11) If ‘Exit’ in line:
(12) Truncate characters fromcur_stage;
(13) Elif ‘Exeunt’ in line:
(14) Append
(15)pre_stage=Null;
(16) Ifpre_stage!=cur_stage:
(17) Append
(18)pre_stage=cur_stage;
(19) If this is a character line:
(20) Substitute indefinite pronouns with names;
(21) write revision toRXF;
(22) returnDS;
End
算法Ⅲ通過掃描改進標準版RXF中的角色行,生成了角色全集U。具體地,視行中角色數量來定,如果僅含有一個角色名,那么考慮直接添加至全集U(第(8)、(9)行),否則需要在拆分后再逐個考慮加入(第(3)至(7)行)。最后,U被返回以作后續之用。
Algorithm III: 角色識別
Input:RXF
Output:CS
Begin:
(1) For line inRXF:
(2) If this is a character line:
(3) If it has multiple characters:
(4) Split it into temp;
(5) For t in temp:
(6) If t not inCS:
(7) Append character names toCS;
(8) Elif line not inCS:
(9) Append line toCS;
(10) returnCS;
End
為角色全集U中的節點添加有向含權連接,是生成角色網絡的最后一步,也是算法核心。為了有效克服對白距離類方法精度不足的問題,此處著力挖掘對白間的指向關系,即誰對誰講的偏序關系。思路源于劇本中元素間的極端不平衡關系,即對白段落占比高、具有內在指向性與語言異構性,而舞臺說明元素圍繞對白展開,占比低卻具有鮮明的指向性。鑒于語料庫中劇本間的異構特征,此處盡量不涉及對白文本的語義理解,僅圍繞對白的輔助部分,如舞臺說明、標點符號等搜集角色間交流的偏序線索。

(1)X∈DSs且Y∈DSs;
(2)至少滿足以下一種情況:
當然,其中的方向性介詞“to”可替換為“toward(s)”,“address”,“tell” or “order”等同義詞。同時,我們也認識到,在不利用語義解析對白的情況下,僅依靠舞臺說明的指示來建立節點間聯系并不完備,故而此處引入問號做補充。考慮到反問句的可能性,我們將問號的優先級降至最低。此外,X→Y的權重wXY也可以面向上述3種情況分別計算,其最大值為對白總行數t-s。


Case 3:因為在此情境下沒有具體地“XtoY”或“toY”指示,因此權重直接取最大值t-s。
連接X→Y的最終權重是針對X各對白分量上結果的積聚,并以劇本總行數為基進行歸一化(normalization)處理。至此,給定劇本的角色網絡已經完成建模,具體見算法Ⅳ。
算法Ⅳ以RXF為輸入,通過一次掃描實現含權連接集合(ES)的輸出。具體地,第(3)至(6)行定位Case 1情況下的對話雙方,并標記當前情境為Case 1。第(7)行至(12)行處理角色行,如果情境上下文為Case 3,那么直接將上段對白長度作為變量speaker至本角色間的權重,并更新spea-ker。第(13)至第(16)行處理對白首行,分別為Case 3與Case 1更新變量start3_line與start_line。第(17)行至第(24)行試圖枚舉Case 2,如果命中,那么結束上一個情境并將結果寫入ES(第(19)、(20)行),并更新相關變量為Case 2做準備(第(21)-(24)行)。當掃描至對白段末行(第(25)行),完成Case 1或Case 2情境并寫入ES(第(26)-(28)行);最后辨別結束標點是否為問號,如果是,則設定當前的情境為Case 3,并由下一次迭代在算法Ⅳ第(9)行處理完成。為了邏輯連貫性,算法Ⅳ并未考慮多角色同行情況,可用集合替換單個角色從而實現全覆蓋。
Algorithm Ⅳ: 連接發現及其權重計算
Input:RXF
Output:ES
Begin:
(1)speaker=",listener=",case=0,line_count=0;
(2) Forln,line inRXF:
(3) If this is stage direction line and ‘to’ spotted:
(4)speaker= character preceded to ‘to’;
(5)listener= character succeeded to ‘to’;
(6)case= 1;
(7) Elif this is a character line:
(8) Ifcase==3:
(9) Write ‘speaker,line,end_line-start3_line’;
(10)case=0;
(11)q_line=end_line= 0;
(12)speaker= line;
(13) Elif this is the starting of a speech section:
(14)start3_line=ln;// starting line for case-3
(15) ifcase==1:
(16)start_line=ln;
(17) If this is one line of a speech section:
(18) If an embedded direction with‘To’spotted:
(19) Ifcase==1 orcase==2:
(20) Write ‘speaker,listener,ln-start_line’;
(21)case=2;
(22)listener= character succeeded to ′To′;
(23)start_line=ln;
(24)q_line=ln;
(25) If this is the end line of a speech section:
(26) Ifcase==1 orcase==2:
(27) Write ‘speaker,listener,ln-start_line’;
(28)case=0;
(29) Elif line end with ‘?’:
(30)case=3;
(31)end_line=ln;
(32) returnES;
End
本節所述通過分析舞臺說明中的提示信息來建立角色網絡的方法,是輕量級的。雖然該方法的建立至少需要掃描劇本3次,即預處理、角色識別與角色關聯,但是考慮到其關注核心并非劇本的主體——角色對白段落,而僅監聽劇本的輔助元素,即舞臺說明、角色行與對白尾行,而這些輔助元素之和在劇本中的平均占比不足20%。因此本文所述方法是輕量級算法,屬于亞線性算法范疇,復雜度為o(N),其中N為劇本規模(如行數)。
面向65部西方經典戲劇的劇本,基于Python(V2.7)對進行了實現,其中的3個角色網絡(來自不同作家)如圖1所示。網絡節點代表劇中人物,連接表示直接對話關系,連接粗度表示關系親密度。比如從劇本Hamlet的角色網絡中不難發現,王子Hamlet對Horatio講話最多,因此關系最密切(圖1)。
在角色網絡生成基礎上,利用Gephi[17]對網絡進行了系統全面的分析,得出一系列統計量,比如平均路徑長度、聚類系數與度分布(詳見表3)。就節點的無權度分布而言,絕大多數角色網絡符合Zipf法則(呈L型),圖2 展示了其中的3個。在語料庫上的多次實驗結果顯示,網絡的平均度分布服從無標度的冪律函數P(x)=k-r, 其中r≈2.87。
聚焦經典悲劇Hamlet,在其所對應的無差別連接網絡中,有對白的角色共26名,由65條連接成為社交網絡。在平均度為2.5的情況下,其中19個節點的度不超過5.0,因此它是典型的“小世界”網絡。同時,與真實的社交網絡相似,該網絡圍繞個別“熱點”,如Hamlet、Horatio與國王,形成了廣泛分布的社團結構,參見圖1與表4。

圖1 角色網絡示例:Hamlet(a)、A Doll’s House(b)、Heartbreak House(c)

莎士比亞悲劇喜劇歷史劇易卜生蕭伯納節點數28.122.8235.813.2523.88連接數64.1607134.2575.38平均度2.232.711.973.023.5網絡直徑5.25.596.82.924.88網絡密度0.110.140.060.420.24模塊度0.310.350.460.070.23連通組件數2.01.352.03.924.94平均聚類系數0.250.280.240.560.47平均路徑長度2.372.522.91.592.13

圖2 無差別度分布示例:Hamlet(a)、A Doll’sHouse(b)、Heartbreak House(c)

屬性值節點數26連接數65平均度2.5網絡直徑4.0網絡密度0.14模塊度0.32連通組件數1.0平均聚類系數0.66平均路徑長度2.44
結合角色網絡的建模結果與分析發現,利用本文所提出的基于舞臺說明的抽取方法,能夠在有效降低噪聲的基礎上精準地挖出劇本中的虛擬網絡。多次實驗下平均耗時<1.0 s,因此方法是高效的。
隨著計算語言學與數字人文研究的持續發展,展望未來我們期待網絡科學在其中繼續發揮更大的作用。比如給定一個語料庫,文學評論家僅需幾次鼠標單擊,就可實現定量比較與實時分析,本文便是推動當前研究向此方向發展的重要一步。
面向由65部經典多幕劇構成的語料庫,圍繞劇本舞臺說明分析,抽象出含時舞臺的動態概念,并基于此給出了角色網絡建模的亞線性方法。與角色引用距離或對白距離類算法相比,降低了噪聲,提高了建模精度與收斂效率。同時,本文所述方法面向標準交換格式,并不局限于特定的戲劇作品,在對預處理做必要修改后,可以應用于任何給定的英文劇本中,因而通用性較好。