Log in Help
Print
Homereleasesgate-8.0-build4825-ALLpluginsTermRaidersrcgatetermraiderapply 〉 TermScoreCopier.java
 
/*
 *  Copyright (c) 2012--2014, The University of Sheffield. See the file
 *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 *
 *  $Id: TermScoreCopier.java 17968 2014-05-11 16:37:34Z ian_roberts $
 */
package gate.termraider.apply;

import gate.Annotation;
import gate.AnnotationSet;
import gate.FeatureMap;
import gate.ProcessingResource;
import gate.Resource;
import gate.creole.AbstractLanguageAnalyser;
import gate.creole.ExecutionException;
import gate.creole.ExecutionInterruptedException;
import gate.creole.ResourceInstantiationException;
import gate.creole.metadata.CreoleParameter;
import gate.creole.metadata.CreoleResource;
import gate.creole.metadata.RunTime;
import gate.termraider.bank.AbstractTermbank;
import gate.termraider.util.ScoreType;
import gate.termraider.util.Term;
import java.text.NumberFormat;
import java.util.Map;
import java.util.Set;



@CreoleResource(name = "Termbank Score Copier",
    icon = "termbank-lr.png",
    comment = "Copy scores from Termbanks back to their source annotations",
    helpURL = "http://gate.ac.uk/userguide/sec:creole:termraider:copier")
public class TermScoreCopier extends AbstractLanguageAnalyser
  implements  ProcessingResource {

  private static final long serialVersionUID = -6975121300500542261L;
  
  /* CREOLE PARAMETERS */
  private AbstractTermbank termbank;
  private String annotationSetName;
  private String frequencyFeature, docFrequencyFeature;
  
  
  public Resource init() throws ResourceInstantiationException {
    return super.init();
  }
  
  
  public void reInit() throws ResourceInstantiationException {
    this.init();
  }
  
  
  public void execute() throws ExecutionException {
    interrupted = false;
    long startTime = System.currentTimeMillis();
    if(document == null) { throw new ExecutionException(
        "No document to process!"); }
    fireStatusChanged("Running " + this.getName() + " on " + document.getName());
    fireProgressChanged(0);

    if (this.termbank == null) {
      throw new ExecutionException("Termbank must be set!");
    }
    
    Set<String> annotationTypes = termbank.getInputAnnotationTypes();
    String termFeature = termbank.getInputAnnotationFeature();
    String languageFeature = termbank.getLanguageFeature();
    
    AnnotationSet candidates = document.getAnnotations(annotationSetName).get(annotationTypes);
    checkInterruption();
    
    for (Annotation candidate : candidates) {
      Term term = new Term(candidate, document, languageFeature, termFeature);
      FeatureMap fm = candidate.getFeatures();

      // What the heck, slap them all on the annotation features.
      // You can't put too many features in a nuclear reactor.
      Map<ScoreType, Number> scoreMap = termbank.getScoreMap(term);
      for (ScoreType st : scoreMap.keySet()) {
        fm.put(st.toString(), scoreMap.get(st));
      }
      
      checkInterruption();
    } // end for candidates loop
    
    fireProcessFinished();
    fireStatusChanged("Finished " + this.getName() + " on "
        + document.getName() + " in "
        + NumberFormat.getInstance().format(
            (double)(System.currentTimeMillis() - startTime) / 1000)
        + " seconds!");
  } // end execute()
  
  
  private void checkInterruption() throws ExecutionInterruptedException {
    if(isInterrupted()) { throw new ExecutionInterruptedException(
        "Execution of " + this.getName() + " has been abruptly interrupted!"); }
  }
  
  
  /* CREOLE METHODS */
  
  @RunTime
  @CreoleParameter(comment = "Termbank (source of annotation type and scores)")
  public void setTermbank(AbstractTermbank termbank) {
    this.termbank = termbank;
  }
  
  public AbstractTermbank getTermbank() {
    return this.termbank;
  }
  
  
  @RunTime
  @CreoleParameter(comment = "annotation feature for term frequency (blank to ignore)",
      defaultValue = "frequency")
  public void setFrequencyFeature(String feature) {
    this.frequencyFeature = feature;
  }
  
  public String getFrequencyFeature() {
    return this.frequencyFeature;
  }
  
  
  @RunTime
  @CreoleParameter(comment = "annotation feature for document frequency (blank to ignore)",
      defaultValue = "docFrequency")
  public void setDocFrequencyFeature(String feature) {
    this.docFrequencyFeature = feature;
  }
  
  public String getDocFrequencyFeature() {
    return this.docFrequencyFeature;
  }
  
  
  @RunTime
  @CreoleParameter(comment = "AnnotationSet name",
          defaultValue = "")
  public void setAnnotationSetName(String name) {
    this.annotationSetName = name;
  }
  
  public String getAnnotationSetName() {
    return this.annotationSetName;
  }
  
}