# Kölner Phonetik



## hawkeye78 (3. Okt 2007)

Hallo,

ich bin ein klein bißchen Verwirrt was die Kölner Phonetik betrifft., laut dem Wikipedia Artikel wird ja jedem Buchstaben ähnlich wie beim SoundEx verfahren eine Zahl zugeordnet. Nun nimmt aber der Anlaut eines Wortes beim Kölner Verfahren ebenfalls eine eigene Rolle ein und laut Wikipedia ist der Anlaut der erste Buchstabe eines Wortes.
Was mich nun vor dem Problem stellt das der Buchstabe "C" zwei Werte annehmen kann, nämlich einmal 4 oder 8 wenn er im Anlaut steht. Daher bin ich ein klein bißchen verwirrt wie sich nun der Erfinder des Algorithmus die Implementierung vorgestellt hat?
Meine Hoffnung ist nun das evtl. hier jemand meinen Beitrag liest der dieses Algorithmus bereits einmal implementiert hat und mir verraten kann wie man diesen Algorithmus nun umsetzt. Ich wäre über einen entsprechenden Hinweis auf jeden Fall sehr dankbar, da sich die Informationen im Netz doch sehr spärlich gestalten.
Viele Grüsse
Dan

Edit:
hat sich erledigt, wer lesen kann ist klar im Vorteil der unterschiedliche Wert für den Buchstaben C resultiert aus dem darauf folgenden Buchstaben...


----------



## Niki (26. Nov 2007)

Hallo!
Ich soll für die Arbeit den Algorithmus auch in Java umsetzen. Könntest du mir den Code von dir zukommen lassen bzw. wenn das nicht geht sagen welche Unterlagen du dafür verwendet hast?

Liebe Grüße!


----------



## hawkeye78 (26. Nov 2007)

Hallo Niki,

ich habe mich in erster Linie nach dem Wikipedia Artikel gerichtet, aber wenn Du dich bis heute abend gedulden magst, werde ich den Code herein stellen und dann hier den Link dazu posten.
Viele Grüsse
Dan


----------



## Niki (26. Nov 2007)

Ich glaub ich habs eh schon, hat auf den ersten Blick nur etwas kompliziert ausgeschaut, war es aber nicht. Jetzt muss ich nur noch mit Test-Daten testen


----------



## Gast (30. Okt 2008)

stehe ebenfalls vor dem gleichen problem und komm nicht weiter.. könntest du den code bitte posten!? danke...


----------



## hawkeye78 (30. Okt 2008)

Hallo Gast,

den Code zu meinem Versuch der Implementierung findest Du hier Allerdings kann ich nicht versprechen das der Code zu 100% funktioniert ich habe ihn zwar mit einigen Eingaben getestet, aber eine vollständige Validierung ist halt doch etwas anderes. Aus diesem Grund würde ich dir auch empfehlen mindestens einmal darüber zu schauen bevor du ihn verwendest.
Ich hoffe ich konnte dir ein klein wenig helfen.
Viele Grüsse
Dan


----------



## Gast (3. Nov 2008)

Hallo Dan,

ich bin auch gerade dabei den Algorithmus in Java umzusetzen. Ich wollte mir Deine Implementierung dazu ansehen, leider funktioniert der Link nicht.

Könntest Du ihn vielleicht nochmal posten?

VG Steffi


----------



## hawkeye78 (3. Nov 2008)

Hallo,

ich kapiere zwar nicht warum der Code so schnell vom Server wieder verschwunden ist, aber ich muß ja auch nicht alles verstehen. Hier also noch einmal der Quellcode:


