2016-05-25 17 views
1

Weiß jemand wie eine gute Möglichkeit, den ersten gemeinsamen Hypernym zwischen zwei Wörtern zu erhalten? Ich kann auf die erste Ebene (direktes Elternteil) von einem gegebenen Wort zugreifen, aber ich bin darauf angewiesen, wie man alle Hypernyms ("aufwärts") von diesem Wort abruft, bis es mit einem anderen Wort übereinstimmt. Die Idee ist zu identifizieren, wo/wann/welche zwei Wörter über WordNet als "gleich" betrachtet werden können (falls nicht gefunden, sollte es bis zum Ende der Wörter in Wordnet weitergehen). Ich habe hier einige Themen gefunden, aber für Python und Perl, nichts spezifisch für dieses Problem in JAVAGemeinsamer Hypernym zwischen zwei Wörtern mit WordNet (JWI) - JAVA

Ich benutze JWI (2.4.0), um SynsetID, WordID und andere Informationen aus WordNet zugreifen. Wenn es eine einfachere API gibt, ist der Job auch willkommen. Hier unten ist die Methode, die das erwähnte Hypernym bereitstellt.

public void getHypernyms(IDictionary dict_param, String lemma_param) throws IOException { 
    dict_param.open(); 
    // get the synset 
    IIndexWord idxWord = dict_param.getIndexWord(lemma_param, POS.NOUN); 

    // 1st meaning 
    IWordID wordIDb = idxWord.getWordIDs().get(0); 
    IWord word = dict_param.getWord(wordIDb); 

    ISynset synset = word.getSynset(); 
    System.out.println("Synset = " + synset); 

    // get the hypernyms by pointing a list of <types> in the words 
    List<ISynsetID> hypernyms = synset.getRelatedSynsets(Pointer.HYPERNYM); 

    // print out each h y p e r n y m s id and synonyms 
    List<IWord> words, wordsb; 

    for (ISynsetID sid : hypernyms) { 

     words = dict_param.getSynset(sid).getWords(); 
     System.out.println("Lemma: " + word.getLemma()); 
     System.out.print("Hypernonyms = " + sid + " {"); 

     for (Iterator<IWord> i = words.iterator(); i.hasNext();) { 
      System.out.print(i.next().getLemma()); 

      if (i.hasNext()) { 
       System.out.print(", "); 
      } 

     } 
     System.out.println("}"); 

    } 

} 

ein Wörterbuch Providing und das Wort „Hund“ wir als Ergebnis haben (wie man sehen kann ich usingn nur die erste Bedeutung dieser Methode auszuführen):

Synset = SYNSET{SID-02084071-N : Words[W-02084071-N-1-dog, W-02084071-N-2 domestic_dog, W-02084071-N-3-Canis_familiaris]} 

Lemma: dog Hypernonyms = SID-02083346-N {canine, canid} 
Lemma: dog Hypernonyms = SID-01317541-N {domestic_animal, domesticated_animal} 

Antwort

1

Für diejenigen, die könnte interessiert sein. Nach einiger Zeit habe ich es herausgefunden.

public List<ISynsetID> getListHypernym(ISynsetID sid_pa) throws IOException { 
    IDictionary dict = openDictionary(); 
    dict.open(); //Open the dictionary to start looking for LEMMA 
    List<ISynsetID> hypernym_list = new ArrayList<>(); 

    boolean end = false; 

    while (!end) { 
     hypernym_list.add(sid_pa); 
     List<ISynsetID> hypernym_tmp = dict.getSynset(sid_pa).getRelatedSynsets(Pointer.HYPERNYM); 
     if (hypernym_tmp.isEmpty()) { 
      end = true; 
     } else { 
      sid_pa = hypernym_tmp.get(0);//we will stick with the first hypernym 
     } 

    } 

    //for(int i =0; i< hypernym_list.size();i++){ 
    // System.out.println(hypernym_list.get(i)); 
    //} 
    return hyp; 
} 
+0

Warten. Alles, was Ihre "Lösung" tut, ist die Synset-Hierarchie für die gegebene synsetId zu gehen. Hast du jemals herausgefunden, wie man den gewöhnlichen Hypernym bekommt? Intuitiv, ich schätze, wir können die Liste der Hypernyme (wie Ihre Lösung) für beide Wörter bekommen, dann ist die Lösung die erste ID, die in beiden Listen vorkommt. Aber das gibt tatsächlich etwas nicht-intuitive Ergebnisse. Bsp: Versuch Frau/Mann –

+0

So etwas (Entschuldigung für die unverzeihliche Verzögerung). Wenn Sie WSD (Wort Sinn Disambiguierung) mit der ersten Ebene der Wörter-Synsets (Basis) tun, kann diese Art von Sachen (nicht intuitive Beziehungen) stark gemildert werden –