CV・NLPハマりどころメモ

画像認識と自然言語処理を研究する中でうまくいかなかったことと、その対策をまとめる自分用メモが中心。

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

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