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:
dict
Değ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());
}
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Charly Reynolds Yakın Zamandaki Vokal Kord Ameliyatını Açıkladı: 'Şarkı Söylemekte Sorun Yaşıyordum'
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı