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 を使ってください。 位置にフォールバックすると、取得し直したり並べ替えたりしたスレッドで既存のアノテーションがすべて別の対象を指すようになります。これは誰かが確認するまで見えない種類の破損です。

一つのフィールドで複数の設問を同時に

有用な性質は、一つの会話フィールドが次のものを同時に担えることです。

  • スレッド全体のスキーマ — このスレッドは脱線したか
  • コメントごとの radio、likert、select、text — 各コメントを評価する
  • コメント内部のスパン — それをやった一文を印す
  • 異なるコメントのスパン同士を結ぶ span_link — ある主張と、それに反論する返信を結ぶ

最後の一つこそ、会話のアノテーションが実際に必要としているものであり、平坦な描画では表現できないものです。反論とは、二つの異なるターンの二つの位置のあいだの関係だからです。

分岐する会話では、conversation_tree がノード ID でキーづけされたノードごとのウィジェットを持つため、分岐ツリーと平坦なスレッドが同じメッセージを参照できます。

ConvoKit、双方向

ConvoKit(コーネル大学)は、計算機科学と計算言語学における会話研究の標準的なコーパス形式です。

bash
potato convokit conversations-gone-awry-corpus     # by name
potato convokit ./my-corpus/                       # by directory
potato convokit corpus.zip                         # by zip

会話単位でも発話単位でも取り込めます。--format convokit で書き戻す際は、既存コーパスに落とし込める info.<field>.jsonl のオーバーレイとしても、完全なダンプとしても出力できます。

知っておく価値のある性質が二つあります。

  • 各ターンが実際の発話 ID を保持します。 そのためコメントごとのアノテーションは、位置ではなく直接参照で往復します。
  • convokit への依存はありません。 この形式は標準ライブラリだけで読み書きされるので、コーパスを取り込むために研究用スタックを引き込むことはありません。

実際に流通しているすべての形式バリアントを読み込めます。リネーム前の userrootusers.json レイアウトまで対応しています。

一致度の測定

スレッド単位のラベルには通常のカテゴリ一致度を使います。興味深いのはコメント単位のラベルで、一致度はスレッド全体でプールせずコメントごとに計算すべきです。そうしないと、簡単なコメントが並ぶ長いスレッドが、本当に問題だった一つのコメントの不一致を押し流してしまいます。

コメント内部のスパンにはスパンの一致度を使いますが、オフセットはサーバーが適用するのと同じ正規化に対して計算しなければならない点に注意してください。Potato にはここにバグがあり、サーバーが空白を畳む一方でクライアントが畳まず、対話中のオフセットがすべてずれていました。

参考文献