phonetische Dubletttensuche?

28. Oktober 2009 10:16

Hallo an die Navision-Gemeinde!

Ich muss unter 3.7 einen einfachen phonetischen Doublettenabgleich bauen.
Hat hier jemand dafür ein Beispiel?

Ich meine, ich hätte hier mal irgendwas gesehen, finde es aber nicht mehr.

Vielen Dank im Voraus!

Tom

Re: phonetische Dubletttensuche?

28. Oktober 2009 10:18

schau dir mal die Kontaktsuche im Standard an.
die macht sowas in der Art.

(ich weiss aber nicht, ob auch schon in der Version 3.7)

Re: phonetische Dubletttensuche?

28. Oktober 2009 10:29

Was soll das denn leisten? Soll das erkennen, dass Meier so ähnlich wie Maja klingt? Oder Meyer und Maier finden?

Re: phonetische Dubletttensuche?

28. Oktober 2009 14:22

Was soll das denn leisten? Soll das erkennen, dass Meier so ähnlich wie Maja klingt? Oder Meyer und Maier finden?


Genau das.

Re: phonetische Dubletttensuche?

28. Oktober 2009 14:36

tba hat geschrieben:schau dir mal die Kontaktsuche im Standard an.
die macht sowas in der Art.

(ich weiss aber nicht, ob auch schon in der Version 3.7)

bin mir da relativ sicher, dass das die Standard suche nicht macht!
Sie nimmt nur die einzelnen Zeichen (ersten 5 oder letzten 5) und filtert quasi mit nem *...

Re: phonetische Dubletttensuche?

28. Oktober 2009 14:41

bin mir da relativ sicher, dass das die Standard suche nicht macht!

Da liegst Du aber falsch.
Genau das macht diese Funktion.
Meier findet Meyer, Mayer, Maier etc.

Gruss

Re: phonetische Dubletttensuche?

28. Oktober 2009 14:51

martinst hat geschrieben:
bin mir da relativ sicher, dass das die Standard suche nicht macht!

Da liegst Du aber falsch.
Genau das macht diese Funktion.
Meier findet Meyer, Mayer, Maier etc.

Gruss

Ich bin fest davon überzeugt, dass dies kein Feature von NAV, sondern eines vom SQL-Server ist.

Ich habe irgendwo in meiner Tools-DB noch zwei Varianten einer phonetischen Suche (zumindest die Berechnung des phonetischen Wertes)...
C99996 TextManagement.txt

Code:
Soundex(Text : Text[1024]) Result : Text[10]
KölnerPhonetik(Text : Text[1024]) Result : Text[1024]
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: phonetische Dubletttensuche?

28. Oktober 2009 14:52

martinst hat geschrieben:Genau das.

Eine 1a-Antwort auf eine Entweder-Oder-Frage :mrgreen:

Re: phonetische Dubletttensuche?

28. Oktober 2009 15:04

Das ist kein SQL-Feature oder sonst was ähnliches.
Die Kontaktsuche in NAV findet NATIV und SQL die Namen phonetisch.
meier findet meier,meyer,maier,mayer etc.

Re: phonetische Dubletttensuche?

28. Oktober 2009 15:31

@ Timo: Danke, das war das was ich gesehen hatte. Muss ich mal testen.

Ansonsten schaue ich auch mal gerne in die Kontaktsuche. Ab welcher Version? Ich geh mal von 4.0 aus.

Vorerst schon mal ein herzliches Danke an die Runde.

Wenn noch jemandem was einfällt.......

Schöne Grüsse

Tom

Re: phonetische Dubletttensuche?

28. Oktober 2009 15:35

navytom hat geschrieben:Ansonsten schaue ich auch mal gerne in die Kontaktsuche. Ab welcher Version? Ich geh mal von 4.0 aus.

Die Kontaktsuche müsste es bereits seit Version 3.01 geben. Falls nicht, dann aber spätestens mit 3.60

Re: phonetische Dubletttensuche?

28. Oktober 2009 16:24

martinst hat geschrieben:Das ist kein SQL-Feature oder sonst was ähnliches.
Die Kontaktsuche in NAV findet NATIV und SQL die Namen phonetisch.
meier findet meier,meyer,maier,mayer etc.

ich hab mir gerade nochmal den Code angeschaut.... das wird nur so sein, wenn die Einrichtung fuer den Namen auf 2 Stellen vorne und 2 stellen hinten eingerichtet wurde...sonst sehe ich das als UNMOEGLICH an:


Code:
CASE DuplSearchStringSetup.Field OF
  DuplSearchStringSetup.Field::Name:
    DuplContSearchString."Search String" :=
      ComposeIndexString(Cont.Name,DuplSearchStringSetup."Part of Field",DuplSearchStringSetup.Length);

