2 つの単語の間の最初の一般的なハイパーニムを取得する良い方法を知っている人はいますか? 特定の単語から最初のレベル (直接の親) にアクセスできますが、別の単語と一致するまで、この単語からすべてのハイパーニム (「上がる」) を取得する方法に行き詰まっています。アイデアは、どこで/いつ/どの 2 つの単語が、その語根に従って WordNet を介して「同じ」と見なすことができるかを特定することです (見つからない場合は、wordnet の単語の終わりまで続ける必要があります)。ここでいくつかのトピックを見つけましたが、Python と Perl については、JAVA でのこの問題に固有のものはありません
WordNet から SynsetID、WordID、およびその他の情報にアクセスするために JWI (2.4.0) を使用しています。仕事をするより単純な API がある場合も歓迎します。以下は、私が言及した上位概念を提供するメソッドです。
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}