大規模資料集上的自適應標註覆蓋
Potato 2.6 允許你給大多數資料分配一位標註者、給一個分層樣本分配三位,在標註者出現分歧的資料上提高覆蓋度,並把爭議資料路由給裁定者。
任何有一定規模的標註項目都存在一個固有的矛盾。如果每條資料都由兩三位標註者處理,你可以測量一致性、信任自己的標籤,但預算也隨之翻了兩三倍。如果每條資料只由一位標註者處理,同樣的錢能標出三倍的資料,可你完全不知道其中任何一條有多可靠。
常見的折中辦法,做過研究的人都很熟悉:語料的大部分單人標註,另取一小部分樣本做雙人或三人標註以監控品質。難點在於讓工具乾淨利落地做到這一點,以及在拿到重疊標註之後真的用起來。Potato 2.6 把這套設計內建了進去,通過兩個配置塊(num_annotators_per_item 和 per_annotator_quota)加上自適應提升與裁定路由來實現。完整參考見異構覆蓋文件。
Potato 中的自適應標註覆蓋
逐條資料的上限與重疊樣本
num_annotators_per_item 接受一個整數表示統一上限,也接受一個結構化對映,用於讓不同資料獲得不同覆蓋度。最常見的形態是預設為 1,另取一個分層樣本提高到 3:
num_annotators_per_item:
default: 1
overlap_sample:
fraction: 0.1
count: 3
stratify_by: domain
seed: 42
min: 1overlap_sample 塊會在一個確定性的資料子集上提高上限。抽樣在啟動時進行一次,被選中的資料會在內部打上標記,此後分配邏輯就把它們當作高覆蓋資料處理。fraction 是抽樣比例,count 是提高後的上限(必須大於預設值),seed 讓這個選擇在重啟之間可復現。
stratify_by 改變了比例的施加方式。把它指向資料中的某個欄位(這裡是 domain),比例就會按層施加,而不是在整個資料池上施加。每個類別都會按其規模比例地進入重疊樣本,因此你不會在一個恰好 90% 來自單一領域的樣本上測量一致性。如果你的語料混合了新聞、社交媒體和臨床文本,每一類都會按其佔比出現在品質樣本中。
自適應提升
固定的重疊樣本是盲選的,在任何人開始標註之前就已確定。但最需要第二、第三次審視的,恰恰是標註者真的出現分歧的那些資料,而你只有在第一輪之後才知道它們是哪些。自適應提升會在事後提高覆蓋度:
num_annotators_per_item:
default: 1
adaptive:
enabled: true
disagreement_threshold: 0.5
boost_to: 3當一條資料至少已有兩份標註、且其分歧分數越過 disagreement_threshold 時,它的上限會被提高到 boost_to,並重新進入分配佇列等待下一輪。提升對每條資料只觸發一次,因此有爭議的資料只會被升級一次,不會無限膨脹。
逐標註者配額
覆蓋上限控制的是每條資料由多少標註者處理。另有一個配置塊控制每位標註者處理多少條資料,你通常會希望它按專業水平或合同條款而變化:
per_annotator_quota:
default: 100
by_user:
alice: 30
by_user_role:
expert: 30
novice: 200
user_roles:
alice: expert
carol: novice解析順序是從最具體到最一般:先 by_user[uid],再 by_user_role[user_roles[uid]],最後 default。因此你可以把某位專家單獨限制在 30 條、其餘專家按角色同樣限制在 30 條、新手限制在 200 條,而這套機制不會與上面的逐條資料上限相互干擾。
把重疊變成決策
只有當你真的處理這些分歧時,收集重疊標註才有意義。啟用裁定配置塊後,重疊樣本中達到覆蓋上限的資料會被自動打分,一致性低於閾值時就推入裁定佇列:
adjudication:
enabled: true
adjudicator_users: [admin]
min_annotations: 2
agreement_threshold: 0.75低一致性的資料會在樣本飽和的那一刻浮現出來,而不必等誰想起來手工重建佇列。裁定者開啟佇列,看到的就是真正有爭議的資料,那些大家都同意的部分已經被篩掉了。
解讀一致性
重疊樣本飽和之後,一致性統計可以在 /admin/iaa 檢視。這個端點會針對每種方案類型計算相應的指標,而不是用一個數字套用到所有情況:名義型方案用 Cohen's 與 Fleiss' kappa,有序型用加權 kappa,區間型用 token 級 kappa 加上區間 F1。這一點很重要,因為把有序的李克特評分當作無序類別去算 κ,會低估真實的一致性。
試一試
版本中附帶了一個可直接執行的演示。在倉庫根目錄下執行:
python potato/flask_server.py start examples/advanced/heterogeneous-coverage/config.yaml -p 8000它使用橫跨兩個領域的 20 條資料,按領域分層抽取 20% 做三人重疊標註,以 0.5 為閾值啟用自適應提升,定義兩個專業等級,並把低一致性的資料路由進裁定流程。
把它們串起來
上面這些部件讓你可以決定標註預算花在哪裡,而不是平均攤開。多數資料走一遍。一個分層切片走三遍,這樣你能報告整個語料的可靠性,而不只是其中一角。事後發現困難的資料會被自動升級,有爭議的則路由給裁定者。每一個覆蓋決策背後都有一行配置,而這正是你寫方法部分時需要的東西。
某個任務究竟需要多少標註者是另一個問題;需要多少標註者這篇文章梳理了其中的經驗法則。異構覆蓋隨 Potato 2.6 釋出;這些配置塊的全部能力見異構覆蓋文件和任務分配參考。