Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Ähnliche strings finden (wie z.B. google Suche) (https://www.delphipraxis.net/216534-aehnliche-strings-finden-wie-z-b-google-suche.html)

user69 14. Jan 2025 06:05

Ähnliche strings finden (wie z.B. google Suche)
 
Hallo,

Vielleicht kannmir da ja irgendwer weiterhelfen….

Gibt es eine Weg oder eine Komponente, wo ich ähnliche strings finden kann?
Also allgmein umz.B. Schreibfehler beseitigen bzw ähnliche schreibweisen zu finden (nicht per Rechtschribung).

Jasocul 14. Jan 2025 06:15

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Meinst du etwas wie https://docwiki.embarcadero.com/Libr...rUtils.Soundex oder https://www.gausi.de/approxstrutils-en.html?

TigerLilly 14. Jan 2025 08:30

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Suche mal nach Levenshtein-Distanzwerte und dann lies das hier
https://xprofan.net/intl/de/quelltex...r-algorithmus/

Viuelleicht hilft das?

joachimd 14. Jan 2025 09:04

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Levenshtein und soundex sind nicht ganz so gut für deutsch. Kälner Phonetik bringt dich hier weiter.

Gausi 14. Jan 2025 09:19

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Warum sollte Levenshtein nicht gut sein für die deutsche Sprache? Das Verfahren ist doch komplett unabhängig von der Sprache, und zählt einfach die minmale Anzahl von Ersetzungen/Einfügen/Entfernen-Operationen auf Zeichenebene. Ob ich da deutsche oder englische Wörter oder ein Stück DNA-Code reinschmeiße, ist völlig egal.

Wenn man also ähnliche Strings finden möchte, ist das unabhängig von der Sprache gut geeignet. Für ähnlich klingende Worte (Meier, Mayer etc.) dann tatsächlich nicht unbedingt, und dafür sind dann sprachabhängige Algorithmen sinnvoll. Die Frage ist dann aber, inwiefern diese lautbasierten Verfahren Buchstabendreher erkennen können, oder wie diese mit anderen Zeichen (Klammern, Satzzeichen, ...) umgehen. Kommt halt auf den Anwendungsfall an.

Für die Titelsuche in meinem mp3-Player fahre ich mit Levenshtein (das ist ja in meinen oben verlinkten ApproxStrUtils implementiert) ganz gut - und da habe ich ja auch Fälle wie "Pink" und "P!nk" und ähnliche Scherze. ;-)

Edit: @TigerLilly: danke für den Link. Die Ergänzung mit "Verdreher als eine Operation zählen" muss ich mir mal genauer anschauen. Das scheint mir eine sinnvolle Ergänzung zu sein.

joachimd 14. Jan 2025 09:29

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Zitat:

Zitat von Gausi (Beitrag 1545157)
Warum sollte Levenshtein nicht gut sein für die deutsche Sprache?

Mit Levenshtein bildest Du nur die Anzahl der Ersetzungen ab, nicht unbedingt ähnlich klingende Worte. Dafür gibt es ja soundex - das aber nur im englischen richtig funktioniert. Oder eben die Kölner Phonetik, welche speziell für die deutsche Sprache entwickelt wurde.

Edit: Beispiel Maier und Meyr haben eine Distanz von 3, bei Kölner Phonetik sind beide identisch

himitsu 14. Jan 2025 09:46

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Zitat:

Zitat von Gausi (Beitrag 1545157)
Warum sollte Levenshtein nicht gut sein für die deutsche Sprache?

Jupp, bei Levenstein wäre es praktisch egal, aber bei Soundex ....

Zitat:

Zitat von Gausi (Beitrag 1545157)
Wenn man also ähnliche Strings finden möchte, ist das unabhängig von der Sprache gut geeignet. Für ähnlich klingende Worte (Meier, Mayer etc.) dann tatsächlich nicht unbedingt, und dafür sind dann sprachabhängige Algorithmen sinnvoll. Die Frage ist dann aber, inwiefern diese lautbasierten Verfahren Buchstabendreher erkennen können, oder wie diese mit anderen Zeichen (Klammern, Satzzeichen, ...) umgehen. Kommt halt auf den Anwendungsfall an.

z.B. 'ne KI/AI oder ein Embedding nutzen.

Gausi 14. Jan 2025 09:46

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Das stimmt schon, aber dann ist die eigentliche Aussage ja, dass Levenshtein nicht gut geeignet ist für Sprache.

Levenshtein und SoundEx (und verwandte Verfahren) sind halt völlig verschiedene Ansätze - einmal reine Betrachtung der Zeichenketten, und dann die (sprachabhängige) Umsetzung dieser Zeichenketten in akkustische Signale. Was sinnvoller ist, hängt vom Anwendungsfall ab.

