Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Strings nach Häufigkeit bewerten (https://www.delphipraxis.net/107050-strings-nach-haeufigkeit-bewerten.html)

hanspeter 21. Jan 2008 13:16


Strings nach Häufigkeit bewerten
 
Hallo,
ich möchte ein kleines Problem lösen und habe noch keinen richtigen Plan, wie ich das angehen kann.
Vielleicht hat wer einen Denkanstoss, wie man die Lösung angehen könnte.

Hier das Problem.

In einer Datenbank werden für eine Veranstaltung jedem Teilnehmer ein Sportverein zugeordnet.
Da die Daten aus unterschiedlichen Quellen stammen, liegt oftmal eine unterschiedliche Schreibweise des gleichen
Vereins vor.
Das wird bisher manuell korrigiert.
Ich möchte das ganze zumindest programmtechnisch unterstützen, das evenduell zusammengehörende Schreibweisen
sortiert angezeigt werden.

Beispiel:

Korrekte Schreibweise Sportclub im ASV Landau e.V.

Weitere mögliche Schreibweisen:
SC Landau
S.Club Landau
Sportclub Landau
SV Landau
SC im ASV Landau

Das ganze noch wahlfrei mit oder ohne den Zusatz "e.V."

Also der Ort wiederholt sich n mal.
Aus etwa 200 bis 300 Einträgen möchte ich eine Sortierung ähnlich dieser Liste anzeigen.

Der Anwender soll dann zusammengehörende Bezeichner auswählen und auf einen einheitlichen Stand ändern.
Hat wer eine Idee wie man das Problem angehen könnte?

Gruß
Peter

marabu 21. Jan 2008 13:44

Re: Strings nach Häufigkeit bewerten
 
Hallo Peter,

zum Thema "Ähnlichkeit von Zeichenketten" hatte ich vor einiger Zeit einen Beitrag mit einem Link geschrieben: klick

Vielleicht kommst du beim Lesen auf ein paar Ideen.

Freundliche Grüße

himitsu 21. Jan 2008 13:47

Re: Strings nach Häufigkeit bewerten
 
Du könntest erstmal alles rausfiltern, was nicht benötigt wird (im, SC, S.Club, Sportclub usw.) und wenn dann möglichst nur noch der Stadtname vorhanden ist, dann diesen in den restlichen Einträgen suchen.

Wird aber bei größeren Städten bestimmt wieder Probleme geben (hier in DD haben wir ja auch nicht nur einen SC).


es gibt auch irgendwo eine Funktion (vergess ständig wie die heißt), welche einen String prozentual vergleicht (also wieviel übereinstimmt)


[add]
in PHP gibt's Fu nktionen wie SoundEx Levenshtein
> http://www.selfphp.info/praxisbuch/p...e=177&group=31
[/add]

[add2]
ich würd mal denken, das bei dir keine/kaum Schreibfehler vorkommen, aber die Wörte wohl auch mal in einer etwas anderen Reihnfolge vorkommen können.
Also wäre es vermutlich besser den String in seine Einzelwörter zu zerlegen (bestimmte Schlüsselwörter wie "im", "Sportclub", "SC" usw. zu entfernen, mit sowas wie Levenshtein zu vergleichen und die Ergebnisse zusammenzurechnen)
[/add2]



womöglich könnte man das dann mit 'ner erweiterbaren List optimieren.

also wo alle bisher bekannten Möglichkeiten für jeden Sportclub drinsteht.
> erst schaut das Programm in die Liste ob es den Namen schon kennt
> wenn er ihn schon kennt, dann trägt er den "bevorzugten" Namen ein
> und wenn nicht, dann wird halt der Benutzer gefragt, ob er den Namen aus der Liste (bevorzugte Namen) auswählt (vo das Programm wieder wie oben eine Vorauswahl anzeigt)
> und wenn da nichts vorhanden ist, dann alle Sportclubs anzeigen und eventuell einen neuen Namen eintragen

hanspeter 21. Jan 2008 14:14

Re: Strings nach Häufigkeit bewerten
 
Mit der Filtermethode könnte es gehen.
Ich habe eine Liste mit der korrekten Schreibweise aller Vereine.
Ganz ohne manuelle Auswahl wird es wohl nicht gehen, da in der gleichen
Stadt mehrere Vereine vorhanden sein können, die sich im dümmsten Fall nur
durch den Zusatz unterscheiden.

z.B. RC oder RV als Vorsatz sind unterschiedliche Bezeichner.

Gruß
Peter

himitsu 21. Jan 2008 14:26

Re: Strings nach Häufigkeit bewerten
 
bei der Auswahl durch's Programm meinte ich auch einen direkten Vergleich ... also wenn die Schreibweise genau übereinstimmt.

würde jedenfalls viel Arbeit ersparren, da dann für eine bestimmte "falsche" Schreibweise nur noch inmal ausgewählt (durch Benutzer) werden müßte und alles was genauso benannt ist dann automatisch umbenannt würde.

ich denk mal ihr bearbeitet diese Liste nicht nur einmal und da kennt das Programm bei weiteren Durchläufen schon viele Namen und der Benutzer hat immer weniger zu tun.

hanspeter 21. Jan 2008 14:45

Re: Strings nach Häufigkeit bewerten
 
Zitat:

Zitat von himitsu
ich denk mal ihr bearbeitet diese Liste nicht nur einmal und da kennt das Programm bei weiteren Durchläufen schon viele Namen und der Benutzer hat immer weniger zu tun.

Doch die Datenbank wird 4 Wochen vor einer Veranstaltung erstellt und nach der Veranstaltung aus statistischen Gründen archiviert.
Für die folgende Veranstaltung erfolgt eine Neuerfassung. Die Meldungen kommen per Post,email, telefonisch.
Gerade bei Post oftmals unleserliche Handschriften.
Ich führe allerdings ein Archiv mit, um bei zukünftigen Erfassungen Schreibarbeit zu sparen.


Gruß
Peter

himitsu 21. Jan 2008 15:27

Re: Strings nach Häufigkeit bewerten
 
Also doch nicht nur einmal ;)

