เดาวิธีออกเสียงคำศัพท์ภาษาเยอรมัน


37

บทนำ

ซึ่งแตกต่างจากภาษาอังกฤษ, เยอรมันถือว่ามีค่อนข้างระบบการเขียนสัทศาสตร์ นั่นหมายความว่าการติดต่อระหว่างการสะกดคำและการออกเสียงใกล้เคียงกัน เมื่อได้คำที่คุณไม่คุ้นเคยคุณจะยังคงรู้วิธีออกเสียงเนื่องจากระบบสะกดคำ หมายความว่าคอมพิวเตอร์ควรทำถูกเกินไป

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เป็น input สตริงที่แสดงคำเยอรมัน, และพิมพ์หรือผลตอบแทนการออกเสียงในสัทอักษรสากล (IPA)

ผมแน่นอนไม่ได้ไปทำให้คุณเรียนรู้ภาษาเยอรมันหรือ IPA นี้เป็นหนึ่งในส่วนที่วิกิพีเดียให้เกือบทุกเยอรมัน IPA กฎที่คุณต้องการและฉันได้รหัส ungolfed C # ดำเนินการอ้างอิง

นอกจากนี้ในลิงก์นั้นยังมีรายการ 400 คำภาษาเยอรมันทั่วไปและการออกเสียง IPA (จำเป็นสำหรับการตรวจสอบ) การตัวอย่างจากรายการที่ถ้าใส่เป็นผลผลิตที่ถูกต้องคือsolltestˈzɔltəst

การนำการอ้างอิงมาใช้เพิ่มกฎที่เป็นประโยชน์สองข้อที่ไม่ได้กล่าวถึงในส่วน Wikipedia: ถือว่ามีการเน้นคำเป็นพยางค์แรก (น่าจะเป็นภาษาเยอรมัน) และใช้ heuristic ที่ดีกว่าในการพิจารณาว่าตัวอักษร "e" แสดงถึง schwa sound / ə / นอกจากนี้ยังใช้การประมวลผลพิเศษสำหรับคำนำหน้า แต่ก็ไม่ได้ปรับปรุงผลลัพธ์เท่าที่ฉันคิด

รายละเอียด

ในการพิจารณารายการที่ถูกต้องโปรแกรมของคุณจะต้องมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้:

  • เอาต์พุต IPA ของคุณจะต้องตรงกับคำอย่างน้อย 300 จาก 400 คำในรายการคำอ้างอิง (การดำเนินการอ้างอิงได้รับ 333 ถูกต้อง)
  • โปรแกรมของคุณต้องเดาคำศัพท์ภาษาเยอรมันที่เป็นไปได้ ดังนั้นเรามีข้อกำหนดทางเทคนิคนี่หมายความว่าสำหรับอินพุตใด ๆ ที่ตรงกับ regex [a-zA-ZäÄöÖüÜ][a-zäöüß]*และมีสระอย่างน้อยหนึ่งสระ (aeiouyääüü) คุณต้องสร้างเอาต์พุตไม่ใช่ช่องว่างเท่านั้นและไม่ผิดพลาด
  • โปรแกรมจะต้องถูกกำหนดไว้ล่วงหน้า (สร้างเอาต์พุตเดียวกันเสมอเมื่อได้รับอินพุตเดียวกัน)
  • มิฉะนั้นจะต้องห้ามช่องโหว่มาตรฐาน (โดยเฉพาะที่เกี่ยวกับการดึงทรัพยากรนอกสถานที่)

สิ่งอื่น ๆ ที่คุณได้รับอนุญาตให้ทำ:

  • มีช่องว่างชั้นนำและต่อท้ายในผลลัพธ์ของคุณถ้าคุณต้อง
  • ใช้การเข้ารหัสอักขระที่มีอยู่แล้วในผลลัพธ์ (ฉันไม่สามารถจินตนาการได้เลยว่า Unicode ทำงานได้ดี แต่ถ้าคุณทำได้ขอแสดงความยินดี)
  • สมมติว่าอินพุตอยู่ในรูปแบบที่ทำให้เป็นมาตรฐานเช่น Unicode normalization form NFD, NFC เป็นต้นตัวอย่างเช่นäเขียนเป็นอักขระเดี่ยวหรืออักขระพื้นฐาน + อักขระรวมกันหรือไม่
  • ใช้วิธีการอินพุตและเอาต์พุตมาตรฐาน

