Đoán cách phát âm từ tiếng Đức


37

Giới thiệu

Không giống như tiếng Anh, tiếng Đức được coi là có một hệ thống chữ viết theo ngữ âm . Điều đó có nghĩa là sự tương ứng giữa chính tả và phát âm là gần gũi. Cho bất kỳ từ nào bạn không quen thuộc, bạn vẫn sẽ biết cách phát âm nó vì hệ thống chính tả. Điều này có nghĩa là một máy tính sẽ có thể làm điều đó quá phải không?

Thử thách

Viết chương trình hoặc hàm lấy đầu vào là một chuỗi đại diện cho một từ tiếng Đức và in hoặc trả lại cách phát âm của nó trong Bảng chữ cái ngữ âm quốc tế (IPA) .

Tôi tất nhiên sẽ không làm cho bạn học tiếng Đức hoặc IPA đầy đủ . Phần Wikipedia này cung cấp hầu hết tất cả các quy tắc tiếng Đức cho IPA mà bạn cần và tôi đã mã hóa việc triển khai tham chiếu C # không được phép .

Cũng được cung cấp trong liên kết đó là một danh sách 400 từ tiếng Đức thông dụng và phát âm IPA của họ (cần thiết để xác nhận). Lấy một ví dụ từ danh sách đó, nếu đầu vào là solltest, đầu ra đúng là ˈzɔltəst.

Việc triển khai tham chiếu bổ sung hai quy tắc hữu ích không được đề cập trong phần Wikipedia: Nó giả sử trọng âm của từ nằm ở âm tiết thứ nhất (rất có thể là tiếng Đức) và sử dụng phương pháp phỏng đoán tốt hơn để xác định khi chữ "e" đại diện cho âm schwa / ə /. Nó cũng thực hiện xử lý đặc biệt cho các tiền tố, nhưng điều đó không cải thiện kết quả nhiều như tôi nghĩ.

Chi tiết

Để được coi là một mục hợp lệ, chương trình của bạn phải đáp ứng các yêu cầu sau:

  • Đầu ra IPA của bạn phải khớp chính xác với ít nhất 300 trong số 400 từ trong danh sách từ tham chiếu (triển khai tham chiếu được 333 chính xác)
  • Chương trình của bạn phải đoán cho bất kỳ từ tiếng Đức hợp lý. Vì vậy, chúng tôi có một yêu cầu kỹ thuật, điều này có nghĩa là đối với bất kỳ đầu vào nào khớp với biểu thức chính quy [a-zA-ZäÄöÖüÜ][a-zäöüß]*và có ít nhất một nguyên âm (aeiouyäöü), bạn phải tạo đầu ra không chỉ khoảng trắng và không bị lỗi.
  • Chương trình phải có tính xác định (luôn tạo ra cùng một đầu ra với cùng một đầu vào)
  • Mặt khác, các lỗ hổng tiêu chuẩn bị cấm (đặc biệt là các lỗ hổng về tìm nạp tài nguyên ngoài trang web)

Những thứ linh tinh bạn được phép làm:

  • Có khoảng trắng hàng đầu và dấu trong đầu ra của bạn nếu bạn phải
  • Sử dụng bất kỳ mã hóa ký tự có sẵn nào trong đầu ra (Tôi không thể tưởng tượng bất cứ điều gì ngoài Unicode hoạt động tốt, nhưng nếu bạn có thể, xin chúc mừng)
  • Giả sử đầu vào ở một số dạng được chuẩn hóa như các dạng chuẩn hóa Unicode NFD, NFC, v.v. Ví dụ: ä được viết dưới dạng một ký tự đơn hay ký tự cơ sở + ký tự kết hợp?
  • Sử dụng phương pháp đầu vào và đầu ra tiêu chuẩn

Ghi điểm & ký tự IPA

