22 Nov 2007, 05:30

WordNet mit JWNL

Share

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<string> getSynonyms(String word) {
List</string><string> syns = new ArrayList</string><string>();
IndexWordSet iws;
try {
iws = wordnet.lookupAllIndexWords(word);
IndexWord[] words = iws.getIndexWordArray();
for (int i1 = 0; i1 &lt; words.length; i1++) {
syns.addAll(getAllSynonyms(words[i1]));
}
} catch (JWNLException e) {
e.printStackTrace();
}
return syns;
}</string>

@SuppressWarnings("unchecked")
private List<string> getAllSynonyms(IndexWord w) throws JWNLException {
List</string><string> syns = new ArrayList</string><string>();
Synset[] senses = w.getSenses();
for (int i = 0; i &lt; senses.length; i++) {
// PROCESS SYNONYMS
PointerTargetNodeList relatedList = PointerUtils.getInstance()
.getSynonyms(senses[i]);
Iterator</string>

<pointertargetnode> it = relatedList.iterator();
while (it.hasNext()) {
PointerTargetNode elem = (PointerTargetNode) it.next();
Synset s = elem.getSynset();
for (int j = 0; j &lt; 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 &lt; 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 &lt; s.getWords().length; j++) {
syns.add(s.getWord(j).getLemma());
}
}
}
return syns;
}</pointertargetnode>public List<string> getSynonyms(List</string><string> toks) {
List</string><string> retval = new ArrayList</string><string>();
for (int i = 0; i &lt; toks.size(); i++) {
retval.addAll(this.getSynonyms(toks.get(i)));
}
return retval;
}</string>public Set<string> getSynonyms(Set</string><string> toks) {
Set</string><string> retval = new HashSet</string><string>();
for (Iterator</string><string> iterator = toks.iterator(); iterator.hasNext();) {
String name = (String) iterator.next();
retval.addAll(this.getSynonyms(name));
}
return retval;
}
}
</string>