การให้คะแนนและตัวละคร IPA

การให้คะแนนอยู่ในหน่วยไบต์ ถูกเตือนว่าอักขระภาษาเยอรมันและอักขระ IPA มีขนาด 2 ไบต์ใน UTF-8 นอกจากนี้อักขระ IPA U + 0327 การรวม INVTED BREVE ด้านล่าง (̯) เป็น Unicode ที่รวมอักขระและเป็นอักขระ 2 ไบต์ UTF-8 ด้วยตัวเอง นั่นหมายความว่าสิ่งที่คล้ายกันɐ̯จะนับเป็น 4 ไบต์ใน UTF-8 สำหรับผู้อยากรู้อยากเห็นสัญลักษณ์นี้หมายถึงสระจะไม่ก่อให้เกิดนิวเคลียสพยางค์ (อันก่อนหน้านี้แทน)

นอกจากนี้ระวังตัวอักษร IPA เหล่านี้ที่ในแบบอักษรบางตัวดูเหมือนอักขระ ASCII อื่น ๆ : ɡ, ɪ, ʏ, ː (ทำเครื่องหมายเสียงสระยาว), ˈ (เครื่องหมายที่พยางค์มีความเครียดในคำหลายคำ)

วิธีสร้างรายการคำอ้างอิง

ส่วนนี้เป็นข้อมูลเพิ่มเติมที่ไม่จำเป็นสำหรับความท้าทาย

รายการคำศัพท์นั้นถูกหยิบขึ้นมาจากรายการความถี่ในคำศัพท์ของ Wiktionaryซึ่งเป็นการลบการทำซ้ำเนื่องจากความแตกต่างของปลอกและคำสองคำที่ไม่มีรายการภาษาเยอรมันใน Wiktionary ภาษาอังกฤษ (โอ้ & เฮ้) IPA นั้นมาจากการมองทั้ง Wiktionaries ภาษาอังกฤษและภาษาเยอรมัน ในกรณีที่มีการออกเสียงหลายครั้งฉันเลือกแบบที่เป็นทางการและเป็นมาตรฐานมากกว่า หากสิ่งนี้ยังไม่ชัดเจนฉันเลือกกฎที่เหมาะสมกับกฎทั่วไปมากที่สุด

ฉันต้องทำให้เป็นมาตรฐานว่าตัวอักษร "r" ออกเสียงอย่างไร มันขึ้นอยู่กับภูมิภาคอย่างมากว่าจดหมายฉบับนี้ออกเสียงอย่างไรและ Wiktionary ก็ไม่สอดคล้องกับที่เลือกไว้ ฉันรู้สึกว่ามันมีแนวโน้มต่อไปนี้: "r" เด่นชัด / ɐ̯ / เมื่อตามด้วยเสียงสระยาวและเสียงสระไม่ได้ติดตาม ดังนั้นฉันจึงเปลี่ยนพวกเขาทั้งหมดให้ปฏิบัติตามกฎนั้นยกเว้นคำนำหน้าและคำนำหน้าที่ค่อนข้างสม่ำเสมอ / (f) ɛɐ̯ / ในทำนองเดียวกันฉันมาตรฐาน "eu" เป็น / ɔʏ̯ /


16
Mathematica มี built-in สำหรับสิ่งนี้ ( #~WordData~"PhoneticForm"&) แต่ใช้ได้กับคำภาษาอังกฤษเท่านั้น
JungHwan Min

29
@JungHwanMin ฉันอ่านความคิดเห็นของคุณดังนี้: หัวใจวายทันทีถอนหายใจด้วยความโล่งอก
DPenner1

1
ฉันจะรู้ได้อย่างไรว่า "gestern" ออกเสียงว่า "GHES-tern" แทนที่จะเป็น "ge-SHTERN" "bester" เป็น "best-er" ไม่ใช่ "be-SHTER" หรือไม่
Leun 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();) จึงอ่านยาก หากคุณต้องการโปรแกรมที่ไม่ได้ประมวลผลให้สลับevalกับprintคำสั่งที่สาม


นี่คือ 2667 ไบต์ไม่ใช่ 2671 (สมมติว่าเป็น UTF-8)
2560
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.