2016-03-16 9 views
2

В настоящее время я пытаюсь семантически сопоставить два предложения в ws4j. Я реализовал концепцию на уровне слов, но мне трудно реализовать ее на уровне предложения и получить результат в виде матрицы, как показано на онлайн-демо. Как разработать код, чтобы сделать то же самое?Семантическое сопоставление в ws4j на уровне предложения

import java.util.List; 
import edu.cmu.lti.ws4j.impl.Lesk; 
import edu.cmu.lti.jawjaw.pobj.POS; 
import edu.cmu.lti.lexical_db.ILexicalDatabase; 
import edu.cmu.lti.lexical_db.NictWordNet; 
import edu.cmu.lti.lexical_db.data.Concept; 
import edu.cmu.lti.ws4j.Relatedness; 
import edu.cmu.lti.ws4j.RelatednessCalculator; 

public class WordMatcher1 { 
public static void main(String[] args) 
{ 
    String word1="rifle"; 
    String word2="gun"; 

    ILexicalDatabase db = new NictWordNet(); 
    RelatednessCalculator lesk = new Lesk(db); 

    List<POS[]> posPairs = lesk.getPOSPairs(); 
    double maxScore = -1D; 

    for(POS[] posPair: posPairs) 
    { 
     String p1 = null,p2 = null; 
     List<Concept> synsets1 = (List<Concept>)db.getAllConcepts(word1, posPair[0].toString()); 
     List<Concept> synsets2 = (List<Concept>)db.getAllConcepts(word2, posPair[1].toString()); 

     for(Concept ss1: synsets1) 
     { 
      for (Concept ss2: synsets2) 
      { 
       p1 = ss1.getPos().toString(); 
       p2 = ss2.getPos().toString(); 
       Relatedness relatedness = lesk.calcRelatednessOfSynset(ss1, ss2); 
       double score = relatedness.getScore(); 
       if (score > maxScore) 
       { 
        maxScore = score; 
       } 

      } 
     } 

     if (maxScore == -1D) 
     { 
      maxScore = 0.0; 
     } 
     System.out.println("sim('" + word1 +" "+ p1 +"', '" + p2 +" "+ word2+ "') = " + maxScore); 
    } 
} 
+0

просьба сообщить подробности, показать, что вы пытались помочь другим внести свой вклад. – user3639557

+1

http://stackoverflow.com/users/3639557/user3639557 Я применил API, который я реализовал. Он производит правильные значения для слов, но значения мусора для предложений –

ответ

0

У меня была аналогичная проблема, и этот пример работал:

import java.util.List; 
import edu.cmu.lti.jawjaw.pobj.POS; 
import edu.cmu.lti.lexical_db.ILexicalDatabase; 
import edu.cmu.lti.lexical_db.NictWordNet; 
import edu.cmu.lti.lexical_db.data.Concept; 
import edu.cmu.lti.ws4j.Relatedness; 
import edu.cmu.lti.ws4j.RelatednessCalculator; 
import edu.cmu.lti.ws4j.impl.Lesk; 
import edu.cmu.lti.ws4j.util.WS4JConfiguration; 

public class LeskSimilarity{ 

    public static void main(String[] args) { 
    ILexicalDatabase db = new NictWordNet(); 
    RelatednessCalculator lesk = new Lesk(db); 
    String word1="rifle"; 
    POS posWord1= POS.n; 
    String word2= "gun"; 
    POS posWord2= POS.n; 
    double maxScore = 0; 

     WS4JConfiguration.getInstance().setMFS(true); 

     List<Concept> synsets1 = (List<Concept>)db.getAllConcepts(word1, posWord1.name()); 
     List<Concept> synsets2 = (List<Concept>)db.getAllConcepts(word2, posWord2.name()); 

     for(Concept synset1: synsets1) { 
      for (Concept synset2: synsets2) { 
       Relatedness relatedness =  lesk.calcRelatednessOfSynset(synset1, synset2); 
      double score = relatedness.getScore(); 
      if (score > maxScore) { 
       maxScore = score; 
      } 
      } 
     } 

    if (maxScore == -1D) { 
     maxScore = 0.0; 
    } 

    System.out.println("Similarity score of " + word1 + " & " + word2 + " : " + maxScore); 
    } 
}