package edu.isistan.uima.unified.analysisengines.domain;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.uima.UimaContext;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.cas.text.AnnotationIndex;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.cas.FSArray;
import org.apache.uima.jcas.tcas.Annotation;
import org.apache.uima.resource.ResourceInitializationException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.uimafit.component.JCasAnnotator_ImplBase;
import org.uimafit.descriptor.ConfigurationParameter;
import org.uimafit.descriptor.ExternalResource;
import edu.isistan.daclassifier.MachineClassifier;
import edu.isistan.daclassifier.output.DomainActionNode;
import edu.isistan.uima.unified.analysisengines.AnnotationGenerator;
import edu.isistan.uima.unified.sharedresources.ProgressMonitorResource;
import edu.isistan.uima.unified.typesystems.domain.DomainAction;
import edu.isistan.uima.unified.typesystems.nlp.Sentence;
import edu.isistan.uima.unified.typesystems.nlp.Token;
import edu.isistan.uima.unified.typesystems.srl.Argument;
import edu.isistan.uima.unified.typesystems.srl.Predicate;
@SuppressWarnings("unused")
public class DomainActionAnnotator extends JCasAnnotator_ImplBase {
@ConfigurationParameter(name="model")
private String modelName;
@ConfigurationParameter(name="label")
private String labelName;
@ConfigurationParameter(name="source")
private String sourceName;
@ConfigurationParameter(name="filter")
private String filterName;
//
private MachineClassifier classifier;
//
@ExternalResource(key="monitor")
private ProgressMonitorResource monitorResource;
private IProgressMonitor subMonitor;
@Override
public void initialize(UimaContext context) throws ResourceInitializationException {
super.initialize(context);
//modelName = (String) aContext.getConfigParameterValue("model");
//labelName = (String) aContext.getConfigParameterValue("label");
//sourceName = (String) aContext.getConfigParameterValue("source");
//filterName = (String) aContext.getConfigParameterValue("filter");
FileInputStream fis = null;
try {
classifier = new MachineClassifier();
classifier.setDebugEnabled(false);
//classifier.loadFullInstances();
classifier.loadSubsetInstances();
//classifier.loadFullModel();
//classifier.loadSubsetModel();
classifier.trainModel();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if(fis != null)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void process(JCas aJCas) throws AnalysisEngineProcessException {
if(classifier == null)
return;
//
subMonitor = new SubProgressMonitor(monitorResource.getMonitor(), 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
subMonitor.subTask("Annotating domain actions");
//
AnnotationIndex<Annotation> sAnnotations = aJCas.getAnnotationIndex(Sentence.type);
AnnotationIndex<Annotation> pAnnotations = aJCas.getAnnotationIndex(Predicate.type);
//
subMonitor.beginTask(this.getClass().getSimpleName(), sAnnotations.size());
// Generate instances
for(Annotation sAnnotation : sAnnotations) {
//Sentence sentenceAnnotation = (Sentence) sAnnotation;
//String sentence = sentenceAnnotation.getCoveredText();
Iterator<Annotation> predicateIterator = pAnnotations.subiterator(sAnnotation);
while(predicateIterator.hasNext()) {
Annotation pAnnotation = predicateIterator.next();
Predicate predicateAnnotation = (Predicate) pAnnotation;
if(predicateAnnotation.getKind().equals("PROPBANK")) {
//String sS = sentence.replace(';', ',');
String sP = predicateAnnotation.getRoot().getCoveredText().replace(';', ',');
String sP_DESC = "";
if(predicateAnnotation.getDescription() != null)
sP_DESC = predicateAnnotation.getDescription().replace(';', ',');
String sA0 = "", sA1 = "", sA2 = "";
String sA0_DESC = "", sA1_DESC = "", sA2_DESC = "";
// Fetch data
FSArray array = predicateAnnotation.getArguments();
if(array != null) {
for(int i = 0; i < array.size(); i++) {
Argument argument = (Argument) array.get(i);
if(argument.getLabel().equalsIgnoreCase("A0")) {
sA0 = argument.getCoveredText().replace(';', ',');
if(argument.getDescription() != null)
sA0_DESC = argument.getDescription().replace(';', ',');
}
else if(argument.getLabel().equalsIgnoreCase("A1")) {
sA1 = argument.getCoveredText().replace(';', ',');
if(argument.getDescription() != null)
sA1_DESC = argument.getDescription().replace(';', ',');
}
else if(argument.getLabel().equalsIgnoreCase("A2")) {
sA2 = argument.getCoveredText().replace(';', ',');
if(argument.getDescription() != null)
sA2_DESC = argument.getDescription().replace(';', ',');
}
}
}
// Classify the instance
try {
List<DomainActionNode> roots = classifier.classifyPredicate(sP, sP_DESC, sA0, sA0_DESC, sA1, sA1_DESC, sA2, sA2_DESC);
navigate(predicateAnnotation, roots, aJCas);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//
subMonitor.worked(1);
}
//
subMonitor.done();
}
private void navigate(Predicate predicate, List<DomainActionNode> nodes, JCas aJCas) {
for(DomainActionNode root : nodes)
navigate(predicate, root, null, aJCas);
}
private DomainAction navigate(Predicate predicate, DomainActionNode node, DomainAction parent, JCas aJCas) {
DomainAction annotation = null;
String labelName = node.getLabel();
double confidence = node.getConfidence();
int ranking = node.getRanking();
Token action = predicate.getRoot();
//
annotation = AnnotationGenerator.generateDomainAction(predicate.getBegin(), predicate.getEnd(), action, labelName, confidence, ranking, aJCas);
//
List<DomainActionNode> childs = node.getChildrens();
List<DomainAction> childAnnotations = new ArrayList<DomainAction>();
for(DomainActionNode child : childs) {
DomainAction childAnnotation = navigate(predicate, child, annotation, aJCas);
if(childAnnotation != null)
childAnnotations.add(childAnnotation);
}
AnnotationGenerator.generateDomainAction(annotation, parent, childAnnotations, aJCas);
//
return annotation;
}
@Override
public void destroy() {
classifier = null;
super.destroy();
}
}