2016-05-25 3 views
1

2人の単語の間に最初の一般的なハイパーリンクを検索するにはどのように良い方法が分かりますか?私は特定の単語から最初のレベル(直接の親)にアクセスできますが、別の単語と一致するまで、この単語からすべての上位語( "上がっていく")を検索する方法に固執しています。アイデアは、どこに/いつ/ 2つの単語が、それらのルートに基づいてWordNetを通して "同じ"とみなせるかを特定することです(見つからなければ、単語の終わりまで続けるべきです)。私はここでいくつかの話題を見つけましたが、PythonとPerlでは、この問題に特化したものはありません。WordNet(JWI)を使用している2つの単語間の一般的なハイパーリンク -

WordNetからSynsetID、WordIDおよびその他の情報にアクセスするのにJWI(2.4.0)を使用しています。その仕事をするより簡単なAPIがあれば、それも歓迎です。以下は、私が言及した上位語を提供する方法です。

辞書と我々が結果として持っている単語「犬」(あなたは、私はちょうどこのメソッドを実行するための最初の意味をusingnだ見ることができるように)提供
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("}"); 

    } 

} 

:人のために

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} 

答えて

1

を興味があるかもしれない。しばらくして私はそれを理解した。

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

待機。すべての "ソリューション"は、所定のsynsetIdのsynset hiearchyを歩いています。共通のハイパーシンをどうやって入手するのか分かりましたか?直感的に言えば、両方の単語のハイパーニム(あなたのソリューションのような)のリストを得ることができると思います。そして、ソリューションは両方のリストで最初に出現するIDです。しかし、これは実際にはやや直観的ではない結果をもたらす。例:女性/男性を試してください –

+0

このようなものです(許されないほどの遅れで申し訳ありません)。第1レベルの単語synsets(ベース)でWSD(単語の曖昧さ回避)を行うと、これらの種類のもの(非直感的な関係)を大幅に緩和することができます –

関連する問題