Kölner Phonetik (Soundex/Suche nach Klang)

Einige Anwendungen bieten Suche nach Klang/Phonetik, nutzen dabei aber das Soundex Verfahren, das für amerikanische Aussprache ausgerichtet ist.
Besser für deutsche Namen ist die sogenannte Kölner Phonetik
http://de.wikipedia.org/wiki/Kölner_Phonetik

Die nachfolgende Routine bildet dies ab.
Aufruf über:
$soundex := Tools_Soundex_Koeln(Wort)

Namenin Einzelwörtern aufteilen.
“Kölner Institut für Sprachforschung” könnten entsprechend als 4 Einzelwörter codiert und gespeichert werden. Aufteilung z. B. durch GET TEXT KEYWORDS.

Ich persönlich erlaube für Suchen eine Google ähnliche Suchleiste. Der Anwender gibt etwas ein, das kann ein Nachname, Teil des Firmennamens, Straße oder Telefonnummer sein.
Per Type Ahead wird gesucht und dabei sowohl nach korrekter Schreibweise wie phonetik gesucht.
Die Treffer werden sortiert nach Kundenumsatz angezeigt (je nach Firmenausrichtung könnte man auch nach letzter Bestellung oder ähnliches sortieren).

Damit das Client/Server per Type Ahead auch schnell ist, wird nicht etwa in 4 Tabellen gesucht sondern im Kunden gibt es ein “Suchfeld” (Typ Text, Volltextindex), das per Trigger gefüllt wird. Lauter Einzelwörter, Firmenname, Nachnamen aller Mitarbeiter (lässt sich bei Bedarf natürlich einschränken), Straße, Telefonnummer, E-Mail, etc. Firmenname und Nachnamen zusätzlich phonetisch.

Da phonetische Codes nur eine Nummer sind ( Müller-Lüdenscheidt = 65752682 ) und somit dies auch mit Telefonnummer oder PLZ (kurzer Name) überlappen könnte, setze ich selbst einen Buchstaben davor (P65752682) und reduziere somit ungewünschte Treffer.

Hinweis: nutzt man GET TEXT KEYWORDS wie oben vorgeschlagen würde Müller-Lüdenscheidt als zwei Wörter codiert werden, was laut Regel falsch ist. Ich persönlich finde es am Telefon leichter, nicht immer wird der Doppelnamen genannt (oder richtig verstanden), manchmal nur ein Teil und dann findet man es besser, wenn einzeln codiert. Wenn regelkonforme Codierung gewünscht, “-” vorher mit “” ersetzen, erst dann GET TEXT KEYWORDS anwenden.

Source:

<code 4D>
// soundex for German Language
// http://de.wikipedia.org/wiki/Kölner_Phonetik
// $soundex := Tools_Soundex_Koeln(Wort)

C_TEXT($1;$0)

$result:=""

$word:=Uppercase($1)

$word:=Replace string($word;“v”;“F”)
$word:=Replace string($word;“w”;“F”)
$word:=Replace string($word;“j”;“I”)
$word:=Replace string($word;“ph”;“F”)

If (Length($word)>0)

  // Nur Buchstaben (keine Zahlen, keine Sonderzeichen)
$zwischen:=""
For ($i;1;Length($word))
	$charvalue:=Character code($word[$i])
	If (($charvalue>64) & ($charvalue<91))
		$zwischen:=$zwischen+$word[$i]
	End if 
End for 
$word:=$zwischen

$loopstart:=0
If (Length($word)>0)
	  // Sonderfälle bei Wortanfang (Anlaut)
	If ($word[1]="c")
		If (Length($word)=1)
			$result:="8"
			$loopstart:=1
		Else 
			If (Position($word[2];"ahkloqrux")>0)
				$result:="4"
			Else 
				$result:="8"
			End if 
			$loopstart:=1
		End if 
	End if 
	
	  // end Anlaut
	
	For ($x;$loopstart+1;Length($word))
		$char:=$word[$x]
		Case of 
			: (Position($char;"aeiou")>0)
				$result:=$result+"0"
			: (Position($char;"bp")>0)
				$result:=$result+"1"
			: (Position($char;"dt")>0)
				If ($x<Length($word))
					If (Position($word[$x+1];"csz")>0)
						$result:=$result+"8"
					Else 
						$result:=$result+"2"
					End if 
				Else 
					$result:=$result+"2"
				End if 
			: ($char="f")
				$result:=$result+"3"
			: (Position($char;"qkg")>0)
				$result:=$result+"4"
			: ($char="c")
				If ($x<Length($word))
					If (Position($word[$x+1];"ahkoqux")>0)
						  // nun davor
						If (Position($word[$x-1];"sz")>0)
							$result:=$result+"8"
						Else 
							$result:=$result+"4"
						End if 
					Else 
						$result:=$result+"8"
					End if 
				Else 
					$result:=$result+"8"
				End if 
			: ($char="x")
				If ($x>1)
					If (Position($word[$x-1];"ckq")>0)
						$result:=$result+"8"
					Else 
						$result:=$result+"48"
					End if 
				Else 
					$result:=$result+"48"
				End if 
			: ($char="l")
				$result:=$result+"5"
			: (Position($char;"mn")>0)
				$result:=$result+"6"
			: ($char="r")
				$result:=$result+"7"
			: (Position($char;"sz")>0)
				$result:=$result+"8"
		End case 
	End for 
	
End if   // size#0

End if // size#0

If ($result#"")
$result:=$result[1]+Replace string(Substring($result;2);“0”;"")
End if

// Mehrfach Codes entfernen
$last:=""
$x:=1
$zwischen:=""
For ($x;1;Length($result))
$char:=$result[$x]
If ($char#$last)
$zwischen:=$zwischen+$char
$last:=$char
End if
End for
$result:=$zwischen

$0:=$result
</code 4D>

Hallo,

habe mich auch schon damit beschäftigt. Aber für die Komibinationen: Heie, Haie, Haio, Hajo, Heio und Huey - erhält man keinen Code oder hier “0”. Aber Null am Anfang ist nicht korrekt!

Für meine Belange “Namen suchen”, war daher der alte SoundEx die bessere Variante. :razz:

Schönes Wochende

Axel Kohlepp

Interessant. Bei “Hai” etc. ist kein Code ist offenbar korrekt. “H” ist nichts und alle Vokale ergeben 0 und alle Nullen sind zu streichen.

Hier noch was zum Austoben:

<>ftp://ftp.informatik.uni-stuttgart.de/pub/library/medoc.ustuttgart_fi/DIP-2983/DIP-2983.pdf