Ratet mal, wie man deutsche Wörter ausspricht


37

Einführung

Im Gegensatz zu Englisch wird Deutsch als ein ziemlich phonemisches Schriftsystem angesehen . Das bedeutet, dass die Entsprechung zwischen Rechtschreibung und Aussprache eng ist. Wenn Sie ein Wort kennen, das Sie nicht kennen, wissen Sie aufgrund des Rechtschreibsystems immer noch, wie es auszusprechen ist. Das heißt, ein Computer sollte das auch können, oder?

Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die als Eingabe eine Zeichenfolge verwendet, die ein deutsches Wort darstellt, und deren Aussprache im Internationalen Phonetischen Alphabet (IPA) ausgibt oder zurückgibt .

Ich werde Sie natürlich nicht dazu bringen, Deutsch oder die volle IPA zu lernen . Dieser Wikipedia Abschnitt bietet fast alle deutschen IPA Regeln , die Sie brauchen, und ich habe eine ungolfed C # codiert Referenzimplementierung .

Unter diesem Link finden Sie auch eine Liste mit 400 gebräuchlichen deutschen Wörtern und deren IPA-Aussprache (für die Validierung erforderlich). Wenn Sie ein Beispiel aus dieser Liste nehmen, ist die Eingabe solltestdie richtige Ausgabe ˈzɔltəst.

Die Referenzimplementierung fügt zwei hilfreiche Regeln hinzu, die im Wikipedia-Abschnitt nicht erwähnt werden: Es wird davon ausgegangen, dass die Wortbetonung in der ersten Silbe steht (sehr wahrscheinlich in Deutsch), und es wird eine bessere Heuristik verwendet, um zu bestimmen, wann der Buchstabe "e" den Schwa-Ton darstellt / ə /. Es implementiert auch eine spezielle Verarbeitung für Präfixe, aber das verbesserte die Ergebnisse nicht so sehr, wie ich es mir vorgestellt hatte.

Einzelheiten

Um als gültiger Eintrag zu gelten, muss Ihr Programm die folgenden Anforderungen erfüllen:

  • Ihre IPA-Ausgabe muss genau mit mindestens 300 der 400 Wörter in der Referenzwortliste übereinstimmen (die Referenzimplementierung wird 333 korrekt).
  • Ihr Programm muss eine Vermutung für ein plausibles deutsches Wort anstellen. Wir haben also eine technische Anforderung. Dies bedeutet, dass Sie für jede Eingabe, die dem [a-zA-ZäÄöÖüÜ][a-zäöüß]*regulären Ausdruck entspricht und mindestens einen Vokal (aeiouyäöü) hat, eine Ausgabe ohne Leerzeichen und keine Fehlerausgabe erstellen müssen.
  • Das Programm muss deterministisch sein (bei gleicher Eingabe immer die gleiche Ausgabe erzeugen)
  • Andernfalls sind Standardlücken verboten (insbesondere das Abrufen von externen Ressourcen).

Verschiedenes, was Sie tun dürfen:

  • Haben Sie führende und nachfolgende Leerzeichen in Ihrer Ausgabe, wenn Sie müssen
  • Verwenden Sie eine bereits vorhandene Zeichenkodierung in der Ausgabe (ich kann mir nichts anderes als Unicode vorstellen, aber wenn Sie können, herzlichen Glückwunsch)
  • Angenommen, die Eingabe erfolgt in einer normalisierten Form wie Unicode-Normalisierungsformulare NFD, NFC usw. Wird ä beispielsweise als einzelnes Zeichen oder als Basiszeichen + kombiniertes Zeichen geschrieben?
  • Verwenden der Standardeingabe und Ausgabeverfahren

Scoring & IPA-Charaktere

Die Bewertung erfolgt in Byte. Seien Sie gewarnt, dass die deutschen Zeichen und die IPA-Zeichen in UTF-8 2 Byte sind. Das IPA-Zeichen U + 0327 COMBINING INVERTED BREVE BELOW (̯) ist ein Unicode-Kombinationszeichen und ein 2-Byte-UTF-8-Zeichen für sich. Das heißt, so etwas wie ɐ̯ würde in UTF-8 als 4 Byte zählen. Für die Neugierigen bedeutet dieses Symbol, dass der Vokal nicht den Silbenkern bildet (der vorherige tut es stattdessen).

Achten Sie auch auf diese IPA-Zeichen, die in einigen Schriftarten wie andere ASCII-Zeichen aussehen: ɡ, ɪ, ʏ, ː (markiert einen langen Vokal), ˈ (markiert, welche Silbe die Betonung in einem mehrsilbigen Wort hat).

