NLTKでアノテーター間の合意度(Inter Annotator Agreement)[NLTK]

7月 26, 2020

NERに使うタグ付けデータをアウトソースにより作成したのだが,アノテーションの信頼度が分からない.

このため,NLTKでアノテーター間の合意度を算出した.これはその時のメモである.

3人のアノテーターが付けたラベルに対し,Cohen’s kappa(1960)とKrippendorff alpha(1980)を算出してみる.

from nltk.metrics import agreement
toy_data =
[['1', 5723, 'ORG'],
['2', 5723, 'ORG'],
['3', 5723, 'ORG'],
['1', 55829, 'LOC'],
['2', 55829, 'LOC'],
['3', 55829, 'ORG'],
['1', 259742, 'PER'],
['2', 259742, 'LOC'],
['3', 259742, 'PER'],
['1', 269340, 'PER'],
['2', 269340, 'LOC'],
['3', 269340, 'LOC']]
task = agreement.AnnotationTask(data=toy_data)
task.kappa()
>> 0.2929292929292929
task.alpha()
>> 0.2978723404255319

ここまでできたはいいが,3人のアノテーションが入力であった場合にもkappaが算出できているのがなぜだか分からない.

本来,kappaは2人の間の合意度を算出するものであるからだ.3人以上の時には,Fleiss’ Kappaという手法が存在するらしいのだが,nltkにも実装されているのか?

nltkのソースコードを調べてみると,以下のようにmulti kappaの記述と,Fleissの名前がコメントアウトにあったので,どうやら3人以上にも対応してるみたい.

def multi_kappa(self):
"""Davies and Fleiss 1982
Averages over observed and expected agreements for each coder pair.
"""
Ae = self._pairwise_average(self.Ae_kappa)
return (self.avg_Ao() - Ae) / (1.0 - Ae)

nltk.metrics.agreement — NLTK 3.4.4 documentation

ついでにkappaに関するブログも載せる

bellcurve.jp

NLTK

Posted by vastee