NLTKでアノテーター間の合意度(Inter Annotator Agreement)[NLTK]
NERに使うタグ付けデータをアウトソースにより作成したのだが,アノテーションの信頼度が分からない.
このため,NLTKでアノテーター間の合意度を算出した.これはその時のメモである.
3人のアノテーターが付けたラベルに対し,Cohen’s kappa(1960)とKrippendorff alpha(1980)を算出してみる.
from nltk.metrics import agreementtoy_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.2929292929292929task.alpha()>> 0.2978723404255319ここまでできたはいいが,3人のアノテーションが入力であった場合にもkappaが算出できているのがなぜだか分からない.
本来,kappaは2人の間の合意度を算出するものであるからだ.3人以上の時には,Fleiss’ Kappaという手法が存在するらしいのだが,nltkにも実装されているのか?
nltkのソースコードを調べてみると,以下のようにmulti kappaの記述と,Fleissの名前がコメントアウトにあったので,どうやら3人以上にも対応してるみたい.
def multi_kappa(self):"""Davies and Fleiss 1982Averages 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に関するブログも載せる