Almanca kelimeleri nasıl telaffuz et


37

Giriş

İngilizceden farklı olarak Almanca'nın oldukça sesli bir yazı sistemine sahip olduğu düşünülmektedir . Bu, imla ve telaffuz arasındaki yazışmanın yakın olduğu anlamına gelir. Aşina olmadığınız herhangi bir kelime verildiğinde, yazım sistemi nedeniyle nasıl telaffuz edileceğini hala bilirsiniz. Bu, bir bilgisayarın bunu doğru yapabileceği anlamına mı geliyor?

Meydan okuma

Almanca bir kelimeyi temsil eden bir dize girdi olarak alan ve Uluslararası Fonetik Alfabesinde (IPA) telaffuzunu basan veya veren bir program veya işlev yazın .

Elbette sizi Almanca ya da IPA'nın tamamını öğrenmeye zorlamayacağım . Bu bir Wikipedia bölümü , ihtiyacınız olan hemen hemen tüm Alman IPA kurallarını sağlar ve ben bir yıpranmış C # başvuru uygulamasını kodladım .

Ayrıca, bu bağlantıda, 400 ortak Almanca kelimenin ve IPA telaffuzlarının bir listesidir (doğrulama için gereklidir). Bu listeden örnek almak gerekirse, girdi ise solltestdoğru çıktıdır ˈzɔltəst.

