Відгадайте, як вимовляти німецькі слова


37

Вступ

На відміну від англійської, німецька вважається досить фонематичною системою письма . Це означає, що відповідність між написанням та вимовою є близькою. З огляду на будь-яке слово, яке вам не знайоме, ви все одно знатимете, як його вимовити через орфографічну систему. Це означає, що комп’ютер повинен робити це занадто правильно?

Виклик

Напишіть програму або функцію, яка приймає за введення рядок, що представляє німецьке слово, і друкує або повертає її вимову в Міжнародному фонетичному алфавіті (IPA) .

Я, звичайно, не збираюся змушувати вас вивчати німецьку мову або повний IPA . Цей розділ у Вікіпедії надає майже всі необхідні правила щодо IPA, що знаходяться на німецькій мові, і я зашифрував реалізацію посилань, які не мають вольфівки C # .

Також у цьому посиланні міститься список 400 поширених німецьких слів та їх вимова IPA (потрібна для перевірки). Беручи приклад із цього списку, якщо вхід є solltest, правильний вихід ˈzɔltəst.

Реалізація посилань додає два корисні правила, про які не згадується у розділі Вікіпедії: Це передбачає, що слово наголос є на першому складі (дуже ймовірно, німецькою мовою), і використовує кращу евристику для визначення, коли літера "е" позначає звук шва / ə /. Він також реалізує спеціальну обробку префіксів, але це не покращило результатів настільки, наскільки я думав, що це буде.

Деталі

Щоб вважатись дійсною програмою, ваша програма повинна відповідати наступним вимогам:

  • Ваш вихід IPA повинен відповідати щонайменше 300 з 400 слів у списку довідкових слів (реалізація посилання отримує 333 правильних)
  • Ваша програма повинна вгадати будь-яке правдоподібне німецьке слово. Отже, у нас є технічна вимога, це означає, що для будь-якого вводу, який відповідає регулярному вираженню [a-zA-ZäÄöÖüÜ][a-zäöüß]*та має хоча б одну голосну (aeiouyäöü), ви повинні створити вихід, який не стосується пробілів, і не помилитися.
  • Програма повинна бути детермінованою (завжди виробляти один і той же вихід з одним і тим же входом)
  • В іншому випадку стандартні лазівки заборонені (особливо про вилучення ресурсів поза сайтом)

Різні речі, які вам дозволяється робити:

  • Майте у своєму виході провідні та відсталі пробіли, якщо потрібно
  • Використовуйте будь-яке раніше існуюче кодування символів у висновку (я не уявляю нічого, крім Unicode, що добре працює, але, якщо можете, вітаю)
  • Припустимо, що вхід знаходиться в певній нормованій формі, як, наприклад, Unicode форми нормалізації NFD, NFC тощо. Наприклад, чи ä пишеться як один символ або базовий символ + комбінуючий символ?
  • Використовуйте стандартні методи введення та виведення

Оцінка та символи IPA

Оцінка балів у байтах. Попереджуйте, що символи Німеччини та символи IPA - 2 байти в UTF-8. Також символ IPA U + 0327 КОМБІНУВАННЯ ІНВЕРТИРОВАНОГО БРЕВУ Внизу (̯) є символом, що поєднує Unicode, і є 2-байтним символом UTF-8. Це означає, що щось на зразок ɐ̯ в UTF-8 вважатиметься 4 байтами. Для допитливих цей символ означає, що голосний не утворює ядро ​​складу (попереднє робить замість цього).

Також остерігайтеся цих символів IPA, які в деяких шрифтах виглядають як інші символи ASCII: ɡ, ɪ, ʏ, ː (позначає довгу голосну), ˈ (позначає, який склад має наголос у багатоскладному слові).

Як було створено список довідкових слів

Цей розділ - додаткова інформація, не потрібна для виклику.

Список слів був схоплений із цього списку частот Вікісловника , видаляючи повтори через різницю корпусів та два слова, які не мали німецьких записів в англійській Вікісховищі (ох і ей) IPA виглядав як на англійському, так і на німецькому Вікісловниках. Там, де пропонувалося кілька вимов, я вибрав більш формальну та стандартну. Якщо це було не ясно, я вибрав той, який найбільше відповідає загальним правилам.

Мені довелося також стандартизувати, як вимовляється буква "r". Це сильно залежить від регіону, як вимовляється цей лист, і Вікісловник взагалі не відповідав тому, який саме обрав. Я відчував, що він схильний до наступного: "r" вимовляється / ɐ̯ /, коли супроводжується довгим голосним, а голосний не слідує, інакше це ʁ. Отже, я змінив усіх, щоб дотримуватись цього правила, за винятком вер- і ерфіксів, які цілком послідовно / (f) ɛɐ̯ /. Аналогічно я стандартизував "eu" як / ɔʏ̯ /.


16
Mathematica має вбудований для цього ( #~WordData~"PhoneticForm"&), але він працює лише для англійських слів.
JungHwan Min

29
@JungHwanMin Я прочитав ваш коментар наступним чином: негайний інфаркт, зітхання полегшення.
DPenner1

1
Як я можу знати, що "gestern" вимовляється "GHES-tern" замість "ge-SHTERN"? "bester" як "BEST-er" не "be-SHTER"?
Лина монашка

@LeakyNun Для цього не існує 100% алгоритму, але для вашої реалізації потрібно отримати лише 75%. Моя довідкова реалізація також помиляється з цими словами.
DPenner1

@LeakyNun Добре, що ваша програма також зможе мати справу з німецькими діалектами, тому вона є потужнішою.
P. Siehr

Відповіді:


9

PHP, 3311 2988 2916 2845 2759 2671 2667 2509 2484 байт, передаючи 301/400

<?$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ø]);}

Визначає pronounce(string $word).

Використання:

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

Одна примітка: 3 префікса та 33 слова жорстко кодовані, а частина коду м'яко оптимізована до списку тестування.

Код тестування є тут , хоча він залежить від цього файлу .

Перевіряти:

php test.php all

Працює сльозами потрійних тверджень.

EDIT 7 : Витіснено ~ 170 байт, записавши в програму препроцесор. Як наслідок, власне програму (все після __halt_compiler();) важко читати. Якщо ви хочете необроблену програму, перейдіть evalз printв третьому заяві.


Це насправді 2667 байт, а не 2671 (якщо вважати UTF-8)
caird coinheringaahing
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.