ドイツ語の発音を推測する


37

前書き

英語とは異なり、ドイツ語は音素表記システムが非常に優れていると考えられています。これは、スペルと発音の対応が近いことを意味します。なじみのない単語を考えても、スペルシステムのために、その単語の発音方法を知っているでしょう。これは、コンピューターでも正しく実行できるはずだということですか?

チャレンジ

ドイツ語の単語を表す文字列を入力として受け取り、その発音を国際音声文字(IPA)で出力または返すプログラムまたは関数を作成します。

もちろん、ドイツ語や完全なIPAを学ばせるつもりはありません。この1つのWikipediaのセクションでは、あなたが必要とするルール、と私はungolfed C#のコード化されてきたIPAにほぼすべてのドイツ語を提供リファレンス実装を

このリンクには、400の一般的なドイツ語の単語とそのIPAの発音のリストも提供されています(検証に必要です)。そのリストから例を挙げると、入力がのsolltest場合、正しい出力はˈzɔltəstです。

参照実装は、Wikipediaセクションで言及されていない2つの有用なルールを追加します:単語のストレスが最初の音節(ドイツ語である可能性が非常に高い)にあると想定し、文字「e」がシュワ音/ə/を表すタイミングを決定するために、より良いヒューリスティックを使用します。プレフィックスの特別な処理も実装しますが、思ったほど結果が改善されませんでした。

詳細

有効なエントリと見なされるには、プログラムが次の要件を満たしている必要があります。

  • IPA出力は、参照語リストの 400語のうち少なくとも300語と完全に一致する必要があります(参照実装は333正しいです)
  • あなたのプログラムは、もっともらしいドイツ語を推測する必要があります。したがって、技術的な要件があります。これは、正規表現に一致し、[a-zA-ZäÄöÖüÜ][a-zäöüß]*少なくとも1つの母音(aeiouyäöü)を持つ入力については、空白以外の出力を生成し、エラーを出力しないことを意味します。
  • プログラムは決定論的である必要があります(同じ入力に対して常に同じ出力を生成します)
  • それ以外の場合、標準的な抜け穴は禁止されています(特に、オフサイトリソースの取得に関するもの)

許可されているその他のこと:

  • 必要に応じて、出力に先頭と末尾の空白を含める
  • 出力に既存の文字エンコーディングを使用します(Unicode以外がうまく機能することは想像できませんが、可能であればおめでとうございます)
  • 入力は、ユニコード正規化形式NFD、NFCなどのような正規化された形式であると仮定します。たとえば、äは単一の文字またはベース文字+結合文字として書かれていますか?
  • 標準の入出力方法を使用する

スコアリングとIPAキャラクター

スコアリングはバイト単位です。ドイツ語の文字とIPAの文字はUTF-8で2バイトであることに注意してください。また、IPA文字U + 0327 COMBINING INVERTED BREVE BELOW(̯)はUnicode結合文字であり、2バイトのUTF-8文字そのものです。つまり、ɐ̯のようなものはUTF-8では4バイトとしてカウントされます。好奇心の強い人のために、この記号は母音が音節核を形成しないことを意味します(前のものは代わりに形成します)。

また、一部のフォントでは他のASCII文字のように見えるこれらのIPA文字に注意してください。

参照語リストの作成方法

このセクションは、チャレンジには不要な追加情報です。

単語リストはこのウィクショナリーの単語頻度リストから取得さ、大文字と小文字の違いと、英語のウィクショナリーにドイツ語のエントリがない2つの単語(oh&hey)のために繰り返しを削除しました。IPAは、英語とドイツ語の両方のウィクショナリーを見ていた。複数の発音が提供された場合、より正式で標準的なものを選びました。これが明確でない場合は、一般的なルールに最も適合するものを選択しました。

また、文字「r」の発音方法を標準化する必要がありました。この文字がどのように発音されるかは地域に大きく依存しており、ウィクショナリーは選択したものとまったく一貫していませんでした。私はそれが次の傾向があると感じました:「r」は長い母音が続き、母音が続かないとき発音される/ɐ̯/、そうでなければ、それはʁです。したがって、非常に一貫性のある/(f)ɛɐ̯/であるver-およびer-プレフィックスを除き、すべてのルールをそのルールに従うように変更しました。同様に、「eu」を/ɔʏ̯/として標準化しました。


16
Mathematicaにはこの機能が組み込まれています(#~WordData~"PhoneticForm"&)が、英語の単語に対してのみ機能します。
ジョンファンミン

29
@JungHwanMin次のようにあなたのコメントを読みました:即座の心臓発作、安reliefのため息。
-DPenner1

1
「gestern」が「ge-SHTERN」ではなく「GHES-tern」と発音されることをどのように知る必要がありますか?「bester」は「be-SHTER」ではなく「BEST-er」ですか?
リーキー修道女

@LeakyNunこれには100%のアルゴリズムはありませんが、実装で必要なのは75%だけです。私のリファレンス実装もこれらの言葉を間違っています。
DPenner1

@LeakyNunまあ、あなたのプログラムはドイツ語の方言にも対応できるので、より強力です。
P.シーア

回答:


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();)は読みにくいです。あなたは未処理のプログラムをしたい場合は、切り替えるevalprint3番目のステートメントで。


これは実際には2667バイトであり、2671ではありません(UTF-8を想定)
コヒーリングを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.