Mendapatkan antonim untuk sebuah kata di java - Wordnet JWI
Saya tertarik menemukan antonim untuk sebuah kata yang menggunakan wordnet di Java. Saat ini saya menggunakan metode ini untuk menemukan antonim tetapi saya belum menemukan kata-kata yang memiliki antonim. Apakah antonim tidak umum di Wordnet? Atau apakah implementasi ini cacat?
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());
}
Saya menguji dengan kata-kata ini:
String[] testWords = {"able", "unable", "adsorbent", "apple", "tart", "computer", "cat", "great", "allowable"};
tetapi mereka semua mengembalikan daftar kosong. Saya memeriksa semua part of speech (POS) untuk kata:
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;
}
Saya menggunakan pendekatan yang sama untuk menemukan sinonim tetapi memeriksa apakah jenis penunjuk terkait dengan / hypernym / etc ... dan berhasil dengan implementasi itu.
Info lain:
The dict
variabel adalah obyek IDictionary dari ( edu.mit.jwi.IDictionary
)
Jawaban
Saya pikir Anda salah relatedMap
. Saya telah mengubah kode Anda seperti ini dan berhasil:
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());
}