Referans uygulaması, Vikipedi bölümünde belirtilmeyen iki yararlı kural ekler: Kelime vurgusunun ilk hecede olduğunu (çok büyük olasılıkla Almanca'da) olduğunu ve "e" harfinin schwa sesini / ə / 'yi ne zaman temsil ettiğini belirlemek için daha iyi bir buluşsal yöntem kullandığını varsayar. Aynı zamanda önekler için özel işlem uygular, ancak bu düşündüğüm kadar iyi sonuç vermedi.

ayrıntılar

Geçerli bir giriş olarak kabul edilmek için, programınızın aşağıdaki gereksinimleri karşılaması gerekir:

  • IPA çıktınızın, referans kelime listesindeki 400 kelimeden en az 300 tanesi için tam bir eşleşme olmalıdır (referans uygulaması 333 doğru olur)
  • Programınız makul herhangi bir Almanca kelime için bir tahmin yapmak zorundadır. Bu yüzden teknik bir ihtiyacımız var, bunun anlamı, regex [a-zA-ZäÄöÖüÜ][a-zäöüß]*ile eşleşen ve en az bir ünlü olan (aeiouyäöü) herhangi bir girdi için , beyaz boşluk içermeyen çıktı üretmeniz ve hata olmaması gerektiği anlamına gelir.
  • Program deterministik olmalı (her zaman aynı girdiyi veren aynı çıktıyı üret)
  • Aksi takdirde, standart boşluklar yasaktır (özellikle saha dışı kaynakları getirme konusunda)

Yapmanıza izin verilen çeşitli şeyler:

  • Gerekirse çıktınızda öncü ve iz bırakan boşluk bırakın
  • Çıktıda önceden var olan herhangi bir karakter kodlamasını kullanın (Unicode'un iyi çalıştığını düşünmeden başkasını düşünemiyorum, ancak tebrik ediyorsanız)
  • Girişin, Unicode normalizasyon formları NFD, NFC, vb. Gibi normalleştirilmiş bir biçimde olduğunu varsayalım. Örneğin, ä, tek bir karakter veya bir temel karakter + bir birleştirme karakteri olarak yazılır mı?
  • Standart giriş ve çıkış yöntemlerini kullanın

Puanlama ve IPA Karakterleri

Puanlama bayt cinsindendir. UTF-8'de Alman karakterleri ve IPA karakterlerinin 2 bayt olduğu konusunda uyarılırsınız. Ayrıca, IPA karakteri U + 0327 AŞAĞIDAKİ YAN KESME BİRLEŞTİRMESİ (̯) bir Unicode birleştirme karakteridir ve kendi başına 2 baytlık bir UTF-8 karakteridir. Bu like gibi bir şeyin UTF-8'de 4 bayt olarak sayılacağı anlamına gelir. Meraklı için, bu sembol ünlüün heceli çekirdeği oluşturmadığı anlamına gelir (bunun yerine bir önceki).

Ayrıca, bazı fontlarda diğer ASCII karakterlerine benzeyen bu IPA karakterlerine dikkat edin: ɡ, ɪ, ʏ, ː (uzun bir sesli harf işaretler), ˈ (heceli, çok heceli bir kelimede strese sahip olan işaretler).

Referans kelime listesi nasıl oluşturuldu

Bu bölüm, zorluk için gerekli olmayan ekstra bilgidir.

Kelime listesi, bu Vikisözlük kelime sıklığı listesinden alındı , gövde farkı nedeniyle tekrarları kaldırarak İngilizce Vikisözlük'te Almanca girişleri olmayan iki kelime çıkarıldı (oh & hey). IPA, hem İngiliz hem de Alman Vikinglere bakıyor. Birden fazla telaffuz önerildiği zaman, daha resmi ve standart olanı seçtim. Bu açık değilse, genel kurallara en uygun olanı seçtim.

Ayrıca "r" harfinin nasıl telaffuz edildiğini de standartlaştırmam gerekiyordu. Bu mektubun nasıl telaffuz edildiğine bölgeye büyük ölçüde bağlıdır ve Vikisözlük seçtiği yazıyla hiç tutarlı değildi. Aşağıdakine doğru eğiliminde olduğumu hissettim: "r", / ɐ̯ / tarafından telaffuz edildiğinde uzun bir ünlü harf tarafından takip edilir ve bir sesli harf bunu takip etmez, aksi halde, ʁ olur. Bu yüzden, hepsini tutarlı bir şekilde uygulayan ters ve ekler hariç, bu kurala uyacak şekilde değiştirdim / (f) ɛɐ̯ /. Benzer şekilde, "eu" yi / ɔʏ̯ / olarak standartlaştırdım.


16
Mathematica'nın bunun için yerleşik bir özelliği var ( #~WordData~"PhoneticForm"&), ancak yalnızca İngilizce kelimeler için çalışıyor.
JungHwan Min

29
@JungHwanMin Yorumunuzu şu şekilde okudum: Acil kalp krizi, rahatlama hissi.
DPenner1

1
"Gestern" in "ge-SHTERN" yerine "GHES-tern" olarak telaffuz edildiğini nasıl bileyim? "BEST-er" olarak "bester" "SHTER-değil"?
Sızdıran Rahibe

@LeakyNun Bunun için% 100 algoritma yok, ancak uygulamanızın yalnızca% 75 alması gerekiyor. Referans uygulamam da bu kelimeleri yanlış anlıyor.
DPenner1

@LeakyNun Eh, programınız da Alman lehçeleri ile başa çıkmak mümkün olacak, bu yüzden daha güçlü.
P. Siehr

Yanıtlar:


9

PHP, 3311 2988 2916 2845 2759 2671 2667 2509 2484 bayt, 301/400 geçen

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

Tanımlar pronounce(string $word).

Kullanımı:

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

Bir not: 3 önek ve 33 kelime kodlanmıştır ve kodun bir kısmı test listesine göre hafifçe optimize edilmiştir.

Bu dosyaya bağlı olmasına rağmen test kodu burada .

Test etmek için:

php test.php all

Üçlü ifadelerin gözyaşları ile güçlendirilmiştir.

EDIT 7 : Programa bir önişlemci yazarak ~ 170 bayt sıkıldı. Sonuç olarak, gerçek programın (her şeyden sonra __halt_compiler();) okunması zor. Eğer işlenmemiş programı istiyorsanız, geçiş evalile printüçüncü açıklamada.


Bu aslında 2667 bayttır, 2671 değil (UTF-8 varsayılırsa)
caird coinheringaahing
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.