Levenshtein Distanz mit linearem Speicherverbrauch

Folgendes Groovy Skript berechnet die Levenshtein Distanz zweier Zeichenketten. Die Levenshtein Distanz ist ein Maß bezüglich der Operationen Ersetzen, Einfügen und Löschen, um die Gleichheit beider Zeichenketten zu erreichen. In anderen Worten, die Levenshtein Distanz ist ein Maß für die Ähnlichkeit zweier Zeichenketten. Der Algorithmus benötigt im Gegensatz zur normalen Implementierung nur linearen Speicherplatz.


01 /**
02  * Berechnet die Levensthein Distanz der beiden Strings x und y.
03  
04  @param x String x des Vergleichs, nicht null.
05  @param y String y des Vergleichs, nicht null.
06  @return die Levensthein Distanz der beiden Strings x und y
07  */
08 int linearLD(String x, String y) {
09   int n = y.length();
10   int m = x.length();
11  
12   if (n == 0return m;
13   if (m == 0return n;
14  
15   def T = [];
16   T[00;
17   for (j in 1..n) {
18     T[j= T[j-11;
19   }
20   for (i in 1..m) {
21     def s = T[0];
22     T[0= T[01;
23     def c = T[0];
24     for (j in 1..n) {
25       def sub = s + (x.charAt(i-1== y.charAt(j-11);
26       def del = T[j1;
27       def ins = c + 1;
28       c = Math.min(Math.min(sub, del), ins);
29       s = T[j];
30       T[j= c;
31     }
32   }
33   return T[n];
34 }
35 
36 println linearLD("Lin""Lang");

Das Ergebnis des Aufrufs lautet 2, da zwei Operationen zum Angleichen der Zeichenketten notwendig wären.

Hier der Algorithmus nochmal in Java:


01 public class LinearLD {
02 
03   /**
04    * Berechnet die Levensthein Distanz der beiden Strings x und y.
05    
06    @param x String x des Vergleichs, nicht null.
07    @param y String y des Vergleichs, nicht null.
08    @return die Levensthein Distanz der beiden Strings x und y
09    */
10   public static int linearLD(String x, String y) {
11     int n = y.length();
12     int m = x.length();
13    
14     if (n == 0return m;
15     if (m == 0return n;
16    
17     int[] T = new int[n+1];
18     T[00;
19     for (int j=1; j <= n; j++) {
20       T[j= T[j-11;
21     }
22     for (int i=1; i<=m; i++) {
23       int s = T[0];
24       T[0= T[01;
25       int c = T[0];
26       for (int j=1; j<=n; j++) {
27         int sub = s + (x.charAt(i-1== y.charAt(j-11);
28         int del = T[j1;
29         int ins = c + 1;
30         c = Math.min(Math.min(sub, del), ins);
31         s = T[j];
32         T[j= c;
33       }
34     }
35     return T[n];
36   }
37   
38   public static void main(String[] args) {
39     System.out.println(LinearLD.linearLD("""Tier"));
40   }
41 }

Ein praktischer Anwendungsfall für die Berechnung der Levenshtein Distanz ist z.B. im Falle der automatisierten Zusammenführung von unterschiedlichen Stammdatenbeständen gegeben, in denen etwa Vergleiche auf Personen- oder Ortsnamen durchgeführt werden müssen, und in denen Umlaute unterschiedliche dargestellt (z.B. ü und ue) werden.

6 Comments

Groovy Dateien bedingt löschen

Hier ein kleines Groovy Skript um bedingt Dateien zu löschen. Klar gibt es dazu auch Möglichkeiten in einer Kommando Shell, aber die wären einfach nicht groovy ;-)


01 import org.apache.commons.io.FileUtils;
02 
03 destDir = new File("D:/Verzeichnis/Unterverzeichnis");
04 
05 destDir.eachDir {
06   it.eachFile {
07     if (it.length() == 0) {
08       println "Lösche: " + it;
09       FileUtils.forceDelete(it);
10     }
11   }
12 }

FileUtils ist übrigens Bestandteil von http://commons.apache.org/

No Comments

JavaFX Kalender

Seit mitte Dezember liegt nun JavaFX in der Version 1.0 vor.  Im Fokus der neuen Skriptsprache liegt die schnelle und einfache Erstellung von grafisch aufwändigen Desktopapplikationen. Sun verspricht hier nicht zuviel, die Einarbeitung in die Skriptsprache ist dank der umfassenden Dokumentation und der zahlreichen Beispiele auf http://java.sun.com/javafx/reference/docs.jsp sehr einfach. Als Entwicklungsumgebung für JavaFX empfiehlt sich Netbeans http://www.netbeans.org/features/javafx/index.html, welche neben der gewohnten Editorfunktionalität, wie Syntax Highlighting, Codevervollständigung, usw. auch vorgefertigte Codeteile anbietet, welche vom Entwickler per Drag&Drop eingefügt werden können. Allein die eingebaute Preview-Funktion, die sich während des Entwickelns automatisch aktualisiert führt gelegentlich zu etwas nervigen Stacktraces.

Hier also das Ergebnis meins ersten JavaFX-Skripts:

calendar21

Einige der eingefleischten Java-Entwickler werden mit Sicherheit das Gefühl haben, mit JavaFX eine Art Applet 2.0 vor sich liegen zu haben, während andere wiederum sicher an Java2D erinnert werden. JavaFX ist aber deutlich mehr, insbesondere was neue Sprachkonstrukte wie etwa das Bindings zum Binden von Attributen an Variablen für eine automatische Aktualisierung angeht und gerade bei Animationen seine Stärke zeigt. Die Sprache an sich besitzt einen starken deklarativen Charakter und vermittelt das Gefühl einem Baukasten gleich grafische Basiskomponenten zu einer funktionalen Desktopapplikation zusammenzusetzen. Interessant fand ich die schier unerschöpfliche Auswahl bei vordefinierten Color Konstanten, endlich steht die “Farbe” Transparent zur Auswahl.

JavaFX bietet dem Entwickler die Möglichkeit schnell und einfach grafisch beeindruckende Desktopapplikationen zu erstellen. Ich kann mir vorstellen, dass sich besonders im Mobil-Device Bereich neue Möglichkeiten ergeben. Was jedoch funktional aufwändige Applikationen angeht, bleibt fraglich, ob JavaFX hier eine entscheidende Rolle spielen wird und kann.

No Comments

Java3D auf Vista 64

Nachdem meine Versuche die JMonkeEngine auf Grund der darunterliegenden Bibliothek lwjgl mit Vista 64 zu laufen zu bringen gescheitert sind, bin ich für meine Versuche wieder auf Java 3D ausgewichen. Java 3D läuft sowohl mit der 32bit Variante des JDK’s als auch mit der 64bit Variante problemlos auf Vista 64. Wie früher auch ziehen die Beispiele einiges an Prozessorleistung.

Tags:

No Comments

3D Java: JMonkeyEngine

Was die JMonkeyEngine angeht, so scheint diese auf den ersten Blick ziemlich professionelle Anwendungen, zumindest Demos, hervorzubringen. Diverse Screenshots und Videos auf youtube führen zunächst zu ungläubigen Staunen, was mittlerweile mit Java alles möglich ist. Klar, die Grafik kann sich nicht mit der gängiger Spieletitel messen, aber mit der Optik populärer MMO’s wie World of Warcraft kann Java mittlerweile mithalten.

Die JMonkeyEngine in eigenen Projekten zu verwenden gestaltet sich jedoch schwieriger als zunächst erwartet. Für Version 1 gibt es die Libraries zum Download, jedoch lässt die Dokumentation zu wünschen übrig. Die Wiki Anleitung empfiehlt das Open Source Projekt bei java.net mittels cvs auszuchecken. Dies läuft relativ problemlos, doch scheiterte ich am compillieren der Sourcen. Es schien, als wäre gerade jemand dabei gewesen, Code einzuchecken, hatte aber dabei einige Dateien vergessen, was mich in eine Sackgasse führte. Also Versuch 2 mit Version 2 des Projekts, diesmal aber als svn Projekt. Auschecken wieder kein Problem, jedoch streikte diesesmal der Compiler mit einem OutOfMemory, was aber an meinem Vista 64 System liegen kann. Diverse Kommentare im svn log führten mich auf die richtige Fährte, das Problem behob sich mittels höherer Memory Einstellungen im ant Buildfile. Der Test führte mich dann dennoch in eine Sackgasse, denn die benötigten lwjgl Bibliotheken, auf die JMonkeyEngine aufbaut bringt eigene .dll Bibliotheken für den Zugriff auf opengl mit, die jedoch nur für die 32bit Version von Windows zur Verfügung stehen.

Fazit: Die Probleme mit 64bit Systemen und die mangelhafte Dokumentation lassen mich derzeit vor dem Einsatz der JMonkeyEngine abraten, ich rate hier doch zu dem bewährten Java3d, welches sowohl unter 32bit als auch 64bit Systemen einwandfrei arbeitet.

Tags: ,

No Comments