Общий Hypernym между двумя словами, используя WordNet (JWI) - JAVA

Кто-нибудь знает, как можно найти первый общий гиперный между двумя словами? Я могу получить доступ к первому уровню (непосредственному родителю) из данного слова, но я застрял в том, как извлечь все гипернимки ("повышающиеся") из этого слова, пока оно не совпадет с другим словом. Идея состоит в том, чтобы определить, где / когда / какие два слова можно считать "одинаковыми" через WordNet в соответствии с их корнем (если он не найден, он должен продолжаться до конца слов в wordnet). Я нашел некоторые темы здесь, но для Python и Perl, ничего особенного для этой проблемы в JAVA

Я использую JWI (2.4.0) для доступа к SynsetID, WordID и другой информации из WordNet. Если есть более простой 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}

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;
}
Другие вопросы по тегам