法規(guī)邏輯結(jié)構(gòu)抽取:ANNOTARES數(shù)據(jù)集解析)
做法律文本處理的人應(yīng)該都遇到過(guò)這樣一種情境一篇德國(guó)法規(guī)文檔從 PDF 里轉(zhuǎn)出來(lái)的純文本看起來(lái)整整齊齊章節(jié)、條、款、句都在那里??墒钱?dāng)你試圖讓模型“讀懂”它的時(shí)候困難卻不在單詞也不在語(yǔ)法而在法條內(nèi)部那套看不見(jiàn)的邏輯結(jié)構(gòu)。哪一句是構(gòu)成要件哪一句是法律后果哪個(gè)條款只是在定義概念哪一處引用指向另一部法律——這些結(jié)構(gòu)人類(lèi)法律工作者一眼就能判斷機(jī)器學(xué)習(xí)模型卻需要大量專門(mén)的數(shù)據(jù)才能學(xué)出來(lái)。ANNOTARES 這個(gè)項(xiàng)目做的就是為“從德國(guó)成文法規(guī)中抽取邏輯結(jié)構(gòu)”提供一套數(shù)據(jù)集。這篇博客想把它放在一個(gè)更大的背景里聊清楚這類(lèi)數(shù)據(jù)集到底解決什么問(wèn)題怎么用以及它的邊界在哪里。1. 法律文本不是普通文本為什么“讀懂結(jié)構(gòu)”這么難1.1 法條的表層是段落底層是一張邏輯網(wǎng)絡(luò)如果只看法條排版德國(guó)法規(guī)其實(shí)非常有秩序。以《德國(guó)民法典》為例整部法典被分成編Buch、章Abschnitt、節(jié)Titel往下是具體條文Paragraph條文里再有款A(yù)bsatz、句Satz、項(xiàng)Nummer。PDF 轉(zhuǎn)文本工具可以很輕松地保留這層排版結(jié)構(gòu)因?yàn)樗秋@式的。但這層排版結(jié)構(gòu)只是入口。真正決定一條法規(guī)“怎么用”的是藏在這層結(jié)構(gòu)底下的邏輯網(wǎng)絡(luò)。一條規(guī)范要成立往往要同時(shí)滿足好幾個(gè)條件這些條件可能散落在同一款的不同句子里也可能被定義條款和例外條款層層包裹。更麻煩的是德國(guó)法律條文之間的交叉引用極其密集經(jīng)常出現(xiàn)“按照第 X 條第 Y 款第 Z 句”這樣的寫(xiě)法。于是法規(guī)表面上是線性的文字實(shí)際上是一張由條件、后果、定義、例外、引用構(gòu)成的邏輯網(wǎng)絡(luò)。通用 NLP 工具擅長(zhǎng)處理的是表層文本而邏輯結(jié)構(gòu)抽取要處理的恰恰是這個(gè)網(wǎng)絡(luò)。沒(méi)有對(duì)邏輯結(jié)構(gòu)的統(tǒng)一刻畫(huà)模型讀一百條法條得到的只是一百段孤立的文字而不是一套可以相互關(guān)聯(lián)的規(guī)則。1.2 德國(guó)立法的“語(yǔ)言債”讓抽取任務(wù)更難德國(guó)法規(guī)文本在語(yǔ)法上是出了名的“硬”。長(zhǎng)定語(yǔ)、嵌入從句、名詞化、復(fù)合詞都是家常便飯。一個(gè)句子可以寫(xiě)成幾行主句被從句層層包裹不到句末根本看不到謂語(yǔ)。對(duì)依賴語(yǔ)法分析的模型來(lái)說(shuō)這種結(jié)構(gòu)天然地不友好。更重要的是法規(guī)語(yǔ)言里幾乎每個(gè)詞都可能承擔(dān)規(guī)范功能。“可以”和“必須”之間是裁量與義務(wù)的差別“或者”和“并且”之間是選擇關(guān)系與累積條件的差別。這種高密度的規(guī)范性語(yǔ)義決定了我們不能用普通的文本分類(lèi)或情感分析思路來(lái)處理。從工程經(jīng)驗(yàn)看這其實(shí)是很多法律 NLP 項(xiàng)目一開(kāi)始就容易掉進(jìn)去的坑以為先跑通一個(gè)通用語(yǔ)義模型再丟幾條德國(guó)法條進(jìn)去就能得到結(jié)構(gòu)。結(jié)果往往得到一堆看起來(lái)通順、實(shí)際沒(méi)有完整保存“如果—那么”邏輯的輸出。1.3 為什么必須要有專門(mén)的標(biāo)注數(shù)據(jù)集有人可能會(huì)問(wèn)現(xiàn)在大型語(yǔ)言模型那么強(qiáng)直接讓它抽取邏輯結(jié)構(gòu)不行嗎行但問(wèn)題在于“穩(wěn)定”和“可評(píng)測(cè)”。大模型可以做零樣本抽取但輸出格式、標(biāo)簽體系、邊界劃分都不夠穩(wěn)定。如果我們要把這個(gè)能力變成一個(gè)可復(fù)用的工程模塊就需要一個(gè)固定 schema、有黃金標(biāo)注、能計(jì)算準(zhǔn)確率的基準(zhǔn)。ANNOTARES 這類(lèi)數(shù)據(jù)集提供的正是這個(gè)一套對(duì)德國(guó)成文法規(guī)的規(guī)范結(jié)構(gòu)進(jìn)行人工標(biāo)注的語(yǔ)料讓訓(xùn)練和評(píng)估都有了同一把尺子。換個(gè)角度看這也是法律領(lǐng)域和普通文本領(lǐng)域的一個(gè)本質(zhì)區(qū)別法律文本的使用后果很重標(biāo)注錯(cuò)一個(gè)邊界可能導(dǎo)致對(duì)整條規(guī)范的誤讀。因此“有據(jù)可查的人工標(biāo)注”不是錦上添花而是這類(lèi)任務(wù)能成立的前提。2. ANNOTARES 是什么一個(gè)面向德國(guó)法規(guī)邏輯結(jié)構(gòu)的基礎(chǔ)資源2.1 從標(biāo)題里能確認(rèn)的信息邊界先從信息邊界說(shuō)起。從標(biāo)題本身我們能直接確認(rèn)的信息有三個(gè)它首先是一個(gè)數(shù)據(jù)集Dataset其次面向的對(duì)象是德國(guó)成文法規(guī)German Statutory Texts最后它的目標(biāo)是邏輯結(jié)構(gòu)抽取Extracting Logical Structures。至于數(shù)據(jù)集的具體規(guī)模、標(biāo)注了哪些結(jié)構(gòu)類(lèi)別、采用什么格式、訓(xùn)練集和測(cè)試集怎么劃分、許可協(xié)議是什么這些細(xì)節(jié)并不在標(biāo)題里。所以如果你準(zhǔn)備實(shí)際使用第一步應(yīng)該是去查項(xiàng)目論文、數(shù)據(jù)集倉(cāng)庫(kù)或官方文檔把這些信息確認(rèn)清楚而不是從標(biāo)題直接推斷。這不是套話。數(shù)據(jù)集的使用邊界幾乎全部由標(biāo)注指南annotation guideline決定。同樣是“規(guī)范結(jié)構(gòu)”不同項(xiàng)目可能有完全不同的標(biāo)簽定義和邊界規(guī)則。先看文檔再動(dòng)手能省下后面大量返工時(shí)間。2.2 它屬于“窄而深”的領(lǐng)域數(shù)據(jù)集我們平時(shí)接觸到的數(shù)據(jù)集其實(shí)有好幾類(lèi)。初學(xué)者做機(jī)器學(xué)習(xí)入門(mén)多半會(huì)用 iris dataset 這類(lèi)經(jīng)典的二維表格數(shù)據(jù)它教的是分類(lèi)和聚類(lèi)的底層邏輯做前端可視化的人會(huì)關(guān)心 echarts dataset 這類(lèi)面向圖表的數(shù)據(jù)結(jié)構(gòu)它討論的是字段如何映射到坐標(biāo)軸和圖形教程里常見(jiàn)的 easy dataset 工具強(qiáng)調(diào)的是快速把散亂數(shù)據(jù)整理成可供模型消費(fèi)的格式。ANNOTARES 和它們都不太一樣。它屬于“窄而深”的領(lǐng)域標(biāo)注語(yǔ)料窄是因?yàn)樗桓采w德國(guó)成文法規(guī)深是因?yàn)樗诿恳欢挝谋旧蠘?biāo)注的語(yǔ)義信息遠(yuǎn)比一份普通文本語(yǔ)料豐富。它的價(jià)值密度高但通用性不強(qiáng)。你不太可能拿它來(lái)提升聊天機(jī)器人的語(yǔ)言能力但它對(duì)法律檢索、法規(guī)分析、合規(guī)輔助這類(lèi)任務(wù)可能是關(guān)鍵的基礎(chǔ)設(shè)施。2.3 “邏輯結(jié)構(gòu)抽取”不是普通信息抽取這一點(diǎn)很容易被誤解。信息抽取通常指的是從文本里抽實(shí)體、抽事件、抽關(guān)系。比如從一份新聞里抽出“公司 A 收購(gòu)了公司 B”這是信息抽取。邏輯結(jié)構(gòu)抽取要處理的對(duì)象更抽象它要還原的是法條內(nèi)部的論證骨架哪些文本片段構(gòu)成某個(gè)規(guī)范規(guī)范的成立條件是什么觸發(fā)后果是什么這些片段之間是什么邏輯關(guān)系??梢宰鲆粋€(gè)類(lèi)比普通信息抽取像是給一棟樓的每個(gè)房間貼上物品清單而邏輯結(jié)構(gòu)抽取是畫(huà)出這棟樓的電路圖。前者告訴你“哪里有什么”后者告訴你“它們?cè)鯓舆B接、什么條件下通電”。對(duì)于法律文本來(lái)說(shuō)真正有價(jià)值的恰恰是后者因?yàn)橹挥欣斫饬诉B接關(guān)系才能判斷一條規(guī)范在具體場(chǎng)景里是否被觸發(fā)。3. 邏輯結(jié)構(gòu)抽取到底抽什么給模型一張“法律邏輯地圖”3.1 先切分規(guī)范從法條到可操作的單元法律邏輯結(jié)構(gòu)的第一個(gè)層次是把文本切分成規(guī)范單元。在德國(guó)法學(xué)理論里一個(gè)條文Paragraph可能包含多個(gè)規(guī)范也可能一條規(guī)范跨越多個(gè)條文。抽取系統(tǒng)的第一步通常是判斷當(dāng)前文本片段屬于哪種規(guī)范角色再?zèng)Q定如何歸組。這個(gè)切分看起來(lái)簡(jiǎn)單做起來(lái)并不容易。因?yàn)榉ㄒ?guī)原文并不會(huì)用 XML 標(biāo)簽告訴你“這里是一條規(guī)范”它只給你自然語(yǔ)言。邊界在哪里、嵌套關(guān)系如何表示都需要標(biāo)注數(shù)據(jù)的支撐。3.2 “如果—那么”構(gòu)成要件與法律后果法律邏輯結(jié)構(gòu)的核心是德國(guó)法學(xué)里常說(shuō)的“構(gòu)成要件Tatbestand—法律后果Rechtsfolge”結(jié)構(gòu)。簡(jiǎn)單來(lái)說(shuō)當(dāng)滿足某些條件時(shí)產(chǎn)生某種法律后果。這種結(jié)構(gòu)本質(zhì)上是法律規(guī)范的基本邏輯形式。舉一個(gè)簡(jiǎn)單的德語(yǔ)刑法條文例子來(lái)說(shuō)明Wer ein Fahrzeug führt, obwohl ihm die erforderliche Fahrerlaubnis fehlt, wird mit Freiheitsstrafe bestraft.這句里“Wer ein Fahrzeug führt”駕駛車(chē)輛和“obwohl ihm die erforderliche Fahrerlaubnis fehlt”缺少必要駕駛許可是構(gòu)成要件“wird mit Freiheitsstrafe bestraft”將被處以自由刑是法律后果。人類(lèi)很容易看出來(lái)“如果—那么”的邏輯就藏在句子結(jié)構(gòu)里但機(jī)器需要學(xué)會(huì)的正是這種識(shí)別。更復(fù)雜的法條里構(gòu)成要件不會(huì)這么整齊。它可能被拆到多個(gè)句子里可能被“但是”轉(zhuǎn)折可能引用另一個(gè)條文。因此標(biāo)注數(shù)據(jù)必須在不同寫(xiě)法下給模型提供一致的標(biāo)簽。3.3 交叉引用法律文本里的“超鏈接”德國(guó)法規(guī)中交叉引用是最大的一類(lèi)“邏輯結(jié)構(gòu)”特征。條文作者經(jīng)常不把規(guī)則寫(xiě)全而是直接指向別處的條款常見(jiàn)寫(xiě)法包括“按照第 34 條第 2 款”“準(zhǔn)用第 400 條”等。從邏輯結(jié)構(gòu)抽取的角度看交叉引用意味著當(dāng)前規(guī)范的理解不能只依賴當(dāng)前條文而要把被引用的規(guī)范也納入進(jìn)來(lái)。因此好的標(biāo)注體系通常會(huì)把交叉引用識(shí)別為一種關(guān)系型標(biāo)簽而不只是把引用文字框出來(lái)。這里的原則是先抽取引用邊界再做引用關(guān)系鏈接。不要試圖一步到位把“引用最終指向哪一條”直接作為分類(lèi)任務(wù)因?yàn)榻馕鲆帽旧砜赡芫托枰嗖酵评怼?.4 定義、例外、推定邏輯網(wǎng)絡(luò)上的其他節(jié)點(diǎn)除了構(gòu)成要件和法律后果法規(guī)里還存在其他功能性結(jié)構(gòu)單元定義條款用來(lái)限定一個(gè)概念的外延例外條款用來(lái)排除某些情況推定條款用來(lái)調(diào)整證明責(zé)任擬制條款則把一種情況當(dāng)作另一種情況處理。這些功能單元在邏輯上扮演不同角色對(duì)模型來(lái)說(shuō)卻經(jīng)常是“看起來(lái)都是普通句子”。沒(méi)有標(biāo)注數(shù)據(jù)模型很難學(xué)會(huì)區(qū)分它們。而一旦能區(qū)分下游很多任務(wù)都會(huì)變得簡(jiǎn)單檢索可以更精準(zhǔn)合規(guī)分析可以更完整條文對(duì)比可以更省力。4. 這類(lèi)數(shù)據(jù)集在工程里怎么用從標(biāo)注到抽取模型的落地流程4.1 三種常見(jiàn)的任務(wù)建模方式拿到類(lèi)似 ANNOTARES 的標(biāo)注數(shù)據(jù)之后常見(jiàn)的做法是把邏輯結(jié)構(gòu)抽取建模成三類(lèi)任務(wù)或者三類(lèi)任務(wù)的組合。第一類(lèi)是 Span 級(jí)標(biāo)注。把文本切成 token為每個(gè) token 打上 BIO 標(biāo)簽識(shí)別構(gòu)成要件、法律后果、定義等片段。這是最基礎(chǔ)的建模方式適合先判斷“哪些句子片段承擔(dān)哪種邏輯角色”。# 示意結(jié)構(gòu)不是 ANNOTARES 原始數(shù)據(jù) # 用 BIO 格式標(biāo)記兩個(gè)邏輯片段 tokens [Wer, ein, Fahrzeug, führt, ,, wird, bestraft] labels [B-Tatbestand, I-Tatbestand, I-Tatbestand, I-Tatbestand, O, B-Rechtsfolge, I-Rechtsfolge]第二類(lèi)是關(guān)系抽取。在 Span 標(biāo)注的基礎(chǔ)上判斷片段之間的關(guān)系。例如“這條構(gòu)成要件指向哪條法律后果”“這個(gè)引用指向哪個(gè)具體條文”。關(guān)系抽取通常比 Span 識(shí)別更難因?yàn)殚L(zhǎng)距離依賴很常見(jiàn)。第三類(lèi)是層級(jí)結(jié)構(gòu)預(yù)測(cè)。法規(guī)的邏輯結(jié)構(gòu)經(jīng)常是嵌套的章套節(jié)、節(jié)套條、條套款條款里再套規(guī)范。如果數(shù)據(jù)集提供了層級(jí)標(biāo)注模型可以嘗試直接預(yù)測(cè)一個(gè)樹(shù)狀結(jié)構(gòu)而不是平鋪的標(biāo)簽序列。實(shí)際項(xiàng)目里建議先從第一類(lèi)任務(wù)跑通再逐步疊加關(guān)系抽取和層級(jí)建模。一上來(lái)就追求完整結(jié)構(gòu)預(yù)測(cè)容易在調(diào)試階段就陷入細(xì)節(jié)。4.2 訓(xùn)練與評(píng)測(cè)時(shí)要控制的關(guān)鍵變量第一是數(shù)據(jù)劃分方式。如果按句子隨機(jī)切分訓(xùn)練集和測(cè)試集同一部法律的相關(guān)條款會(huì)同時(shí)出現(xiàn)在兩邊模型相當(dāng)于“考到了原題”評(píng)估結(jié)果會(huì)虛高。更穩(wěn)妥的做法是按文檔或法條編號(hào)劃分。第二是類(lèi)別不平衡。法律文本里構(gòu)成要件和法律后果通常數(shù)量多定義和例外相對(duì)少。如果只盯著總體準(zhǔn)確率少數(shù)類(lèi)可能完全學(xué)不到。評(píng)測(cè)時(shí)至少要看各類(lèi)別的 F1尤其是稀有類(lèi)別。第三是匹配粒度。Span 抽取評(píng)估時(shí)“完全匹配”和“部分匹配”是兩回事。有的模型邊界預(yù)測(cè)總是差一兩個(gè) token完全匹配分?jǐn)?shù)會(huì)很難看但部分匹配可能已經(jīng)很有用。工程上可以先確定你要哪種粒度再?zèng)Q定如何調(diào)優(yōu)。4.3 一個(gè)最小可行的驗(yàn)證流程從拿到數(shù)據(jù)到跑出一個(gè)可評(píng)估的模型我建議按這個(gè)順序操作閱讀數(shù)據(jù)集文檔和標(biāo)注指南確定標(biāo)簽體系與格式。寫(xiě)一個(gè)腳本統(tǒng)計(jì)標(biāo)簽分布、文本長(zhǎng)度、文檔數(shù)量先建立對(duì)數(shù)據(jù)的直覺(jué)。選擇一個(gè)德語(yǔ)預(yù)訓(xùn)練語(yǔ)言模型作為基底做 Span 抽取的 baseline。用一小部分樣本跑通數(shù)據(jù)加載、訓(xùn)練、預(yù)測(cè)、評(píng)估的完整流程。逐步增加數(shù)據(jù)量和訓(xùn)練輪數(shù)觀察驗(yàn)證集指標(biāo)是否穩(wěn)定。按結(jié)構(gòu)類(lèi)別拆開(kāi)評(píng)估找出 F1 最低的類(lèi)別。做錯(cuò)誤分析判斷問(wèn)題是出在標(biāo)簽定義、數(shù)據(jù)噪聲還是模型能力。這個(gè)流程的核心思想是先跑通再優(yōu)化。不要一開(kāi)始就把精力花在復(fù)雜的模型結(jié)構(gòu)上先用最小流程檢驗(yàn)數(shù)據(jù)本身是不是和你預(yù)期一致。注意不要一上來(lái)就把全部訓(xùn)練數(shù)據(jù)灌進(jìn)模型先用一小部分樣本確認(rèn)數(shù)據(jù)加載、標(biāo)簽對(duì)齊、評(píng)估代碼都沒(méi)問(wèn)題再逐步增加規(guī)模。5. 新手最容易踩的坑數(shù)據(jù)使用和模型落地邊界5.1 不讀標(biāo)注指南就動(dòng)手是最大的坑數(shù)據(jù)集的標(biāo)簽不是“自然存在”的而是被設(shè)計(jì)出來(lái)的。同一個(gè)詞比如“定義”在不同標(biāo)注方案里可能有完全不同的邊界。有些方案把定義條款標(biāo)成一個(gè) Span有些方案則只標(biāo)定義的概念部分不標(biāo)解釋部分。如果不先讀標(biāo)注指南模型學(xué)到的可能是另一套規(guī)則而你自己還不知道。更常見(jiàn)的問(wèn)題是標(biāo)簽定義不統(tǒng)一導(dǎo)致標(biāo)注噪聲大模型訓(xùn)練時(shí)反復(fù)震蕩。這時(shí)候不要急著換模型先去回看標(biāo)注文檔和訓(xùn)練樣本很多問(wèn)題出在數(shù)據(jù)準(zhǔn)備階段。5.2 跨法域、跨語(yǔ)言的遷移能力非常有限德國(guó)成文法規(guī)的邏輯結(jié)構(gòu)和中國(guó)、美國(guó)、英國(guó)的法律體系并不完全對(duì)應(yīng)?!皹?gòu)成要件—法律后果”這個(gè)框架在德國(guó)法里非常清晰但到了普通法系條文組織的邏輯完全不同。用德語(yǔ)法規(guī)數(shù)據(jù)集訓(xùn)練的模型直接拿去做英文判例分析基本不可行。即使都在德語(yǔ)法律內(nèi)部不同法域的語(yǔ)料也有差異民事法規(guī)、刑事法規(guī)、行政法規(guī)的句式習(xí)慣、引用方式都不太一樣??缥谋具w移必須先做驗(yàn)證不能默認(rèn)有效。5.3 不要把抽取結(jié)果當(dāng)成“最終法律結(jié)論”這是最需要強(qiáng)調(diào)的邊界。邏輯結(jié)構(gòu)抽取的產(chǎn)出是一層更干凈的中間表示而不是最終的法律判斷。它可以幫助檢索、輔助人審、減少重復(fù)勞動(dòng)但不能替代法律專業(yè)判斷。道理很簡(jiǎn)單法律適用還涉及價(jià)值判斷、體系解釋、目的解釋這些不是