Skip to content

如何標註帶回復結構的會話

依據 reply_to 渲染回覆結構,同時標註整個話題與單條評論,跨評論建立跨度連結,並與 ConvoKit 語料雙向互通。

把一個論壇話題壓平成一份文字記錄,就丟掉了會話研究最關心的東西:誰在回覆誰。 渲染回覆結構,正是讓一個話題能作為"話題"而非"列表"被標註的關鍵。

渲染結構

yaml
instance_display:
  fields:
    - key: conversation
      type: dialogue
      label: "Thread"
      display_options:
        indent_replies: true

縮排由每條發言的 reply_to 推導得出。發言身份從 turn_idstep_id 或普通的 id 中讀取,因此論壇匯出、聊天記錄與郵件列表無需改造資料即可使用。

請使用穩定的 id。 回退到位置序號,意味著一個被重新拉取或重新排序的話題會讓所有已有標註指向別處,而這種損壞在有人去核對之前是看不出來的。

一個欄位,同時承載多個問題

真正有用的性質在於,單個會話欄位可以同時承載:

  • 整體話題方案——這個話題是不是跑偏了?
  • 逐條評論的單選、李克特、下拉或文本——為每條評論評分
  • 評論內部的跨度標註——標出正是哪一句話導致的
  • 不同評論之間的 span_link——把一處主張與反駁它的那條回覆連起來

最後一項才是多數會話標註真正需要的,也是壓平式渲染無法表達的。反駁是兩條不同發言中兩個位置之間的關係。

對於分叉式會話,conversation_tree 提供按節點 id 索引的逐節點控制元件,因此一棵分叉樹與一條扁平話題可以指向同一批訊息。

ConvoKit,雙向互通

ConvoKit(康奈爾大學)是電腦科學與計算語言學中會話研究的標準語料格式。

bash
potato convokit conversations-gone-awry-corpus     # 按名稱
potato convokit ./my-corpus/                       # 按目錄
potato convokit corpus.zip                         # 按壓縮包

可按會話或按發言粒度匯入。用 --format convokit 匯出回去,既可以是能直接放進現有語料的 info.<field>.jsonl 覆蓋檔案,也可以是完整轉儲。

有兩項性質值得知道:

  • 每條發言都攜帶真實的 utterance id,因此逐條評論的標註是按直接查詢往返的,而不是按位置。
  • 不依賴 convokit 該格式的讀寫都用標準庫完成,因此匯入一份語料不會牽扯進一整套研究工具棧。

現實中流通的每一種格式變體都能讀取,包括改名前的 user/root/users.json 佈局。

衡量一致性

話題級標籤使用普通的類別一致性。逐條評論的標籤才是值得注意的情形:一致性應當按每條評論計算,而不是在整個話題上彙總,否則一個由大量簡單評論組成的長話題,會把那條真正要緊的評論上的分歧淹沒掉。

評論內部的跨度使用跨度一致性,但需注意:偏移量必須基於服務端所應用的同一套歸一化來計算。Potato 曾在這裡有過一個缺陷:服務端會摺疊空白字元而客戶端不會,導致一段對話中的所有偏移量整體漂移。

延伸閱讀