독일어 단어를 발음하는 방법 추측


37

소개

영어와는 달리, 독일어는 상당히 음소 작성 시스템으로 간주됩니다 . 그것은 철자와 발음 사이의 대응이 가깝다는 것을 의미합니다. 익숙하지 않은 단어가 있으면 맞춤법 시스템으로 인해 발음 방법을 알 수 있습니다. 이것은 컴퓨터가 제대로 할 수 있어야한다는 것을 의미합니까?

도전

독일어 단어를 나타내는 문자열을 입력으로 사용하고 해당 발음을 국제 음성 알파벳 (IPA)로 인쇄하거나 반환하는 프로그램 또는 함수를 작성하십시오 .

물론 독일어 나 전체 IPA를 배우게하지는 않을 것 입니다. 이 하나의 Wikipedia 섹션 은 필요한 거의 모든 독일에서 IPA 규칙을 제공하며, ungolfed C # 참조 구현을 코딩했습니다 .

또한이 링크 에는 400 개의 공통 독일어 단어와 해당 IPA 발음 (검증에 필요) 목록 이 제공됩니다 . 해당 목록에서 예를 들어, 입력이 solltest인 경우 올바른 출력은 ˈzɔltəst입니다.

참조 구현은 Wikipedia 섹션에 언급되지 않은 두 가지 유용한 규칙을 추가합니다. 단어 스트레스가 첫 음절 (독일어 일 가능성 있음)에 있다고 가정하고 문자 "e"가 schwa 사운드 / ə /를 나타내는시기를 결정하는 데 더 나은 휴리스틱을 사용합니다. 또한 접두사에 대한 특수 처리를 구현하지만 생각만큼 결과가 향상되지 않았습니다.

세부

유효한 출품작으로 간주 되려면 프로그램이 다음 요구 사항을 충족해야합니다.

  • IPA 출력은 참조 단어 목록 에서 400 개 단어 중 300 개 이상과 정확히 일치해야 합니다 (참조 구현은 333이 정확함)
  • 프로그램은 그럴듯한 독일어 단어를 추측해야합니다. 따라서 기술 요구 사항이 있으므로 정규식 [a-zA-ZäÄöÖüÜ][a-zäöüß]*과 일치하고 모음 (aeiouyäöü)이 하나 이상 있는 입력의 경우 공백이 아닌 출력 만 생성하고 오류가 발생하지 않아야합니다.
  • 프로그램은 결정적이어야합니다 (항상 동일한 입력이 주어지면 항상 동일한 출력을 생성 함)
  • 그렇지 않으면 표준 허점 이 금지됩니다 (특히 외부 리소스 가져 오기에 관한 문제).

기타 할 수있는 일 :

  • 필요한 경우 출력에 선행 및 후행 공백이 있어야합니다.
  • 출력에 기존 문자 인코딩을 사용하십시오 (유니 코드 이외의 다른 것은 잘 작동하지 않지만 가능하면 축하합니다)
  • 입력이 유니 코드 정규화 형식 NFD, NFC 등과 같은 정규화 된 형식으로 가정합니다. 예를 들어, 단일 문자 또는 기본 문자 + 결합 문자로 작성되어 있습니까?
  • 사용 표준 입력 및 출력 방법을

채점 및 IPA 문자

점수는 바이트 단위입니다. 독일어 문자와 IPA 문자는 UTF-8에서 2 바이트입니다. 또한 IPA 문자 U + 0327 COMBINING INVERTED BREVE BELOW (̯)는 유니 코드 결합 문자이며 2 바이트 UTF-8 문자입니다. 이것은 ɐ̯와 같은 것이 UTF-8에서 4 바이트로 계산됨을 의미합니다. 호기심을 나타 내기 위해이 기호는 모음이 음절 핵을 형성하지 않음을 의미합니다 (이전 모음은 대신).

또한 일부 글꼴에서 다른 ASCII 문자처럼 보이는 이러한 IPA 문자를주의하십시오 : ɡ, ɪ, ʏ, ː (긴 모음 표시), ˈ

참조 단어 목록을 만든 방법

이 섹션은 도전에 필요하지 않은 추가 정보입니다.

이 위키 낱말 사전 단어 빈도 목록 에서 단어 목록을 가져 와서 대소 문자 차이로 인해 반복이 제거되었으며 영어 위키 낱말 사전에서 독일어 항목이없는 두 단어 (oh & hey)가 제거되었습니다. IPA는 영어와 독일어 위키 낱말 사전을 모두보고있었습니다. 여러 발음이 제공되는 곳에서 더 형식적이고 표준적인 발음을 선택했습니다. 이것이 확실하지 않은 경우, 나는 일반적인 규칙에 가장 적합한 것을 선택했습니다.

나는 또한 문자 "r"이 어떻게 발음되는지 표준화해야했다. 이 서한이 어떻게 발음되었는지는 지역에 따라 크게 좌우되며, 위키 낱말 사는 어느 서신을 선택했는지에 대해서는 전혀 일치하지 않았습니다. 나는 다음과 같은 경향이 있다고 느꼈다. "r"은 긴 모음이 이어지고 모음이 따르지 않을 때 / ɐ̯ /로 발음되며, 그렇지 않으면 ʁ이다. 따라서 나는 일관되게 / (f) ɛɐ̯ / 인 ver-와 er- 접두사를 제외하고는 모두 그 규칙을 따르도록 변경했습니다. 마찬가지로 "eu"를 / ɔʏ̯ /로 표준화했습니다.


16
Mathematica에는이 기능이 내장되어 #~WordData~"PhoneticForm"&있지만 영어 단어에만 사용할 수 있습니다.
JungHwan Min

29
@JungHwanMin 나는 다음과 같이 귀하의 의견을 읽었습니다 : 즉각적인 심장 마비, 안도의 한숨.
DPenner 1

1
"getern"이 "ge-SHTERN"대신 "GHES-tern"으로 발음되는 것을 어떻게 알 수 있습니까? "베스터"가 아닌 "베스터"로 "베스터"?
Leaky Nun

@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

삼항 진술의 눈물에 의해 구동.

편집 7 : 프로그램에 프리 프로세서를 작성하여 ~ 170 바이트를 압축 해제했습니다. 결과적으로 실제 프로그램 (이후의 모든 것 __halt_compiler();)은 읽기 어렵습니다. 당신이 처리되지 않은 프로그램을 원하는 경우에, 전환 evalprint세 번째 문이다.


이것은 (UTF-8 가정)하지 2,671 실제로 2667 바이트이다
coinheringaahing 케어 드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.