Wer auf WordNet mit Java zugreifen will, der stößt über kurz oder lang auf die freie Bibliothek JWNL - Java WordNet Library. Wenn man allerdings versucht diese mit einer aktuellen Version WordNet zu nutzen schmeißt sie nur mit komischen Fehlermeldungen um sich - selbst wenn man den Pfad zur Datenbank in der Konfigurationsdatei richtig angegeben hat.
Das Problem dabei ist, dass JWNL nur mit WordNet 2.0 für Windows zusammenarbeiten will - was freundlicherweise nirgends (deutlich) erwähnt wird.
Kurzanleitung für den Einsatz von WordNet unter Java:
- WordNet runterladen und installieren (nur Windows)
- JWNL runterladen, die Klassen (commons-logging,jwnl und utilities) in den Build-Path einbinden
- In der Datei file_properties.xml den Pfad auf das Unterverzeichnis dict der WordNet Installation verweisen lassen.
- Mit JWNL.initialize(new FileInputStream(”path/to/file_properties.xml”) und Dicitornary wordnet = Diricotnary.getInstance() eine neune Insatnz von Wordnet bzw. JWNL erzeugen.
- Danach kann man mit wordnet.lookupAllIndexWords(String) auf die Wordnet Datenbank zugreifen.
Hier eine Beispielklasse die die wichtigsten Wordnet API-Calls demonstriert:
package utils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import net.didion.jwnl.JWNLException;
import net.didion.jwnl.data.IndexWord;
import net.didion.jwnl.data.IndexWordSet;
import net.didion.jwnl.data.PointerUtils;
import net.didion.jwnl.data.Synset;
import net.didion.jwnl.data.list.PointerTargetNode;
import net.didion.jwnl.data.list.PointerTargetNodeList;
import net.didion.jwnl.dictionary.Dictionary;
public class WordNetUtils {
private Dictionary wordnet = null;
public WordNetUtils() {
this.wordnet = Dictionary.getInstance();
}
public List
List
IndexWordSet iws;
try {
iws = wordnet.lookupAllIndexWords(word);
IndexWord[] words = iws.getIndexWordArray();
for (int i1 = 0; i1 < words.length; i1++) {
syns.addAll(getAllSynonyms(words[i1]));
}
} catch (JWNLException e) {
e.printStackTrace();
}
return syns;
}
@SuppressWarnings(”unchecked”)
private List
List
Synset[] senses = w.getSenses();
for (int i = 0; i < senses.length; i++) {
// PROCESS SYNONYMS
PointerTargetNodeList relatedList = PointerUtils.getInstance()
.getSynonyms(senses[i]);
Iterator
while (it.hasNext()) {
PointerTargetNode elem = (PointerTargetNode) it.next();
Synset s = elem.getSynset();
for (int j = 0; j < s.getWords().length; j++) {
syns.add(s.getWord(j).getLemma());
}
}
// PROCESS HYPERNYMS
relatedList = PointerUtils.getInstance().getDirectHypernyms(
senses[i]);
it = relatedList.iterator();
while (it.hasNext()) {
PointerTargetNode elem = (PointerTargetNode) it.next();
Synset s = elem.getSynset();
for (int j = 0; j < s.getWords().length; j++) {
syns.add(s.getWord(j).getLemma());
}
}
// PROCESS HYPONYMS
relatedList = PointerUtils.getInstance().getDirectHyponyms(
senses[i]);
it = relatedList.iterator();
while (it.hasNext()) {
PointerTargetNode elem = (PointerTargetNode) it.next();
Synset s = elem.getSynset();
for (int j = 0; j < s.getWords().length; j++) {
syns.add(s.getWord(j).getLemma());
}
}
}
return syns;
}
List
for (int i = 0; i < toks.size(); i++) {
retval.addAll(this.getSynonyms(toks.get(i)));
}
return retval;
}
Set
for (Iterator
String name = (String) iterator.next();
retval.addAll(this.getSynonyms(name));
}
return retval;
}
}
0 Responses to “WordNet mit JWNL”
Leave a Reply