Java dilinde bir kelimenin zıt anlamlılarını öğrenin - Wordnet JWI

Dec 22 2020

Java'da wordnet kullanarak bir kelime için zıt anlamlı sözcükler bulmakla ilgileniyorum. Şu anda bu yöntemi zıt sözcükleri bulmak için kullanıyorum, ancak zıt anlamlı sözcükleri bulamadım. Wordnet'te zıtlık yaygın değil mi? Yoksa bu uygulama kusurlu mu?

public List<String> getAntonyms(String baseWord) {
    List<String> synonymList = new ArrayList<>();
    IIndexWord[] baseWordPOS = getAllPOSForBaseWord(baseWord);
    for (IIndexWord iIndexWord : baseWordPOS) {
        if (iIndexWord == null) {
            continue;
        }
        for (IWordID wordID : iIndexWord.getWordIDs()) {
            IWord word = dict.getWord(wordID);
            ISynset synset = word.getSynset();
            Map<IPointer, List<ISynsetID>> relatedMap = synset.getRelatedMap();
            for (Map.Entry<IPointer, List<ISynsetID>> entry : relatedMap.entrySet()) {
                IPointer iPointer = entry.getKey();
                if (iPointer.equals(Pointer.ANTONYM)) {
                    List<ISynsetID> iSunsetIDS = entry.getValue();
                    for (ISynsetID iSynsetID : iSunsetIDS) {
                        ISynset synset1 = dict.getSynset(iSynsetID);
                        for (IWord w : synset1.getWords()) {
                            synonymList.add(ConvertToPolyFormat(w.getLemma()));
                        }
                    }
                }
            }
        }
    }
    return synonymList.stream()
            .distinct()
            .filter(s -> !s.equals(baseWord))
            .collect(Collectors.toList());
} 

Şu kelimelerle test ediyorum:

String[] testWords = {"able", "unable", "adsorbent", "apple", "tart", "computer", "cat", "great", "allowable"};

ancak hepsi boş listeler döndürür. Kelimenin tüm konuşma bölümlerini (POS) kontrol ediyorum:

private static final POS[] POS_ARRAY = {POS.ADJECTIVE, POS.ADVERB, POS.NOUN, POS.VERB};
private IIndexWord[] getAllPOSForBaseWord(String baseWord) {
    IIndexWord[] returnValue = new IIndexWord[4];
    for (int i = 0; i < returnValue.length; i++) {
        returnValue[i] = dict.getIndexWord(baseWord, POS_ARRAY[i]);
    }
    return returnValue;
}

Eş anlamlıları bulmak için aynı yaklaşımı kullandım, ancak işaretçi türünün / hypernym / etc ... ile ilişkili olup olmadığını kontrol ettim ve bu uygulamada başarılı oldum.

Diğer bilgiler:

dictDeğişken (bir ıdictionary amacı edu.mit.jwi.IDictionary)

Yanıtlar

1 ThuatNguyen Dec 23 2020 at 15:59

Sanırım yanılıyorsun relatedMap. Kodunuzu böyle ve başarıyla değiştirdim:

public List<String> getAntonyms(String baseWord) {
    List<String> synonymList = new ArrayList<>();
    IIndexWord[] baseWordPOS = getAllPOSForBaseWord(baseWord);
    for (IIndexWord iIndexWord : baseWordPOS) {
        if (iIndexWord == null) {
            continue;
        }
        for (IWordID wordID : iIndexWord.getWordIDs()) {
            IWord word = dict.getWord(wordID);

            Map<IPointer, List<IWordID>> relatedMap = word.getRelatedMap();
            for (Map.Entry<IPointer, List<IWordID>> entry : relatedMap.entrySet()) {
                IPointer iPointer = entry.getKey();
                if (iPointer.equals(Pointer.ANTONYM)) {
                    List<IWordID> iWordIDs = entry.getValue();
                    for (IWordID iWordID : iWordIDs) {
                        IWord iWord = dict.getWord(iWordID);
                        ISynset synset = iWord.getSynset();
                        for (IWord w : synset.getWords()) {
                            synonymList.add(ConvertToPolyFormat(w.getLemma()));
                        }
                    }
                }
            }
        }
    }
    return synonymList.stream()
            .distinct()
            .filter(s -> !s.equals(baseWord))
            .collect(Collectors.toList());
}