Ghi điểm được tính bằng byte. Được cảnh báo rằng các ký tự tiếng Đức và các ký tự IPA là 2 byte trong UTF-8. Ngoài ra, ký tự IPA U + 0327 COMBINING INVERTED BREVE BÊN DƯỚI () là một ký tự kết hợp Unicode và tự nó là một ký tự UTF-8 2 byte. Điều đó có nghĩa là một cái gì đó như sẽ được tính là 4 byte trong UTF-8. Đối với người tò mò, biểu tượng này có nghĩa là nguyên âm không tạo thành hạt nhân âm tiết (cái trước đó thay thế).

Ngoài ra, hãy cẩn thận với các ký tự IPA này trong một số phông chữ trông giống như các ký tự ASCII khác:,,, (đánh dấu một nguyên âm dài), ˈ (đánh dấu âm tiết có trọng âm trong một từ đa âm).

Làm thế nào danh sách từ tham chiếu được tạo ra

Phần này là thông tin bổ sung không cần thiết cho thử thách.

Danh sách từ được lấy từ danh sách tần số từ Wiktionary này , loại bỏ các lần lặp lại vì sự khác biệt về vỏ và hai từ không có mục tiếng Đức trong Wiktionary tiếng Anh (oh & hey). IPA là từ việc xem xét cả Wiktionaries tiếng Anh và tiếng Đức. Trường hợp nhiều cách phát âm được đưa ra, tôi đã chọn cách phát âm chính thức và chuẩn hơn. Nếu điều này không rõ ràng, tôi đã chọn một quy tắc phù hợp nhất với các quy tắc chung.

Tôi cũng phải chuẩn hóa cách phát âm chữ "r". Nó phụ thuộc rất nhiều vào khu vực mà lá thư này được phát âm như thế nào và Wiktionary hoàn toàn không phù hợp với cái mà nó đã chọn. Tôi cảm thấy nó có xu hướng như sau: "r" được phát âm là / / khi theo sau là một nguyên âm dài và một nguyên âm không theo sau, nếu không, đó là. Vì vậy, tôi đã thay đổi tất cả chúng để tuân theo quy tắc đó, ngoại trừ các tiền tố ver và er khá ổn định / (f) /. Tương tự, tôi đã tiêu chuẩn hóa "eu" là / /.


16
Mathematica có tích hợp sẵn cho điều này ( #~WordData~"PhoneticForm"&), nhưng nó chỉ hoạt động cho các từ tiếng Anh.
JungHwan Min

29
@JungHwanMin Tôi đọc bình luận của bạn như sau: Đau tim tức thì, thở phào nhẹ nhõm.
DPenner1

1
Làm sao tôi biết "cử chỉ" được phát âm là "GHES-tern" thay vì "ge-SHTERN"? "Tốt nhất" là "TỐT NHẤT" chứ không phải "BẮT ĐẦU"?
Leaky Nun

@LeakyNun Không có thuật toán 100% cho việc này, nhưng việc thực hiện của bạn chỉ cần nhận được 75%. Tham khảo thực hiện của tôi cũng nhận được những từ sai.
DPenner1

@LeakyNun Vâng, chương trình của bạn cũng sẽ có thể đối phó với các phương ngữ Đức, vì vậy nó mạnh hơn.
P. Siehr

Câu trả lời:


9

PHP, 3311 2988 2916 2845 2759 2671 2667 2509 2484 byte, vượt qua 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ø]);}

Định nghĩa pronounce(string $word).

Sử dụng:

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

Một lưu ý: 3 tiền tố và 33 từ được mã hóa cứng và một số mã được tối ưu hóa nhẹ cho danh sách thử nghiệm.

Mã kiểm tra ở đây , mặc dù nó phụ thuộc vào tệp này .

Để kiểm tra:

php test.php all

Cung cấp bởi những giọt nước mắt của báo cáo ternary.

EDIT 7 : Bóp ~ 170 byte bằng cách viết bộ tiền xử lý vào chương trình. Kết quả là, chương trình thực tế (mọi thứ sau đó __halt_compiler();) hơi khó đọc. Nếu bạn muốn chương trình chưa qua chế biến, chuyển evalvới printtrong báo cáo thứ ba.


Đây thực sự là 2667 byte, không phải 2671 (giả sử UTF-8)
caird coinheringaahing
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.