Code:
ComposeIndexString(InString : Text[260];Part : 'First,Last';ChrToCopy : Integer) : Text[260]
InString := DELCHR(InString,'=',' +"&/,.;:-_(){}#!£$\');

IF STRLEN(InString) < ChrToCopy THEN
  ChrToCopy := STRLEN(InString);

IF ChrToCopy > 0 THEN
  IF Part = Part::First THEN
    InString := COPYSTR(InString,1,ChrToCopy)
  ELSE
    InString := COPYSTR(InString,STRLEN(InString)-ChrToCopy+1,ChrToCopy);

EXIT(UPPERCASE(InString));

Code:
    DuplContSearchString2.SETCURRENTKEY(Field,"Part of Field","Search String");
    DuplContSearchString2.SETRANGE(Field,DuplContSearchString.Field);
    DuplContSearchString2.SETRANGE("Part of Field",DuplContSearchString."Part of Field");
    DuplContSearchString2.SETRANGE("Search String",DuplContSearchString."Search String");
    DuplContSearchString2.SETFILTER("Contact Company No.",'<>%1',DuplContSearchString."Contact Company No.");


das ist der Filter, der die Treffer generiert ... das kann nicht phonetische sein...oder ueberseh ich eine Codestelle die das macht?

Re: phonetische Dubletttensuche?

28. Oktober 2009 16:38

Ich habe das Gefühl, hier wird gerade die Dubletten-Prüfung mit der Kontakt-Suche verwechselt.
Die Dubletten-Prüfung vergleicht mittels C/AL-Code bestimmte Teile der einzelnen Felder (Standard: 5 Zeichen am Anfang + 5 Zeichen vom Ende, ...)
Die Kontakt-Suche baut sich mittels externem Control per Fuzzy-Logic einen Suchindex auf.

Re: phonetische Dubletttensuche?

28. Oktober 2009 16:40

Ich habe das Gefühl, hier wird gerade die Dubletten-Prüfung mit der Kontakt-Suche verwechselt.


Sorry. Stimmt. Das habe ich wohl überlesen.

Re: phonetische Dubletttensuche?

28. Oktober 2009 16:54

Ein Algorithmus, der auch weg gelassene oder Buchstabendreher findet und somit die Unterschiedlichkeit zweier Wörter bewerten kann, ist der von Levenshtein (http://www.levenshtein.de/). Ist recht leicht in Nav umzusetzen, braucht aber länger als die Standard-Dublettensuche. Dafür liefert er nach meiner Erfahrung bessere Ergebnisse.

Re: phonetische Dubletttensuche?

29. Oktober 2009 18:12

McClane hat geschrieben:Ein Algorithmus, der auch weg gelassene oder Buchstabendreher findet und somit die Unterschiedlichkeit zweier Wörter bewerten kann, ist der von Levenshtein (http://www.levenshtein.de/). Ist recht leicht in Nav umzusetzen, braucht aber länger als die Standard-Dublettensuche. Dafür liefert er nach meiner Erfahrung bessere Ergebnisse.

Und genau deshalb habe ich diese schon in meiner aktuellen (NAV2009) Tools-DB aufgenommen: ;-)
Code:
LevenshteinDistance(SourceText : Text[50];TargetText : Text[50]) : Integer
// > TL6.00:09 >>>
// Based on http://de.wikipedia.org/wiki/Levenshtein-Distanz#Algorithmus

FOR I := 0 TO STRLEN(SourceText) DO
  Distance[I+1,1] := I;
FOR J := 0 TO STRLEN(TargetText) DO
  Distance[1,J+1] := J;

FOR I := 1 TO STRLEN(SourceText) DO
  FOR J := 1 TO STRLEN(TargetText) DO BEGIN
    IF SourceText[I] = TargetText[J] THEN
      Cost := 0
    ELSE
      Cost := 1;
    Distance[I+1,J+1] := Min(Distance[I,J+1] + 1,Min(Distance[I+1,J] + 1,Distance[I,J] + Cost));
  END;

EXIT(Distance[STRLEN(SourceText) + 1,STRLEN(TargetText) + 1]);
// < TL6.00:09 <<<

DamerauLevenshteinDistance(SourceText : Text[50];TargetText : Text[50]) : Integer
// > TL6.00:09 >>>
// Based on http://de.wikipedia.org/wiki/Levenshtein-Distanz#Damerau-Levenshtein-Distanz

FOR I := 0 TO STRLEN(SourceText) DO
  Distance[I+1,1] := I;
FOR J := 0 TO STRLEN(TargetText) DO
  Distance[1,J+1] := J;

FOR I := 1 TO STRLEN(SourceText) DO
  FOR J := 1 TO STRLEN(TargetText) DO BEGIN
    IF SourceText[I] = TargetText[J] THEN
      Cost := 0
    ELSE
      Cost := 1;
    Distance[I+1,J+1] := Min(Distance[I,J+1] + 1,Min(Distance[I+1,J] + 1,Distance[I,J] + Cost));
    IF (I > 1) AND (J > 1) THEN
      IF (SourceText[I] = TargetText[J-1]) AND (SourceText[I-1] = TargetText[J]) THEN
        Distance[I+1,J+1] := Min(Distance[I+1,J+1],Distance[I-1,J-1] + Cost);
  END;

EXIT(Distance[STRLEN(SourceText) + 1,STRLEN(TargetText) + 1]);
// < TL6.00:09 <<<

Min(Int1 : Integer;Int2 : Integer) : Integer
// > TL6.00:09 >>>
IF Int1 < Int2 THEN
  EXIT(Int1)
ELSE
  EXIT(Int2);
// < TL6.00:09 <<<

Re: phonetische Dubletttensuche?

29. Oktober 2009 18:18

Sieht irgendwie aus wie meiner :-? .. los sag: wo steht die Kamera? :wink:

Re: phonetische Dubletttensuche?

29. Oktober 2009 18:20

Timo, jetzt bin ich erstaunt.
Ich habe immer noch die Webseite offen, die McClane veorgeschlagen hat und lese ab und zu drin um es ggf. selbst umzusetzten.
Und du, präsentierst hier gleich die Lösung.

Hut ab :-)

**Edit by Mikka**
McClane hat geschrieben:Sieht irgendwie aus wie meiner :-? .. los sag: wo steht die Kamera? :wink:

Wie du hast den schon?
Und nicht gepostet :-(

Re: phonetische Dubletttensuche?

29. Oktober 2009 18:22

Mönsch Mikka, der Code steht doch praktisch schon auf der Seite :wink:

Re: phonetische Dubletttensuche?

29. Oktober 2009 18:23

Ja, ich bin erst heute Nachmittag an die Stelle gekommen.
Ab und an muß ich auch arbeiten :wink:

**Edit**
ich habe den Code aber noch nicht Ansatzweise angeschaut

Re: phonetische Dubletttensuche?

29. Oktober 2009 18:23

mikka hat geschrieben:Wie du hast den schon?
Und nicht gepostet

Schien ja niemanden zu interessieren :-(

Re: phonetische Dubletttensuche?

29. Oktober 2009 19:18

McClane hat geschrieben:Sieht irgendwie aus wie meiner :-?
Überrascht mich nicht, denn ich habe den Code 1:1 übernommen und an die C/AL-Konventionen angepasst.

McClane hat geschrieben: .. los sag: wo steht die Kamera? :wink:
Glaubst du wirklich, das kleine Loch in der Wand stammt von einem ehemaligen Nagel? :twisted: :wink:

Re: phonetische Dubletttensuche?

3. August 2010 11:00

Nette Sache so ein Soundex, aber mich würde interessieren inwieweit funktioniert er für die deutsche Sprache?

Ich erweitere das Beispiel von Wikipedia:

Beispielsweise ist die Levenshtein-Distanz zwischen „Tier“ zu „Tor“ 2. Eine mögliche Folge von 2 Operationen ist:

1.Tier
2.Toer (Ersetze i durch o)
3.Tor (Lösche e)


mal um dieses Beispiel:

1.Mueller
2.Müeller (Ersetze u durch ü)
3.Müller (Lösche e)

mit der Frage:
Ist bei dem Levenshtein die Differenz zwischen Müller und Mueller dann nicht immer 2?

Ähnlich mit ß <-> ss.

Gibt es deutsche oder sprachspezifische Anpassungen für die Distanzen?

Ich konnte dazu nichts finden und denke die hat doch bestimmt einer im Einsatz, oder? :wink:

mfg,
winfy
Zuletzt geändert von winfy am 3. August 2010 11:09, insgesamt 1-mal geändert.

Re: phonetische Dubletttensuche?

3. August 2010 11:08

Und was machst du bei Worten wie Soest? Das wäre nicht gleich Söst. AEG ist nicht ÄG.

Außerdem ist es dir doch überlassen, ab wann du von einer Dublette ausgehst. Das kann immer ein fester Wert sein, genauso aber eine Abweichung in Abhängigkeit der Länge der Wörter. Oder du teilst es auf: bei kurzen Wörtern lässt du als Abweichung 2 zu, ab einer Länge von x steigst du auf eine prozentuale Abweichung um. Letzteres habe ich hier, und die Trefferquote ist hoch.

Re: phonetische Dubletttensuche?

3. August 2010 11:39

McClane hat geschrieben:Und was machst du bei Worten wie Soest? Das wäre nicht gleich Söst. AEG ist nicht ÄG.


Ich benötige den Soundex vorallem für die Nachnamen und nicht die Firmennamen, daher stellt sich das Problem mit Söst = Soest oder AEG = ÄG meiner Meinung nach nicht.

McClane hat geschrieben:Außerdem ist es dir doch überlassen, ab wann du von einer Dublette ausgehst. Das kann immer ein fester Wert sein, genauso aber eine Abweichung in Abhängigkeit der Länge der Wörter.


Hmm, ok wenn ihr das so realisiert und es in der Praxis auch funktioniert.
Ich dachte nur es könnte vielleicht sprachspezifische Anpassungen geben.

mfg,
winfy