package de.berlin.hu.uima.cc.eval;
import de.berlin.hu.util.Constants;
import de.berlin.hu.wbi.common.research.Evaluator;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.CASException;
import org.apache.uima.cas.FSIndex;
import org.apache.uima.collection.CasConsumer_ImplBase;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.tcas.Annotation;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.resource.ResourceProcessException;
import org.u_compare.shared.semantic.NamedEntity;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class SeparateEvaluation extends CasConsumer_ImplBase{
private int bothTP = 0;
private int dictTP = 0;
private int dictFP = 0;
private int crfTP = 0;
private int crfFP = 0;
private int FN = 0;
private int GA = 0;
private int PA = 0;
private int dictA = 0;
private int crfA = 0;
private int dictFN = 0;
private int crfFN = 0;
@Override
public void initialize() throws ResourceInitializationException {
super.initialize();
}
public void processCas(CAS aCAS) throws ResourceProcessException {
List<NamedEntity> goldAnnotations = new ArrayList<NamedEntity>();
List<NamedEntity> dictAnnotations = new ArrayList<NamedEntity>();
List<NamedEntity> crfAnnotations = new ArrayList<NamedEntity>();
JCas aJCas;
try {
aJCas = aCAS.getJCas();
} catch (CASException e) {
throw new ResourceProcessException(e);
}
FSIndex<Annotation> namedEntityIndex = aJCas.getAnnotationIndex(NamedEntity.type);
Iterator<Annotation> namedEntityIterator = namedEntityIndex.iterator();
while (namedEntityIterator.hasNext()) {
NamedEntity namedEntity = (NamedEntity) namedEntityIterator.next();
if (Constants.GOLDSTANDARD.equals(namedEntity.getSource())) {
goldAnnotations.add(namedEntity);
GA++;
} else {
if (Constants.DICTIONARY.equals(namedEntity.getSource())) {
dictAnnotations.add(namedEntity);
PA++;
dictA++;
} else if (Constants.CRF.equals(namedEntity.getSource())) {
PA++;
crfA++;
crfAnnotations.add(namedEntity);
} else {
System.err.println("Annotation without an origin: " + namedEntity.getCoveredText());
throw new ResourceProcessException();
}
}
}
//TODO evaluate in the destroy method, add to every ComparableAnnotation a aJCas ID
evaluate(goldAnnotations, dictAnnotations, crfAnnotations, 0);
}
public void evaluate(List<NamedEntity> goldAnnotations, List<NamedEntity> dictAnnotations, List<NamedEntity> crfAnnotations, int offset) {
List<ComparableAnnotation> goldAnnoationsComparable = new ArrayList<ComparableAnnotation>();
List<ComparableAnnotation> dictAnnotationsComparable = new ArrayList<ComparableAnnotation>();
List<ComparableAnnotation> crfAnnotationsComparable = new ArrayList<ComparableAnnotation>();
for (NamedEntity namedEntity : goldAnnotations) {
goldAnnoationsComparable.add(ComparableAnnotation.createInstance(namedEntity.getBegin(), namedEntity.getEnd(), namedEntity.getCoveredText(), offset));
}
for (NamedEntity namedEntity : dictAnnotations) {
dictAnnotationsComparable.add(ComparableAnnotation.createInstance(namedEntity.getBegin(), namedEntity.getEnd(), namedEntity.getCoveredText(), offset));
}
for (NamedEntity namedEntity : crfAnnotations) {
crfAnnotationsComparable.add(ComparableAnnotation.createInstance(namedEntity.getBegin(), namedEntity.getEnd(), namedEntity.getCoveredText(), offset));
}
if (dictAnnotationsComparable.size() > 0 && crfAnnotationsComparable.size() > 0) {
Evaluator<ComparableAnnotation,ComparableAnnotation> dictEvaluator = new Evaluator<ComparableAnnotation,ComparableAnnotation>(dictAnnotationsComparable, goldAnnoationsComparable);
dictEvaluator.evaluate();
dictTP += dictEvaluator.getTruePositives().size();
dictFN += dictEvaluator.getFalseNegatives().size();
Evaluator<ComparableAnnotation,ComparableAnnotation> crfEvaluator = new Evaluator<ComparableAnnotation,ComparableAnnotation>(crfAnnotationsComparable, goldAnnoationsComparable);
crfEvaluator.evaluate();
crfTP += crfEvaluator.getTruePositives().size();
crfFN += crfEvaluator.getFalseNegatives().size();
if (crfTP > 0 && dictTP > 0) {
Evaluator<ComparableAnnotation,ComparableAnnotation> evaluator = new Evaluator<ComparableAnnotation,ComparableAnnotation>(crfEvaluator.getTruePositives(), dictEvaluator.getTruePositives());
evaluator.evaluate();
bothTP += evaluator.getTruePositives().size();
} else {
bothTP += 0;
}
} else if (dictAnnotationsComparable.size() > 0 && crfAnnotationsComparable.size() == 0) {
System.out.println(dictAnnotationsComparable.size() + " " + goldAnnoationsComparable.size());
Evaluator<ComparableAnnotation,ComparableAnnotation> dictEvaluator = new Evaluator<ComparableAnnotation,ComparableAnnotation>(dictAnnotationsComparable, goldAnnoationsComparable);
dictEvaluator.evaluate();
dictTP += dictEvaluator.getTruePositives().size();
dictFN += dictEvaluator.getFalseNegatives().size();
crfTP += 0;
crfFN += goldAnnoationsComparable.size();
bothTP += 0;
} else if (dictAnnotationsComparable.size() == 0 && crfAnnotationsComparable.size() > 0) {
Evaluator<ComparableAnnotation,ComparableAnnotation> crfEvaluator = new Evaluator<ComparableAnnotation,ComparableAnnotation>(crfAnnotationsComparable, goldAnnoationsComparable);
crfEvaluator.evaluate();
crfTP += crfEvaluator.getTruePositives().size();
crfFN += crfEvaluator.getFalseNegatives().size();
dictTP += 0;
dictFN += goldAnnoationsComparable.size();
bothTP += 0;
} else {
crfTP += 0;
crfFN += goldAnnoationsComparable.size();
dictTP += 0;
dictFN += goldAnnoationsComparable.size();
bothTP += 0;
}
}
@Override
public void destroy() {
System.out.println("#goldstandard:\t" + GA);
System.out.println("#pipeline:\t" + PA);
System.out.println("#dict:\t\t" + dictA);
System.out.println("#crf:\t\t" + crfA);
System.out.println();
System.out.println("TP\tCRF\t" + crfTP);
System.out.println("FN\tCRF\t" + crfFN);
System.out.println("R\tCRF\t" + (double)crfTP/((double)crfTP + crfFN));
System.out.println("TP\tDICT\t" + dictTP);
System.out.println("FN\tDICT\t" + dictFN);
System.out.println("R\tDICT\t" + (double)dictTP/((double)dictTP + dictFN));
System.out.println("TP\tBOTH\t" + bothTP);
System.out.println();
}
}