如何标注带回复结构的会话
依据 reply_to 渲染回复结构,同时标注整个话题与单条评论,跨评论建立跨度链接,并与 ConvoKit 语料双向互通。
把一个论坛话题压平成一份文字记录,就丢掉了会话研究最关心的东西:谁在回复谁。 渲染回复结构,正是让一个话题能作为"话题"而非"列表"被标注的关键。
渲染结构
instance_display:
fields:
- key: conversation
type: dialogue
label: "Thread"
display_options:
indent_replies: true缩进由每条发言的 reply_to 推导得出。发言身份从 turn_id、step_id 或普通的 id 中读取,因此论坛导出、聊天记录与邮件列表无需改造数据即可使用。
请使用稳定的 id。 回退到位置序号,意味着一个被重新拉取或重新排序的话题会让所有已有标注指向别处,而这种损坏在有人去核对之前是看不出来的。
一个字段,同时承载多个问题
真正有用的性质在于,单个会话字段可以同时承载:
- 整体话题方案——这个话题是不是跑偏了?
- 逐条评论的单选、李克特、下拉或文本——为每条评论评分
- 评论内部的跨度标注——标出正是哪一句话导致的
- 不同评论之间的
span_link——把一处主张与反驳它的那条回复连起来
最后一项才是多数会话标注真正需要的,也是压平式渲染无法表达的。反驳是两条不同发言中两个位置之间的关系。
对于分叉式会话,conversation_tree 提供按节点 id 索引的逐节点控件,因此一棵分叉树与一条扁平话题可以指向同一批消息。
ConvoKit,双向互通
ConvoKit(康奈尔大学)是计算机科学与计算语言学中会话研究的标准语料格式。
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 曾在这里有过一个缺陷:服务端会折叠空白字符而客户端不会,导致一段对话中的所有偏移量整体漂移。