nja, es müßten ja nur die Vereinsnamen in den bisher aufgefundenen Schreibweisen gespeichert und beim nächsten Mal wiederverwendet werden.

Delphi-Quellcode:
var Namensliste: Array of Array of record
  Name: string;
  Vergleich: Integer;
end;

NamensListe[0][0] := 'Sportclub im ASV Landau e.V.';
NamensListe[0][1] := 'SC Landau';
NamensListe[0][2] := 'S.Club Landau';
NamensListe[0][3] := 'Sportclub Landau';
NamensListe[0][4] := 'SV Landau';
NamensListe[0][5] := 'SC im ASV Landau';
NamensListe[1][0] := 'nächster SC...'
// läßt sich auch anders speichern verkettete Listen und so
// aber hier macht sich als bevorzugter Namen wohl die [...][0]

// schauen ob der Name schon vorhanden ist
for i := 0 to High(NamensListe) do
  for i2 := 0 to High(NamensListe[i]) do
  begin
    if NamensListe[i][i2].Name = Vereinsname then
    begin
      Vereinsname := NamensListe[i][0].Name;
      exit;
    end;
    // da wir schon einmal die Liste durchgehn,
    // können wir auch gleich hier zurücksetzen
    NamensListe[i][i2].Vergleich := 0;
  end;

// Name in Einzelwörter zerlegen
A := Splitt(Vereinsname, ' ');
// Wörter wie "Sportclub" "SC" "im" usw. entfernen
Filter(A);
// Vergleichswerte zurücksetzen
(* wurde oben schon gemacht
for i := 0 to High(NamensListe) do
  for i2 := 0 to High(NamensListe[i]) do
    NamensListe[i][i2].Vergleich := 0;*)
// Vergleichen
for i := 0 to High(NamensListe) do
  for i2 := 0 to High(NamensListe[i]) do
    for i3 := 0 to High(A) do
      inc(NamensListe[i][i2].Vergleich, SoundEx(A[i3]));

// je größer jetzt NamensListe[i][i2].Vergleich ist, umso größe wäre wohl die Ähnlichkeit

// namen mit größter Warscheinlichkeit raussuchen und von denen den Index 0 anzeigen
// [i][0] entspricht hier ja dem bevorzugten Namen

hanspeter 22. Jan 2008 08:01

Re: Strings nach Häufigkeit bewerten
 
Zitat:

Zitat von himitsu
Also doch nicht nur einmal ;)

nja, es müßten ja nur die Vereinsnamen in den bisher aufgefundenen Schreibweisen gespeichert und beim nächsten Mal wiederverwendet werden.

Danke erst mal für den Vorschlag.
Ich werde so einen Weg, aber gerade umgekehrt gehen.
Ich werde est mal alle Sonderzeichen und Worte mit der Länge 1 streichen.
Anschließend alle bekannten Zusätze wie Verein,Club u.s.w.
Den Rest vergleiche ich dann über die Soundex Funktion.

Mit Gruß
Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 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-2025 by Thomas Breitkreuz