Wie die Referenzwortliste erstellt wurde

Dieser Abschnitt enthält zusätzliche Informationen, die für die Herausforderung nicht benötigt werden.

Die Wortliste wurde aus dieser Wiktionary-Worthäufigkeitsliste entnommen , wobei Wiederholungen aufgrund von Groß- und Kleinschreibung und zwei Wörtern ohne deutsche Einträge im englischen Wiktionary (oh & hey) entfernt wurden. Die IPA bezog sich sowohl auf die englischen als auch auf die deutschen Wiktionaries. Wo mehrfache Aussprachen angeboten wurden, wählte ich die formalere und Standardaussprache. Wenn dies nicht klar war, wählte ich diejenige, die den allgemeinen Regeln am besten entspricht.

Ich musste auch standardisieren, wie der Buchstabe "r" ausgesprochen wird. Es hängt stark von der Region ab, wie dieser Buchstabe ausgesprochen wird, und Wiktionary stimmte überhaupt nicht mit der von ihm gewählten überein. Ich hatte das Gefühl, dass es zu folgendem tendiert: "r" wird ausgesprochen / ɐ̯ /, wenn ein langer Vokal folgt, und ein Vokal folgt nicht, andernfalls ist es ʁ. Also habe ich alle geändert, um dieser Regel zu folgen, mit Ausnahme der Vers- und Er-Präfixe, die ziemlich konsistent waren / (f) ɛɐ̯ /. Ebenso habe ich "eu" als / ɔʏ̯ / standardisiert.


