Mit DISCO semantisch ähnliche Wörter finden

Posted on Apr 28, 2013 in Java | 5 Comments
Mit DISCO semantisch ähnliche Wörter finden

Das Thema semantische Suche und Web 3.0 ist ja seit geraumer Zeit ein Thema. Für ein aktuelles Projekt habe ich mich auf die Suche nach einer Bibliothek gemacht, die zu gegebenen Begriffen semantisch verwandte Wörter findet. Dabei bin ich auf DISCO gestoßen. DISCO ist eine Java basierte Anwendung, die in der Lage ist, semantisch ähnliche Begriffe zu finden. Dabei bietet DISCO folgende Funktionen:

  • Semantisch ähnlichste Wörter zu einem Eingabewort ausgeben: Z.B. schüchtern → scheu hölzern nervös unbeholfen ängstlich zurückhaltend ratlos naiv steif unsicher schweigsam
  • Größe der semantischen Ähnlichkeit zwischen zwei Eingabewörtern anzeigen: sim(Erdöl, Benzin) = 0,323; sim(Erdöl, Zuckerguss) = 0,016
  • Kollokationen zu einem Eingabewort ausgeben: Bier → tranken trinken brauen alkoholfreien trinkt braute gebraut zapfen ausgeschenkt Oktoberfest Pilsner

DISCO bietet verschiedenste Sprachdateien, darunter auch deutsch. Damit ist DISCO für viele interessant, die beispielsweise eine Verschlagwortung, einen Klassifikator oder eine Suche entwickeln oder verbessern wollen.

Das Projekt wurde von Peter Kolb entwickelt, der in der Computerlinguistik und Germanistischen Linguistik zuhause ist und dieses Thema im Rahmen seiner Magisterarbeit bearbeitet hat. Besonders klasse finde ich es, dass DISCO unter der Apache Lizenz zur Verfügung gestellt wurde. Dabei wird auf riesige Textbestände aus Wikipedia, dem Projekt Gutenberg und weitere Text-Korpora zurückgegriffen. Die deutschen Sprachdateien sind 3,4 GB groß.

In Java ist DISCO ziemlich schnell eingebunden. DISCO verwendet den Lucene Index, daher muss man die nötige JAR einbinden. In Maven funktioniert das mit folgender Abhängigkeit:

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>3.5.0</version>
</dependency>

Um nun DISCO zu verwenden, muss man die DISCO API herunterladen und in das eigene Projekt einbinden. Nun kann man die Klasse DISCO verwenden:

DISCO disco = new DISCO("C:\\disco-language-de", false);
int freq = disco.frequency("Fisch");
ReturnDataCol[] similarWords = disco.collocations("Fisch");
for(int i=0; i&lt;similarWords.length; i++)
    System.out.println(similarWords[i].word + ": "
         + similarWords[i].value);

In diesem Beispiel wird zuerst die Klasse DISCO instanziiert. Der Konstruktor benötigt als ersten Parameter den Speicherort der DISCO Sprachdateien. Der zweite Parameter gibt an, ob die Sprachdateien in den Speicher geladen werden sollen. Anschließend wird geprüft, ob für das Wort “Fisch” semantisch ähnliche Worte vorhanden sind (freq). Anschließend werden semantisch ähnliche Worte abgerufen und aufgelistet. Der zweite Wert ist ein Score Wert für die Ähnlichkeit.

Meeresfrüchte: 18.9
Fleisch: 15.6
Geflügel: 15.599999
Krabben: 13.599999
Gemüse: 12.6
Milchprodukte: 10.9
Fisch: 10.6
Sushi: 10.5
frisst: 9.9
fangen: 9.4
...

An diesem Beispiel sieht man gut, dass DISCO mit wenigen Zeilen eingebunden ist. Gerade für das Anbieten von verwandten Begriffen, für eine Verschlagwortung oder für das Anreichern von Text (z.B. für einen Klassifikator) ist DISCO eine hervorragende Bibliothek. Insbesondere die Einfachheit ist bemerkenswert. Aber auch die Treffer können sich sehen lassen, das Ganze funktioniert schon recht gut.

Zur Webseite von DISCO: http://www.linguatools.de/disco/disco.html

5 Comments

  1. Markus
    28. April 2013

    Warum sind denn Meeresfrüchte und Fleisch ähnlicher zu Fisch, als Fisch selbst? Würde man nicht eine maximale Ähnlichkeit erwarten, wenn man ein Wort mit sich selbst vergleicht?

  2. Tobi
    28. April 2013

    Ich verstehe nicht, warum Fisch überhaupt erneut auftaucht. Aber scheint wohl eine Macke von DISCO zu sein. Aber da müsste man sich näher mit der Funktionsweise befassen.

    Viele Grüße
    Tobi

  3. harald
    29. April 2013

    Interessant. Leider aber scheint das deutsche Wörterbuch nicht unter der Apache Lizenz verfügbar zu sein. Wäre interessant zu wissen, wieviel man hier für die kommerzielle Verwendung berappen muss.

  4. Links #5 | Björn Salgert
    1. Mai 2013

    [...] Mit DISCO semantisch ähnliche Wörter finden [...]

  5. Peter
    18. August 2013

    Fisch taucht nochmal auf, weil die im obigen Beispiel verwendete Methode disco.collocations() die Wörter zurückliefert, die häufig gemeinsam mit Fisch auftauchen (“Essen Sie Fisch! Fisch ist gesund!”). Bei den semantisch ähnlichen Wörtern, die man mit disco.similarWords() erhält, ist Fisch nicht dabei. Und disco.firstOrderSimilarity(“Fisch”,”Fisch”) ergibt ~1.0.

Leave a Reply