Skip to content

スパンと構造化出力における一致度

スパン、NER、構造化アノテーションでなぜ Cohen や Fleiss の kappa が破綻するのか、そして代わりに何を使うべきか。一致度としての F1、完全一致と部分一致、Krippendorff の単位化アルファを解説します。

Cohen の kappa のような偶然一致補正済みの一致度は、すべてのアノテーターが同じ固定された項目集合を、同じ固定されたカテゴリ集合から付与することを前提とします。スパンアノテーションはこの前提を崩します。アノテーターは、スパンがどこで始まり、どこで終わり、そもそも存在するのかどうかについて意見が食い違い得るからです。スパンでは標準的な信頼性指標は kappa ではなくペアワイズ F1 であり、境界の部分的な重なりを一致とみなすかどうかを事前に決めておく必要があります。 本ガイドでは、通常の指標がここでなぜ機能しないのか、そして代わりに何を報告すべきかを説明します。

なぜ kappa はスパンに合わないのか

偶然一致補正済みの係数には三つのものが必要です。固定された項目のリスト、固定されたラベルのリスト、そしてアノテーターが偶然に一致する頻度を計算できることです。スパンタスクはそのいずれもきれいには供給しません。付与すべき「項目」のあらかじめ定まったリストは存在せず、アノテーターは読み進めながらスパンを作り出すため、二人が同じ文書に対して異なる数のスパンを生成し得ます。そして意味のある負のクラスも存在しません。「誰も印を付けなかった項目」とは考え得るすべての部分文字列であり、天文学的に大きく、かつ定義の曖昧な集合です。

最後の点が決定打です。Hripcsak and Rothschild (2005) は、情報検索やスパン抽出のように負のクラスが非常に大きい、または未定義である場合、二人のアノテーターが同じ任意のスパンで一致する確率は実質的にゼロであり、そのため偶然補正はほとんど何も変えず、kappa の背後にある前提はもはや成り立たないことを示しました。彼らの結果は、より整合的な代替案の標準的な根拠になっています。すなわち F 値 そのものが適切な一致度統計量なのです。一方のアノテーターのスパンを参照とし、もう一方のスパンを予測とみなして F1 を計算し、すべてのアノテーターペアで平均します。F1 は対称なので、ペアの順序は問題になりません。

完全一致か部分一致か:測る前に決める

報告する数値は、何を的中とみなすかに完全に依存し、普遍的な答えはないので、自分の選択を明示してください。

  • 完全一致:二つのスパンは両方の境界が同一である場合にのみ一致とみなします。厳格であり、境界が意味を担う場合(法的引用、化学名)に適した選び方です。
  • 部分一致/重なり一致:二つのスパンは、少しでも重なる場合、あるいは何らかの閾値を超えて重なる場合に一致とみなします。より寛容であり、エンティティの正確な範囲よりもその存在が重要な場合に妥当です。
  • 境界かラベルか:型付きスパン(NER)では、二つの問いを分けます。アノテーターは同じ範囲を印付けしたか、そしてそれに同じ型を与えたか、です。両者をまとめて報告すると、実際にどちらが不一致を引き起こしているのかが見えなくなります。

Artstein and Poesio (2008) は計算言語学における一致度の標準的なサーベイであり、この「単位化」の問題、すなわちテキストをどう単位に分割するかについての不一致を詳しく論じています。方法論上の選択を擁護する必要があるときに引用すべき参考文献です。

偶然補正済みの数値がほしい場合

タスクを固定された単位集合に還元できれば、偶然補正は再び有効になります。よくある二つの還元法があります。

  • トークン単位のラベリング:スパンタスクをトークンごとのラベル(BIO スキーム)として捉え直します。こうすれば各トークンは小さなラベル集合をもつ固定された項目となり、Fleiss の kappa や Krippendorff のアルファが直接適用できます。難点は、トークン単位の一致度が過大に見えることです。ほとんどのトークンは簡単な「外側」クラスなので、高い数値が実際の境界の不一致を覆い隠しかねません。
  • 単位化アルファKrippendorff (2004) は、アノテーター自身が連続体を分割するまさにこの場合のために、アルファの変種を開発しました。分割について偶然補正済みの単一の信頼性値がほしいときの原理的な選択肢であり、その代償として準備の手間が増えます。

実務的な折衷案は、トークン単位の kappa スパン単位の F1 を併せて報告することです。前者はラベルの一貫性について、後者は境界の一貫性について教えてくれ、両者の差がどちらの問題を直すべきかを示してくれます。

Potato での実践

Potato はカテゴリカルなスキームに対して Krippendorff のアルファを自動的に計算しますが、span スキームでは文書単位の数値が境界の不一致を覆い隠すため、実際に関心のある水準で測定してください。信頼できる手順は、アノテーターに共有サブセットで重複させ、そのスパンをエクスポートし、選んだ一致ルールのもとでペアワイズ F1 を自分で計算することです。

yaml
annotation_schemes:
  - name: pii_spans
    annotation_type: span
    description: "Highlight every span that reveals personal information."
    labels:
      - name: person
      - name: location
      - name: org
 
# Overlap a subset so agreement is measurable
automatic_assignment:
  on: true
  instance_per_annotator: 100
  labels_per_instance: 3

エクスポートは各アノテーターのスパンを文字オフセットとラベルとともに保持します。これは、完全一致または重なりの F1 をオフラインで計算し、境界の一致と型の一致を切り分けるのに必要なすべてです。スパンが型付きなら、F1 を二回実行してください。一度は型を無視して(境界の一致)、もう一度は型の一致を要求して(完全な一致)計算します。

さらに読む