16
Mathematica verfügt über eine integrierte Funktion für this ( #~WordData~"PhoneticForm"&), die jedoch nur für englische Wörter funktioniert.
JungHwan Min

29
@JungHwanMin Ich habe Ihren Kommentar wie folgt gelesen: Sofortiger Herzinfarkt, Seufzer der Erleichterung.
DPenner1

1
Woher soll ich wissen, dass "gestern" ausgesprochen wird "GHES-tern" statt "ge-SHTERN"? "Bester" als "Bester", nicht "Be-SHTER"?
Undichte Nonne

@LeakyNun Dafür gibt es keinen 100% -Algorithmus, aber Ihre Implementierung muss nur 75% erreichen. Bei meiner Referenzimplementierung sind diese Wörter ebenfalls falsch.
DPenner1

@LeakyNun Nun, Ihr Programm wird auch mit deutschen Dialekten umgehen können, es ist also leistungsfähiger.
P. Siehr

Antworten:


9

PHP, 3311 2988 2916 2845 2759 2671 2667 2509 2484 Bytes, die 301/400 übergeben

<?$f=fopen(__FILE__,r);fseek($f,__COMPILER_HALT_OFFSET__);eval(strtr(stream_get_contents($f),[F=>'=>',M=>'==','&'=>'&&',H=>'function ',A_=>'array',G=>'if',4=>'for','|'=>'||','~'=>'))','%'=>str,7=>'=$',8=>'[]',9=>'!$','@'=>'count(','#'=>';$',5=>'return ',3=>':(']));__halt_compiler();define(J,[ieh,ah,aa,Ah,eh,ee,ie,ih,oh,oo,Oh,uh,Uh,au,eu,Au,ei,ai,ey,ay,a,e,i,o,u,A,O,U,y])#b7e=8;Hv($a){5in_A_($a,J);}Hn($a){5!v($a);}Hpronounce($w){global$b,$e#w=%tr(%tolower(%tr($w,[ßF1,ÄF2,äF2,ÖF0,öF0,ÜF6,üF6]~,[1FS,2FA,0FO,6FU])#W=8#L7w;while($L)4each(A__merge([tzsch,dsch,tsch,zsch,sch,chs,ch,ck,dt,ng,nk,pf,ph,qu,ss,th,tz,b,c,d,f,g,h,j,k,l,m,n,p,r,s,S,t,v,w,x,z],J)as$c){$l=%len($c);G(sub%($L,0,$l)M$c){$W87c#L=sub%($L,$l);break;}}$s=8#l=@$W);4($o7t7i=0#i<$l#i++){$c7W[$i]#p7i?$W[$i-1]:0#n7iM$l-1?0:$W[$i+1];G(9n|!(n($c)&$cM$n&n($W[$i+2]~)$s[$o]87c;G($p&((9n&v($c)&n($p~|(n($n)&v($W[$i+2]~~$s[++$o]=8;}$s[@$s)-1]|A__pop($s);4each($s as$z){$b87t#t+=@$z)#e87t;}$o=[sieFziQ,duFduQ,'die'FdiQ,derFdeQT,zuFtsuQ,wirFviQT,mirFmiQT,denFdeQn,dassFdas,erFeQT,soFzoQ,warFvaQT,fürFfyQT,jaFjaQ,wieFviQ,dirFdiQT,nurFnuQT,demFdeQm,ihnFiQn,auchFaUBx,ihrFiQT,daFdaQ,schonFʃoQn,wennFvEn,malFmaQl,gutFguQt,nachFnaQx,willFvIl,mussFmUs,habFhaQp,vorFfoQT,ihmFmiQm,tunFtuQn][$w]?:'';G($o)goto x#P7B7S7V7Z=0;@$s)>1&$o=[verFfET,daFda,geFgC][join($s[0])]#o&$P=1&A__shGt($s);(($P|@$s)M2)&$o.=W)|(@$s)>2&$d=1&$h=(int)@$s)/2)#w=A__merge(...$s);4each($w as$l){G(0<$S--)continue#n7w[$B+1]#p7w[$B-1]#f=''#Z+=in_A_($B,$b)#f7lMd&9n?t3$lMb&(9n|$nMt)?p3$lMg&(9n|$nMt)?((9n&$pMi)?K:k)3$lMc?(($nMA|$nMe|$nMi)?ts:k)3$lMch?(($pMa|$pMo|$pMu)?x:K)3$lMchs|$lMx?ks3$lMck?k3$lMdsch?dZ3$lMdt|$lMth?t3$lMph|$lMv?f39f&$lMg?g3$lMh?(v($n)?h:'')3$lMng?N3$lMnk?Nk3$lMqu?kv3$lMr?((!v($n)&9nMt)?T:R)3$lMsch?S3$lMss|$lMS?s3$lMtsch|$lMtzsch|$lMzsch?tS3$lMtz|$lMz?ts3$lMw?v3$lMs?(9p&($nMp|$nMt~?S3v($n)?z:s):$f~~~~~~~~~~)#U=0;G(v($l~{G(%len($l)>1)($f=[auFaUB,euFcYB,eiFaIB][$l])|$U=1;else{G(n($n)&((9w[$B+2]&$n!=n)|v($w[$B+2]~)$U=1;G($lMe){$U=9n?:$U;G(9w[$B+2]){G($nMr)($f=A)&$U=9S=1;G($nMm|$nMl)$f=C;}}elseG($nMch)$U=0;G(in_A_($B,$e~$U=0;}$f=($U|9Z)&9f?($l[0]MO?D3$l[0]MU?y3$l[0]MA?E:$l[0]~).Q39f?($lMe?((9n|(9w[$B+2]&($nMn|$nMs~)?C:E)3$lMA?E3$lMi?I3$lMo?c3$lMu?U3($lMU|$lMy)?Y:$l~~~:$f)#V++;}$f7f?:$l;G($d&$ZM$h)$f.=W#o.7f#B++;}G(%pos($o,W)M=false&$V>1)$o=W.$o;4(#j++<%len($o);)G($o[$j]M$o[$j+1])$o=sub%($o,0,$j).sub%($o,$j+1);x:5%tr($o,[SFʃ,ZFʒ,KFç,gFɡ,NFŋ,QF'ː',WFˈ,TFɐ̯,BF'̯',RFʁ,AFɐ,EFɛ,OFœ,IFɪ,YFʏ,UFʊ,cFɔ,CFə,DFø]);}

Definiert pronounce(string $word).

Verwendung:

assert(
    pronounce('darüber') == "daˈʁyːbɐ"
);

Eine Anmerkung: 3 Präfixe und 33 Wörter sind fest codiert, und ein Teil des Codes ist leicht für die Testliste optimiert.

Der Testcode ist hier , obwohl er von dieser Datei abhängt .

Zu testen:

php test.php all

Angetrieben von den Tränen ternärer Aussagen.

EDIT 7 : ~ 170 Bytes durch Schreiben eines Präprozessors in das Programm entfernt. Infolgedessen ist das eigentliche Programm (alles danach __halt_compiler();) etwas schwer zu lesen. Wenn Sie das unverarbeitete Programm wollen, wechseln Sie evalmit printin die dritte Anweisung.


Dies sind tatsächlich 2667 Bytes, nicht 2671 (unter der Annahme von UTF-8)
Caird Coinheringaahing
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.