```
public class KoelnerPhonetik
{
	public static void main(String args[])
	{
		String eingabe="Sailing Philadelphia";
		
		System.out.println(phonetik(eingabe));
	}
	
	public static String phonetik(String eingabe)
	{
		String tmp1="";
		String tmp2="";

		eingabe=eingabe.toLowerCase();
		
		for(int i=0; i<eingabe.length(); i++)
		{
			switch(eingabe.charAt(i))
			{
				case 'a':
				case 'ä':
				case 'e':
				case 'i':
				case 'j':
				case 'o':
				case 'ö':
				case 'u':
				case 'ü':
				case 'y': 	tmp1=tmp1+"0";
							break;

				case 'b':	tmp1=tmp1+"1";
							break;
				
				case 'f':
				case 'v':
				case 'w':	tmp1=tmp1+"3";
							break;

				case 'g':
				case 'k':
				case 'q':	tmp1=tmp1+"4";
							break;
							
				case 'l':	tmp1=tmp1+"5";
							break;

				case 'm':
				case 'n': 	tmp1=tmp1+"6";
							break;

				case 'r': 	tmp1=tmp1+"7";
							break;

				case 's':	
				case 'z':
				case 'ß':	tmp1=tmp1+"8";
							break;
				
				case 'p':	if(i==eingabe.length()-1 || (i<eingabe.length() && eingabe.charAt(i+1)!='h'))
							{
								tmp1=tmp1+"1";
							}
							else
							{
								tmp1=tmp1+"3";
							}
							break;
				
				case 'd':
				case 't':	if(i<eingabe.length()-1)
							{
								if(eingabe.charAt(i+1)!='c' && eingabe.charAt(i+1)!='s' && eingabe.charAt(i+1)!='z')
								{
									tmp1=tmp1+"2";
								}
								else
								{
									tmp1=tmp1+"8";
								}
							}
							else // "d" oder "t" ist der letzte Buchstabe im Wort 
							{
								tmp1=tmp1+"2";								
							}
							break;
				
				case 'x':	if(i>0)
							{
								if(eingabe.charAt(i-1)!='c' && eingabe.charAt(i-1)!='k' && eingabe.charAt(i-1)!='q')
								{
									tmp1=tmp1+"48";									
								}
								else
								{
									tmp1=tmp1+"8";
								}
							}
							else // "x" ist der erste Buchstabe im Wort
							{
								tmp1=tmp1+"48";
							}
							break;
				
				case 'c':	if(i>0)
							{
								if(eingabe.charAt(i-1)=='s' || eingabe.charAt(i-1)=='z')
								{
									tmp1=tmp1+"8";
								}
								else 
								{
									// Ist "c" der letzte Buchstabe?
									if(i<eingabe.length())
									{
										switch(eingabe.charAt(i+1))
										{
											case 'a': 
											case 'h': 
											case 'k': 
											case 'o': 
											case 'q': 
											case 'u': 
											case 'x':	tmp1=tmp1+"4";
														break;
										
											default:	tmp1=tmp1+"8";
														break;
										}
									}
									else
									{
										tmp1=tmp1+"8";
									}
								}
							}
							else // "c" ist der erste Buchstabe im Wort
							{
								if(eingabe.length()>1)
								{
									switch(eingabe.charAt(i+1))
									{
										case 'a': 
										case 'h': 
										case 'k': 
										case 'l': 
										case 'o': 
										case 'q': 
										case 'r':
										case 'u': 
										case 'x':	tmp1=tmp1+"4";
											  		break;
											  		
										default:	tmp1=tmp1+"8";
													break;
									}
								}
								else // das Wort besteht nur aus einem Buchstaben
								{
									tmp1=tmp1+"8";
								}
							}
							break;
			} // Ende der Switch-Anweisung
		} // Ende der Schleife
		
		
		// Entfernen der Nullen
		tmp2=tmp2+tmp2.valueOf(tmp1.charAt(0));

		for(int i=1; i<tmp1.length(); i++)
		{
			if(tmp1.charAt(i)!='0')
			{
				tmp2=tmp2+tmp2.valueOf(tmp1.charAt(i));
			}
		}
		
		tmp1="";

		// Entfernen von doppelten Zahlen
		if(tmp2.length()!=0)
		{
			tmp1=tmp1+tmp1.valueOf(tmp2.charAt(0));
		}
		
		for(int i=1; i<tmp2.length(); i++)
		{
			if(tmp2.charAt(i-1)!=tmp2.charAt(i))
			{
				tmp1=tmp1+tmp1.valueOf(tmp2.charAt(i));
			}
		}
				
		return tmp1;
	}
}
```

Aber wie gesagt der Code ist nicht zu 100% getestet darum ist er etwas mit vorsicht zu genießen. Ich hoffe trotzdem das es etwas hilft.
Viele Grüsse
Dan


----------



## Gast (6. Nov 2008)

Hallo Dan,

vielen Dank für Deine Antwort. Mich hat der Ehrgeiz gepackt und ich hab den Algorithmus noch selbst geschrieben, habe aber mit Deinen Ergebnissen verglichen. 

Hab vielen Dank für Deine Hilfe!

viele Grüße
  Steffi


----------



## Guest (28. Jan 2009)

Sorry mit "Plecic" gibts ein:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
	at java.lang.String.charAt(String.java:687)
	at KoelnerPhonetik.phonetik(KoelnerPhonetik.java:117)


D.H das charAt(i + 1) ist falsch


```
// Ist "c" der letzte Buchstabe?
                         if (i < eingabe.length()) {
                                switch (eingabe.charAt(i + 1)) {
```


----------



## dezz (2. Apr 2009)

er hat an der Stelle lediglich die -1 vergessen:

if (i < eingabe.length() -1 )


----------

