Montag, 6. September 2010

Java

Levenshtein Distance in Java

Ähnlichkeit von Strings in Java?

Mit dem Levenshtein Algorithmus kann man herausfinden, wie ähnlich sich zwei Strings sind.

Sprachen wie PHP bringen einen Stringähnlichkeitsvergleich (z.B. levenshtein) schon mit.

Wer hingegen die Ähnlichkeit von Strings in Java vergleichen muss, der nimmt entweder das grosse Java Commons Packet, oder behilft sich mit dieser Java Levenshtein-Klasse.

Ursprünglich wurde diese Levenshtein Implementierung von Chas Emerick geschrieben.

Download Code!

  1. public class MyPhonetic {
  2.  
  3.   public static int getLevenshteinDistance (String s, String t) {
  4.     if (s == null || t == null) {
  5.       throw new IllegalArgumentException("Strings must not be null");
  6.     }    
  7.     int n = s.length(); // length of s
  8.     int m = t.length(); // length of t
  9.      
  10.     if (n == 0) {
  11.       return m;
  12.     } else if (m == 0) {
  13.       return n;
  14.     }
  15.  
  16.     int p[] = new int[n+1]; //'previous' cost array, horizontally
  17.     int d[] = new int[n+1]; // cost array, horizontally
  18.     int _d[]; //placeholder to assist in swapping p and d
  19.  
  20.     // indexes into strings s and t
  21.     int i; // iterates through s
  22.     int j; // iterates through t
  23.  
  24.     char t_j; // jth character of t
  25.  
  26.     int cost; // cost
  27.  
  28.     for (i = 0; i<=n; i++) {
  29.        p[i] = i;
  30.     }
  31.      
  32.     for (j = 1; j<=m; j++) {
  33.        t_j = t.charAt(j-1);
  34.        d[0] = j;
  35.      
  36.        for (i=1; i<=n; i++) {
  37.           cost = s.charAt(i-1)==t_j ? 0 : 1;
  38.           // minimum of cell to the left+1, to the top+1, diagonally left and up +cost                         
  39.           d[i] = Math.min(Math.min(d[i-1]+1, p[i]+1),  p[i-1]+cost);  
  40.        }
  41.  
  42.        // copy current distance counts to 'previous row' distance counts
  43.        _d = p;
  44.        p = d;
  45.        d = _d;
  46.     }
  47.      
  48.     // our last action in the above loop was to switch d and p, so p now
  49.     // actually has the most recent cost counts
  50.     return p[n];
  51.   }
  52. }
Bewertung: 4 von 5, 2 Stimme(n) 2027 Klicks
Algorithmus, Java, Levenshtein
Von Mr.Foo in Java am 06.09.10@17:18 Uhr

Trackbacks
Trackback für spezifische URI dieses Eintrags

Keine Trackbacks

3 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

Draot - #1 - 28.09.2010 11:33 - (Antwort)

Sind die Strings von einem Benutzer eingegeben eignet sich die Damerau-Levenshtein-Distanz besser. Da hier vertausche Buchstaben mit einer Distanz von 1 und nicht von 2 angegeben werden.
Bsp.:
distanz("foobar","foobra);

Levenshtein = 2
Damerau-Levenshtein =1

S - #2 - 21.11.2011 14:58 - (Antwort)

Echt Interessant. Kannst du ein Beispiel geben für was man die Distanz in der Praxis gebrauchen könnte?

Mr. Foo - #2.1 - 24.11.2011 18:03 - (Antwort)

Beispielweise für eine Funktion, welche eine Suche nach ähnlichen Wörtern realisiert.

So könnte das aussehen:
Man sucht nach "standart" und bekommt vorgeschlagen:
"Meinten Sie standard?"


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

Levenshtein Distance in Java

  • Homepage

Suche

Kategorien

  • Android (2)
  • C-Sharp (4)
  • Datenbank (29)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (15)
  • Internet (88)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (101)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (129)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (60)
  • Sonstiges (47)
  • Own Stuff (48)
  • Spass (45)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (17)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Mai 2012
  • April 2012
  • März 2012
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Sicherheit Software Sonstiges Spass Tipp Update Windows

Beliebte Einträge

  • Magento ist scheisse (197)
  • Plugin-container.exe deaktivieren (107)
  • BWin Betrug und Abzocke bei Minigames? (64)
  • C compiler cannot create executables unter Debian (53)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (43)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (28)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (28)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

Oliver Riske zu Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden
Di, 15.05.2012 20:38
Super Danke!
anon zu BWin Betrug und Abzocke bei Minigames?
Sa, 05.05.2012 18:43
ihr scheiss betrüger
Jürgen zu Unable to elevate error:1814 VLC Problem
Mi, 02.05.2012 16:54
So einfach ist es bei mir jedenfal [...]
Jonny zu BWin Betrug und Abzocke bei Minigames?
Di, 24.04.2012 13:56
Ihr seid fast alle BERTS. Kein Pla [...]
Johnny zu Plugin-container.exe deaktivieren
Sa, 21.04.2012 18:30
Cooler Trick! MFG Johnny
 

Kontakt/Informationen