Nebenbei, semi-OT: Was macht eigentlich Soundex bei englischen Inkonsistenzen wie "tough" und "though"? :gruebel: Oder anders: Sollen diese beiden Worte als ähnlich gelten (sehr ähnliche Zeichenketten), oder als grundverschieden (völlig andere Aussprache)?

joachimd 14. Jan 2025 09:52

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Zitat:

Zitat von Gausi (Beitrag 1545164)
Was macht eigentlich Soundex bei englischen Inkonsistenzen wie "tough" und "though"?

dasselbe T200 https://de.toolpage.org/tool/soundex

Frickler 14. Jan 2025 10:29

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Jasocul (Beitrag 1545140)

Soundex ist für Englisch. Für deutsche Texte gibts die "Kölner Phonetik" (siehe Anhang; aus dem Delphi-Treff).

stahli 14. Jan 2025 10:42

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Hier hatten wir mal einiges zusammengetragen:
https://www.delphipraxis.net/154811-...rozentual.html

TigerLilly 14. Jan 2025 12:54

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Noch eine Option - aber auch das hängt vom Anwendungsfall ab - wäre via API ChatGPT (oder andere) zu fragen, ob zwei Worte ähnlich sind.

Zitat:

Ordne die Worte Mayer, Maier, Maierhofer, Müller, Apfel absteigend nach ihrer Ähnlichkeit mit dem Wort Meier.
Zitat:

Die Ähnlichkeit der Worte zum Wort „Meier“ basiert auf Buchstaben- und Lautähnlichkeiten. Absteigend geordnet ergibt sich folgende Reihenfolge:

1. **Maier** (nur ein Buchstabe Unterschied, sehr ähnlich in Schreibweise und Klang)
2. **Mayer** (ähnlich in Schreibweise, gleiche Lautung wie „Meier“ in manchen Regionen)
3. **Maierhofer** (enthält „Maier“ und ist somit ein erweiterter Begriff)
4. **Müller** (unterschiedliche Buchstaben und Lautung, aber beide Namen, schwächere Ähnlichkeit)
5. **Apfel** (keine Ähnlichkeit zu „Meier“ in Buchstaben oder Klang)

Diese Ordnung orientiert sich an der phonetischen und orthografischen Nähe der Wörter zu „Meier“.

himitsu 14. Jan 2025 14:26

AW: Ähnliche strings finden (wie z.B. google Suche)
 
Code:
text = ["Meier", "Maier", "Mayer"]
test = embedding_model.encode(text)
print(f"{text[0]} {text[1]} ", cosine_similarity(test[0], test[1]))

text = ["tough", "though"]
test = embedding_model.encode(text)
print(f"{text[0]} {text[1]} ", cosine_similarity(test[0], test[1]))

text = ["Baum", "Tanne"]
test = embedding_model.encode(text)
print(f"{text[0]} {text[1]} ", cosine_similarity(test[0], test[1]))

text = ["Nadelbaum", "Laubbaum"]
test = embedding_model.encode(text)
print(f"{text[0]} {text[1]} ", cosine_similarity(test[0], test[1]))

text = ["Hamster", "Goldfisch", "Schäferhund", "Dackel"]
test = embedding_model.encode(text)
print(f"{text[0]} {text[1]} ", cosine_similarity(test[0], test[1]))
print(f"{text[2]} {text[3]} ", cosine_similarity(test[2], test[3]))

text = ["Mann", "Frau", "Junge", "Bube", "Auto", "Haus"]
test = embedding_model.encode(text)
print(f"{text[0]} {text[1]} ", cosine_similarity(test[0], test[1]))
print(f"{text[2]} {text[3]} ", cosine_similarity(test[2], test[3]))
print(f"{text[4]} {text[5]} ", cosine_similarity(test[4], test[5]))
Code:
intfloat/multilingual-e5-large

Meier Maier 0.93333364
tough though 0.86950207
Baum Tanne 0.79528135
Nadelbaum Laubbaum 0.8690178
Hamster Goldfisch 0.80143225
Schäferhund Dackel 0.786349
Mann Frau 0.86286455
Junge Bube 0.83770347
Auto Haus 0.8216029
Ehrlich gesagt, hätte ich die Hunde in der Ähnlichkeit höher erwartet, als die anderen Tiere.

OK, passt doch
Code:
Alignment-Lab-AI/e5-mistral-7b-instruct

Meier Maier 0.93829346
tough though 0.7688065
Baum Tanne 0.90267164
Nadelbaum Laubbaum 0.88353676
Hamster Goldfisch 0.78831625
Schäferhund Dackel 0.844885
Mann Frau 0.84775054
Junge Bube 0.8940252
Auto Haus 0.67513704

Achtung, Alignment-Lab-AI/e5-mistral-7b-instruct benötigt 32 GB RAM. :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz