Kölner Phonetik

Status
Nicht offen für weitere Antworten.

hawkeye78

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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
 
G

Gast

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

hawkeye78

Bekanntes Mitglied
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
 
G

Gast

Gast
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

Bekanntes Mitglied
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:

Code:
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
 
G

Gast

Gast
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
 
G

Guest

Gast
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

Code:
                      // Ist "c" der letzte Buchstabe?
                         if (i < eingabe.length()) {
                                switch (eingabe.charAt(i + 1)) {
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben