package gannuWSD.algorithms;
import gannuNLP.data.AmbiguousWord;
import gannuNLP.data.Input;
import gannuNLP.data.Sense;
import gannuNLP.overlapmeasures.OverlapMeasure;
import gannuNLP.overlapmeasures.Word;
import gannuWSD.testing.Decision;
import java.util.ArrayList;
/**
* Simplified lesk algorithm as proposed by Kilgarriff and Rosenzweig
* in "Framework and Results for English SENSEVAL".
* You can specify the OverlapMeasure by setting the parameter "scoring:gannu.overlapmeasures.yourSelectedClassName;".
* @author Francisco Viveros-Jiménez
*
*/
public class SimplifiedLesk extends WSDAlgorithm {
/**
* OverlapMeasure for calculating the overlaps.
*/
OverlapMeasure scoring;
public SimplifiedLesk()
{
super();
this.name="SimplifiedLesk";
}
@Override
public Decision disambiguate(AmbiguousWord target, ArrayList<AmbiguousWord> window) throws Exception
{
System.out.print(".");
ArrayList<Sense> senses=target.getSenses();
Decision decision=new Decision(target,window);
int i;
for(i=0;i<senses.size();i++)
{
ArrayList<String> dwords=new ArrayList<String>();
double w=0.0;
for(AmbiguousWord winWord:window)
{
if(winWord.getSenses().size()>0)
{
for(Sense s:winWord.getSenses())
{
w+=this.scoring.calculateOverlap(senses.get(i).getBagOfWords(), s.getSynonyms(), dwords);
}
}
else
{
if(senses.get(i).getBagOfWords().contains(winWord.getLemma()))
{
w+=1.0;
dwords.add(winWord.getLemma());
}
}
}
dwords.trimToSize();
decision.setSense(i, w, dwords);
}
decision.calculateAnswer();
return decision;
}
@Override
public boolean IsUseful(AmbiguousWord target, AmbiguousWord windowWord)
throws Exception {
for(Sense s:target.getSenses())
for(String word:s.getBagOfWords())
if(word.equals(windowWord.getLemma()))
return true;
return false;
}
@Override
public void init(Input document)throws Exception {
System.out.println();
if(this.getValue("scoring")==null)
{
this.scoring=(OverlapMeasure)new Word();
}
else
{
this.scoring=(OverlapMeasure)Class.forName(this.getValue("scoring")).newInstance();
}
}
}