Abfrage um identische Werte mit unterschiedlichen Schreibweisen zu erhalten

Hallo zusammen,

könnt ihr mir bei folgendem weiterhelfen?
Es geht darum, dass ich unsere postgresql (10) Datenbank gerne etwas aufräumen würde, welche um ehrlich zu sein etwas vernachlässigt wurde.

Folgendes Problem:
Es sind Text-Attribute vorhanden, in welche z.B. Firmen-Namen eingetragen werden. Leider wurde den Mitarbeitern hier Freitext ohne Kontrolle gestattet, weshalb z.B. folgende Werte eingegeben werden konnten: Siemens, Siemens AG, Siemens Hans Walter GmbH usw.
In dem Beispiel sollen alle EIngaben zur Firma Siemens gehören.
Das ist wie gesagt nur ein Beispiel. Diese Probleme möchte ich gerne identifizieren bzw. es für die Zukunft vermeiden.

Um erstmal weiter zu kommen habe ich Abfragen erstellt und per distinct bzw. order by alles übersichtlich angeordnet, damit ich manuell die Übertäter identifizieren und das ganze dann per Hand lösen kann.
Ich habe mich jedoch gefragt, ob so eine Auswertung auch automatisiert erfolgen könnte?
Sprich eine Abfrage, die alle Werte auflistet, die oder dessen Teile in anderen Werten auftauchen. Oben würde “Siemens” dann in so einer Auswertung auftauchen (es muss irgendwie erkannt werden, dass die o.g. Firmen vermuttlich eine einzelne Firma meinen). Mir ist klar, dass das nicht das einfachste ist aber ich würde einfach gerne wissen ob es irgendeinen halbwegs einfachen Ansatz gibt um soetwas zu mindestens näherungsweise zu erreichen.

Manuell würde ich das mit dem Like-Operator machen (where value like ‘%Siemens%’ or…), jedoch muss ich dafür natürlich für jede Firma erstmal eine entsprechende Abfrage einbauen, damit soetwas auffällt. Gibt es irgendweine Möglichkeit Daten bzw. Strings so zu analysieren, dass solche Ähnlichkeiten automatisiert ermittelt werden können?

Wenn die Daten dann sauber sind, werde ich entsprechend automatisiert Dropdown-Listen daraus erzeugen lassen. Hier wäre es jedoch praktisch, wenn man eben o.g. Problem nicht wieder durch eine solche Abfrage hinein hollt.

Vielen Dank schon mal.

Gruß
Andreas

Update:
Ich glaube die Funktion “soundex” könnte ein guter Ansatz sein, jedoch funktioniert diese Funktion bei uns auf dem Server offensichtlich nicht, da ich eine entsprechende Fehlermeldung bekomme, wenn ich diese testen woll…

Vielleicht könnte dir die Levenstein-Distance helfen. Das ist die Anzahl der Änderungen, die du brauchst um von Wort1 zu Wort2 zu kommen. Also so Hand zu Hund = 1
Gruß Uwe

Hallo Andreas,

wenn Du LIKE nutzt, trifft ‘Siemens’ nicht auf ‘siemens’.
ILIKE wäre besser.
Die Levenstein-Distance betrachte ich bei Firmeneinträgen mit allen möglichen Abkürzungen eher kritisch: “IG”-“AG”-“KG”

Ich würde z.B. bei Neueinträgen das erste Token/Wort abtrennen, und gezielt nach Datensätzen suchen die dieses Token enthalten.
Evtl hilft Dir da die Volltextsuche: du kannst Stopworte etc definieren, damit nicht Rechtsformen wie “GmbH”, “KG”, “AG” usw Falschtreffer erzeugen…
Für Akronyme wie “BMW”, “DLRG” lassen sich, soweit ich weiss, Referenzeinträge anlegen.
Ich habe mich zwar noch nicht weiter damit beschäftigt, suche aber auch eine Möglichkeit um doppelte Firmeneinträge zu erkennen und zu markieren.

Wenn es um längere Firmennamen geht, wo sich auch mal Tippfehler einschleichen, könnte ich mir phonetische Funktionen vorstellen.
Ich nutze, um phonetische Ähnlichkeiten von Ansprechpartnern zu erkennen, eine Perlfunktion
die ich in eine Postgres UDF integriert habe.
Sie funktioniert IMHO besser als Soundex

( https://metacpan.org/pod/release/STEFANOS/Text-Phonetic-Phonet-1.0/Phonet.pm

Da kommt dann so etwas raus, als Beispiel:

select phonet(‘andreas’) : “ANTRIZ”
select phonet(‘Meier’) : “NEIA”
select phonet(‘Mayer’) : “NEIA”
select phonet(‘Müller-Lüdenscheidt’’) : “NILA LITENZEIT”
Diese phonetischen Token könnte man ebenfalls abfragen.

Es gibt auch die Kölner Phonetik, die sich als SQL-Funktion einbinden lässt, und im Ergebnis einen mit Zahlen codierten text ausgibt:

SELECT public.kp_phonetic_mw(‘Müller-Lüdenscheidt’): “657 5268” , oder auch
SELECT public.kp_phonetic(‘Müller-Lüdenscheidt’): “65752682”

VG
Andreas