Trang 3 trên tổng số 3 Đầu tiênĐầu tiên 123
Từ 21 tới 30 trên tổng số 30 kết quả

Đề tài: một phương pháp mã hóa tiếng Việt

  1. #21
    Ngày gia nhập
    08 2017
    Bài viết
    2,660

    Mặc định một phương pháp mã hóa tiếng Việt

    Tiếng Việt, chữ nhiều ký tự nhất là nghiêng (7 ký tự - 7 chữ cái)

  2. #22
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    559

    Một cải tiến dễ thấy, dùng ít bộ nhớ hơn, là dựa vào tự điển các chữ Việt không dấu thanh. Theo đó, một chữ Việt mã hóa bằng số thứ tự của nó (bỏ qua dấu thanh) trong tự điển mọi chữ Việt không dấu thanh, theo sau là mã thanh.

    Tự điển như thế hiển nhiên là nhỏ hơn tự điển mọi chữ Việt đủ dấu. Nhưng đó mới chỉ là điều kiện cần để thu nhỏ mảng. Điều kiện đủ là chỉ số truy nhập mảng cũng phải ngắn gọn hơn trước. Vậy, hãy loại bỏ mã thanh ra khỏi chỉ số, giữ lại mã phụ âm đầu và mã âm vần.

    Nói hình thức hơn, gọi P, V, T lần lượt là phụ âm đầu, âm vần và thanh của một chữ Việt và p, v, t là 3 thành phần tương ứng trong mã của chữ ấy. Hiển nhiên PVT -> pvt là đơn ánh. Nhờ thế, trong cách cũ ta lấy pvt làm chỉ số để tra [số thứ tự của] PVT. Còn theo cách mới, để tra [số thứ tự của] PV, ta muốn dùng chỉ pv mà thôi.

    Muốn thế, PV -> pv phải là đơn ánh. Mã D không có tính chất này. Nhưng mã C thì có. Chẳng hạn, nhắc lại ví dụ trước đây, hai chữ bắnbắt trong mã D chỉ khác nhau ở mã thanh, nhưng trong mã C thì có mã âm vần khác nhau.

    Mặt khác, dịch mã từ D sang C rất dễ dàng, chỉ tốn vài phép tính. Thật ra, không cần dịch mã phụ âm đầu và thậm chí mã thanh, chỉ cần dịch mã âm vần. (Tức là thực hiện phép tính vD tD -> vC trong đó, chẳng hạn, vD là thành phần v của mã D.)

    Thế là ta đã lập được một mã tự điển mới, dựa trên C, gọi là C'.

    Như D', mã C' đạt mọi tiêu chí cho một mã M đã đặt ra ở bài trên:

    • Do mã C có 32 phụ âm đầu, 192 âm vần, tự điển có 32*192 = 6 * 2^10 từ mã và, do đó, số thứ tự của chúng có thể biểu diễn bằng 13 bit. Thêm 3 bit thanh, mã C' là một số nguyên 16 bit, không kể bit dấu (nếu có).
    • Do pv cũng có 13 bit, nhưng các phụ âm đầu được đánh số liên tục (từ 0 đến 31) và các âm vần cũng vậy (từ 0 đến 191), mảng không cần đến 2^13 phần tử, mà cũng chỉ cần 6 * 2^10 phần tử thôi. Và do 13 bit vẫn phải chứa bằng 2 byte, kích cỡ mảng là 12 KiB.


    Kích cỡ 12 KiB là tiến bộ so với 64 KiB trước đây, nhưng không có nhiều giá trị thực tiễn. Nó khá nhỏ so với L1 cache máy chủ, máy tính cá nhân và vài loại máy tính nhúng. Trong môi trường đó, và chỉ ở đó, cách này có thể nhanh hơn cách trước. Có thể thế.
    Đã được chỉnh sửa lần cuối bởi Ada : 04-06-2019 lúc 10:36 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #23
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    559

    Muốn giảm bộ nhớ hơn, ta phải tra bảng mã phụ âm đầu và bảng mã âm vần một cách độc lập. Nhưng P -> p và V -> v trong mã C chỉ là đơn ánh nếu xem P, V như là các âm nói. Khi chúng là chữ viết, tính đơn ánh không còn. Nhìn vào mã g/gh, không thể biết nó biểu thị chữ g hay chữ gh. Nhìn vào mã iêu/yêu, không thể biết nó biểu thị chữ iêu hay chữ yêu.

    Vì thế, ta phải dùng đến một mã khác gần với chữ viết hơn. Mã B.

    Trong mã B, ggh được biểu thị bằng hai mã số khác nhau. Và tương tự, ng/ngh, gi/g, iêu/yêu, oa/ua, đều phân biệt.

    Việc dịch mã từ C sang B tuân theo luật chính tả Việt thông thường.

    • gi/g nói chung được hiểu là gi; chỉ hiểu là g nếu mã âm vần có dạng ix hay x/x.
    • g/gh, ng/ngh nói chung được hiểu là g, ng; chỉ hiểu là gh, ngh nếu mã âm vần có dạng ex, êx, ix hay x/x.
    • Mã có dạng x/x nói chung được hiểu là x; chỉ hiểu là x nếu phụ âm đầu là âm trống.
    • Mã có dạng ox/ux nói chung được hiểu là ox; chỉ hiểu là ux nếu phụ âm đầu là q.


    Mã C có thể dịch sang mã B chỉ bằng tính toán (không tra bảng). Cách tính được xác định một cách gián tiếp qua cách dựng sau đây.

    1. Trong bảng mã âm vần C, vốn có 192 mã số, ghép hai mã số liên tiếp (chẵn, lẻ, theo thứ tự đó) thành 1 cặp. Bảng mã trở thành một bảng có 96 cặp.
    2. Xem bảng này như một ma trận 4 hàng 24 cột, chuyển vị nó thành một ma trận 24 hàng 4 cột. Ma trận chuyển vị biểu diễn một bảng mã âm vần mới có cùng cỡ với C, gọi là C*.
    3. Trong bảng mã C*, ở mỗi vị trí k có giá trị "nước đôi", nghĩa là biểu thị hai chữ u/v khác nhau, gán giá trị u cho vị trí k ấy và gán giá trị v cho vị trí k+64 (vốn nằm ngoài bảng C*).


    Sau quy trình trên, ta thu được một bảng mã âm vần lớn hơn C*. Đó chính là bảng mã âm vần của mã B.

    Còn bảng mã phụ âm đầu thì đơn giản, xin miễn trình bày.

    Bảng 3c. Bảng mã âm vần của mã B. Trong đó, ua có 2 mã số khác nhau, 0xD9 và 0x40, tương ứng lần lượt với 2 ngữ cảnh q-ua và (chẳng hạn) c-ua. Muốn cho phép từ mã q-a giải mã thành qa, phải gán giá trị a cho mã số 0xD8. Muốn dùng kỹ thuật tách rời bit cuối của mã âm vần [xem #26, dưới] hay kỹ thuật thử khoảng đã tối ưu hóa với 2 cận "đẹp" [xem #27, dưới], để từ mã --ia giải mã thành ia, phải gán giá trị ia cho mã số 0xE8.
    Code:
         0_   1_   2_   3_   4_   5_    6_   7_   8_   9_   A_   B_   C_   D_   E_  
    ================================================================================
    _0   ao   âu   ô    u    ua   uê    uy   ươu  oao  oe   i    e    uao  ue       
    _1   ai   ây   ôi   ui   uôi  uêu   uyu  ươi  oai  oeo  iu   eo   uai  ueo      
    _2   am   âm   ôm   um   uôm  uêm   uym  ươm  oam  oem  im   em   uam  uem      
    _3   ap   âp   ôp   up   uôp  uêp   uyp  ươp  oap  oep  ip   ep   uap  uep      
    _4   an   ân   ôn   un   uôn  uên   uyn  ươn  oan  oen  in   en   uan  uen      
    _5   at   ât   ôt   ut   uôt  uêt   uyt  ươt  oat  oet  it   et   uat  uet      
    _6   ang  âng  ông  ung  uông uêng  uynh ương oang oeng inh  eng  uang ueng     
    _7   ac   âc   ôc   uc   uôc  uêc   uych ươc  oac  oec  ich  ec   uac  uec      
    _8   au   o    ơ    uâu  uơ   y     ưu   ư    oau  a    ia   ê    uao           
    _9   ay   oi   ơi   uây  uơi  uya   ưi   ưa   oay  oa   iêu  êu   uay  ua   yêu 
    _A   ăm   om   ơm   uâm  uơm  uênh  ưm   anh  oăm  oanh iêm  êm   uăm  uanh yêm 
    _B   ăp   op   ơp   uâp  uơp  uêch  ưp   ach  oăp  oach iêp  êp   uăp  uach yêp 
    _C   ăn   on   ơn   uân  uơn  uyên  ưn   oong oăn  êng  iên  ên   uăn       yên 
    _D   ăt   ot   ơt   uât  uơt  uyêt  ưt   ooc  oăt  êc   iêt  êt   uăt       yêt 
    _E   ăng  ong  ơng  uâng uơng uyêng ưng  ôông oăng ing  iêng ênh  uăng      yêng
    _F   ăc   oc   ơc   uâc  uơc  uyêc  ưc   ôôc  oăc  ic   iêc  êch  uăc       yêc
    Dịch từ mã B sang mã A hết sức hữu hiệu: chỉ cần một mảng 240 phần tử, mỗi phần tử dịch 1 mã âm vần (nếu có) của mã B thành một âm vần, vốn là một xâu 5 chữ cái trên bảng mã A. Do đó, một âm vần có độ dài 5*6 = 30 bit và chiếm thực tế 4 byte bộ nhớ. Thêm ít bộ nhớ cho mảng dịch mã phụ âm đầu nữa (mỗi phụ âm đầu cũng chiếm 4 byte), cả thảy, ta chỉ tốn khoảng 1 KiB.

    Từ 12 KiB giảm xuống còn 1 KiB là một tiến bộ đáng kể. Song, như đã nói ngay từ đầu, mã A quá dài nên không phù hợp cho việc xác định thứ tự chính tả. Quy trình dịch D -> C -> B -> A chỉ là để giải mã mà thôi.

    - - - Nội dung đã được cập nhật ngày 10-06-2019 lúc 11:11 AM - - -
    Mã B trong Bảng 3c trên được dựng từ mã C ở phiên bản mới, khác phiên bản nguyên thủy từ năm 2010 (Bảng 3, bài #4). Phiên bản mới giữ nguyên cấu trúc tổng thể, chỉ thay đổi chi tiết vị trí âm vần trong bảng:

    • Trong 192 mã số, một phần tư đầu tiên dành cho các âm vần [nửa] mở, ba phần tư còn lại dành cho các âm vần [nửa] khép.
    • Mỗi cặp âm vần nửa khép và khép tương ứng, như amap, hay enet, hay inhich, hay ưngưc, chiếm hai mã số chẵn, lẻ liên tiếp.


    Do thay đổi trên, mã D (Bảng 3b, bài #17) cũng được thay đổi một cách tương ứng.

    Để đầy đủ và tiện theo dõi, xin liệt kê cả bảng mã âm vần của mã C*, mã C (mới) và mã D (mới).

    Bảng 3a. Tập hợp 192 âm vần của mã C*
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_  
    ==========================================================================
    _0  ao    âu    ô     u     ua    uê    uy    ươu   oao   oe    i     e   
                                                        uao   ue              
                                                                              
    _1  ai    ây    ôi    ui    uôi   uêu   uyu   ươi   oai   oeo   iu    eo  
                                                        uai   ueo             
                                                                              
    _2  am    âm    ôm    um    uôm   uêm   uym   ươm   oam   oem   im    em  
                                                        uam   uem             
                                                                              
    _3  ap    âp    ôp    up    uôp   uêp   uyp   ươp   oap   oep   ip    ep  
                                                        uap   uep             
                                                                              
    _4  an    ân    ôn    un    uôn   uên   uyn   ươn   oan   oen   in    en  
                                                        uan   uen             
                                                                              
    _5  at    ât    ôt    ut    uôt   uêt   uyt   ươt   oat   oet   it    et  
                                                        uat   uet             
                                                                              
    _6  ang   âng   ông   ung   uông  uêng  uynh  ương  oang  oeng  inh   eng 
                                                        uang  ueng            
                                                                              
    _7  ac    âc    ôc    uc    uôc   uêc   uych  ươc   oac   oec   ich   ec  
                                                        uac   uec             
                                                                              
    _8  au    o     ơ     uâu   uơ    y     ưu    ư     oau   a     ia    ê   
                                                        uau                   
                                                                              
    _9  ay    oi    ơi    uây   uơi   uya   ưi    ưa    oay   oa    iêu   êu  
                                                        uay   ua    yêu       
                                                                              
    _A  ăm    om    ơm    uâm   uơm   uênh  ưm    anh   oăm   oanh  iêm   êm  
                                                        uăm   uanh  yêm       
                                                                              
    _B  ăp    op    ơp    uâp   uơp   uêch  ưp    ach   oăp   oach  iêp   êp  
                                                        uăp   uach  yêp       
                                                                              
    _C  ăn    on    ơn    uân   uơn   uyên  ưn    oong  oăn   êng   iên   ên  
                                                        uăn         yên       
                                                                              
    _D  ăt    ot    ơt    uât   uơt   uyêt  ưt    ooc   oăt   êc    iêt   êt  
                                                        uăt         yêt       
                                                                              
    _E  ăng   ong   ơng   uâng  uơng  uyêng ưng   ôông  oăng  ing   iêng  ênh 
                                                        uăng        yêng      
                                                                              
    _F  ăc    oc    ơc    uâc   uơc   uyêc  ưc    ôôc   oăc   ic    iêc   êch 
                                                        uăc         yêc

    Bảng 3 (phiên bản 2019). Tập hợp 192 âm vần của mã C.
    Code:
        _0   _1   _2   _3   _4   _5   _6    _7   _8   _9   _A   _B   _C   _D   _E   _F   
    =====================================================================================
    0_  ao   ai   au   ay   âu   ây   o     oi   ô    ôi   ơ    ơi   u    ui   uâu  uây  
                                                                                         
                                                                                         
    1_  ua   uôi  uơ   uơi  uê   uêu  y     uya  uy   uyu  ưu   ưi   ươu  ươi  ư    ưa   
                                                                                         
                                                                                         
    2_  oao  oai  oau  oay  oe   oeo  a     oa   i    iu   ia   iêu  e    eo   ê    êu   
        uao  uai  uau  uay  ue   ueo        ua                  yêu                      
                                                                                         
    3_  am   ap   ăm   ăp   âm   âp   om    op   ôm   ôp   ơm   ơp   um   up   uâm  uâp  
                                                                                         
                                                                                         
    4_  uôm  uôp  uơm  uơp  uêm  uêp  uênh  uêch uym  uyp  ưm   ưp   ươm  ươp  anh  ach  
                                                                                         
                                                                                         
    5_  oam  oap  oăm  oăp  oem  oep  oanh  oach im   ip   iêm  iêp  em   ep   êm   êp   
        uam  uap  uăm  uăp  uem  uep  uanh  uach           yêm  yêp                      
                                                                                         
    6_  an   at   ăn   ăt   ân   ât   on    ot   ôn   ôt   ơn   ơt   un   ut   uân  uât  
                                                                                         
                                                                                         
    7_  uôn  uôt  uơn  uơt  uên  uêt  uyên  uyêt uyn  uyt  ưn   ưt   ươn  ươt  oong ooc  
                                                                                         
                                                                                         
    8_  oan  oat  oăn  oăt  oen  oet  êng   êc   in   it   iên  iêt  en   et   ên   êt   
        uan  uat  uăn  uăt  uen  uet                       yên  yêt                      
                                                                                         
    9_  ang  ac   ăng  ăc   âng  âc   ong   oc   ông  ôc   ơng  ơc   ung  uc   uâng uâc  
                                                                                         
                                                                                         
    A_  uông uôc  uơng uơc  uêng uêc  uyêng uyêc uynh uych ưng  ưc   ương ươc  ôông ôôc  
                                                                                         
                                                                                         
    B_  oang oac  oăng oăc  oeng oec  ing   ic   inh  ich  iêng iêc  eng  ec   ênh  êch  
        uang uac  uăng uăc  ueng uec                       yêng yêc

    Bảng 3b (phiên bản 2019). Tập hợp 120 âm vần của mã D. Cũng như phiên bản trước đây, nếu mã số biểu thị 4 giá trị (như iêm/yêm/iêp/yêp, hay oanh/uanh/oach/uach), thì chỉ liệt kê 2 giá trị tiêu biểu (iêm/iêp, oanh/oach).
    Code:
        _0   _1   _2   _3    _4   _5   _6   _7   _8   _9   _A   _B   _C   _D   _E   _F   
    =====================================================================================
    0_  ao   ai   au   ay    âu   ây   o    oi   ô    ôi   ơ    ơi   u    ui   uâu  uây  
                                                                                         
    1_  ua   uôi  uơ   uơi   uê   uêu  y    uya  uy   uyu  ưu   ưi   ươu  ươi  ư    ưa   
                                                                                         
    2_  oao  oai  oau  oay   oe   oeo  a    oa   i    iu   ia   iêu  e    eo   ê    êu   
        uao  uai  uau  uay   ue   ueo       ua                  yêu                      
                                                                                         
    3_                                           am   ăm   âm   om   ôm   ơm   um   uâm  
                                                 ap   ăp   âp   op   ôp   ơp   up   uâp  
                                                                                         
    4_  uôm  uơm  uêm  uênh  uym  ưm   ươm  anh  oam  oăm  oem  oanh im   iêm  em   êm   
        uôp  uơp  uêp  uêch  uyp  ưp   ươp  ach  oap  oăp  oep  oach ip   iêp  ep   êp   
                                                                                         
    5_  an   ăn   ân   on    ôn   ơn   un   uân  uôn  ươn  uên  uyên uyn  ưn   ươn  oong 
        at   ăt   ât   ot    ôt   ơt   ut   uât  uôt  uơt  uêt  uyêt uyt  ưt   ươt  ooc  
                                                                                         
    6_  oan  oăn  oen  êng   in   iên  en   ên   ang  ăng  âng  ong  ông  ơng  ung  uâng 
        oat  oăt  oet  êc    it   iêt  et   êt   ac   ăc   âc   oc   ôc   ơc   uc   uâc  
                                                                                         
    7_  uông uơng uêng uyêng uynh ưng  ương ôông oang oăng oeng ing  inh  iêng eng  ênh  
        uôc  uơc  uêc  uyêc  uych ưc   ươc  ôôc  oac  oăc  oec  ic   ich  iêc  ec   êch
    Đã được chỉnh sửa lần cuối bởi Ada : 25-06-2019 lúc 09:44 AM. Lý do: Cập nhật bảng mã
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  4. #24
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    559

    Bảng mã phụ âm đầu từ năm 2010 đến nay chỉ có gi, không có gi/g. Vậy, giờ sao phải phức tạp hóa với "mã gi/g"? Có gì bất ổn nếu chỉ có một mã gi, luôn biểu thị chữ gi?

    Không có. Mà như vậy có lẽ còn tốt nữa là khác. Như ta sẽ thấy về sau, sẽ tiện lợi hơn khi mã gi/g này luôn giải thành g-i một cách nhất quán bất kể khi giải mã hay khi so sánh, bất chấp chữ cái tiếp theo là i hay không, và nếu thế, thì chính chữ i thứ hai này mới là chữ cái cần phải xóa đi trong quá trình xử lý.

    gi/g được giới thiệu vì lý do sư phạm. Để giải quyết một vấn đề, nên khởi nguồn từ bản chất. Phải đúng bản chất thì mới trực quan, dễ hiểu, dễ nhớ. Bản chất là gi/g (bởi vì trong giêng, giết chủ âm là chứ không phải là ê.) Còn việc rút gọn gi/g thành gi là chi tiết thực thi, sẽ làm sau.

    Giới thiệu lại mã gi như gi/g cũng nhằm giới thiệu một hiện tượng tinh tế hơn nhưng cùng bản chất ở một mã phụ âm đầu khác. Đó là y.

    y không những dùng để mã hóa các chữ hiếm như yang, yeo, yoc, yung,... Nó còn dùng để mã hóa những chữ rất thông thường như yêu, yêm, yên. Bởi vì như mã gi, nó có thể hiểu theo 2 nghĩa. Hiểu như y. Hoặc hiểu như âm trống. Hiểu như y khi đi sau nó là ang, eo, oc, ung hay bất cứ âm vần nào trừ yêu, yêm,... gọi chung là x/x, khi nó được hiểu như âm trống. Và do thế, cũng như mã gi gọi tên đúng là mã gi/g, mã y nếu gọi tên đúng phải là y/--.

    Vậy, trong cách mã hóa này, mã x/x không bao giờ theo sau âm trống, mà luôn theo sau một mã phụ âm đầu thực sự nào đó, có thể là gi/g hoặc cùng lắm là y/--. Nói trắng ra, cũng như chữ giết được mã hóa là gi-iết, chữ yêu phải được mã hóa là y-yêu ngay từ ban đầu. Và cũng như gi-iết biến thành g-iết hay gi-ết trước khi trở về chữ giết, mã y-yêu biến thành --yêu hay y-êu trước khi trở về chữ yêu trong quá trình giải mã hay xác định thứ tự chính tả.

    Tóm lại, câu thứ ba trong thuật toán dịch sang mã B trên, viết lại cho đúng, là

    • Mã phụ âm đầu y/-- nói chung được hiểu là y; chỉ hiểu là -- nếu mã âm vần có dạng x/yêx.
    • Mã âm vần dạng x/x nói chung được hiểu là x; chỉ hiểu là x nếu mã phụ âm đầu là y/--.


    Mã hóa như thế có nhất thiết bắt buộc?

    Không cần. Nhưng nếu không làm thế, hiệu quả thấp. Khi có dịp mình sẽ quay trở lại vấn đề này.

    - - - Nội dung đã được cập nhật ngày 11-06-2019 lúc 07:29 PM - - -

    Mã B là một mã hữu hiệu và hoàn toàn hữu dụng, ít ra cho việc giải mã (để hiển thị). Nhưng giới thiệu nó để mô tả đúng bản chất sự vật, để vào đề. Và khi nói thế, mình đã ngụ ý rằng cho việc khác, như xác định thứ tự chính tả mà không giải mã, ta phải đi xa hơn. Ta sẽ dùng đến mã khác, dù không đúng bản chất, nhưng hữu hiệu hơn và hữu dụng hơn.

    Đó là mã B+.

    Mã B+ là một dị bản của mã B, với mã gi/g biểu thị nhất quán chữ gi và mã y/-- biểu thị nhất quán chữ y. Vì thế, có thể gọi tên chúng đơn giản là mã gi, mã y.

    Dị biệt cơ bản trên sinh ra hai dị biệt nữa khi dịch mã C (và C*) sang mã B+
    • Khi theo sau mã phụ âm đầu y, mọi mã âm vần có dạng x/x được hiểu là êx.
    • Khi theo sau mã phụ âm đầu gi, mọi mã âm vần có dạng ix, kể cả i, và x/x, lần lượt được hiểu là x, êx. Nói riêng, i được hiểu là --.

    Nói một cách nôm na, chữ y thứ hai, chữ i thứ hai là chữ cái thừa và, do đó, đã bị xóa.

    Sau đây là vài ví dụ về dịch sang mã B+.

    -- Mã y-yêu hiểu là y-êu.

    -- Mã gi-iêm hiểu là gi-êm.

    -- Mã gi-in hiểu là gi-n.

    -- Mã gi-i hiểu là gi--.

    Hai dị biệt về dịch thuật nói trên cảm sinh ra 2 dị biệt nữa trong bản thân mã. Khác với mã B, mã B+

    • không còn 7 mã có dạng x, và
    • có thêm 9 mã âm vần, dành cho 8 phụ âm cuối và âm trống.

    Bảng 3d. Bảng mã âm vần của mã B+. Như B, trong B+ một âm vần có thể có vài mã số khác nhau. Ví dụ, B+(êc) = {0x9D, 0xEF}, trong đó 0xEF dùng trong ngữ cảnh y-êc còn 0x9D dùng (chẳng hạn) trong ch-êc. Muốn cho phép các từ mã q-a, gi-iu, gi-ia giải mã lần lượt thành qa, giu, gia, phải gán giá trị a, u, a cho các mã số 0xD8, 0xE1, 0xE8.
    Code:
         0_   1_   2_   3_   4_   5_    6_   7_   8_   9_   A_   B_   C_   D_   E_  
    ================================================================================
    _0   ao   âu   ô    u    ua   uê    uy   ươu  oao  oe   i    e    uao  ue   --  
    _1   ai   ây   ôi   ui   uôi  uêu   uyu  ươi  oai  oeo  iu   eo   uai  ueo      
    _2   am   âm   ôm   um   uôm  uêm   uym  ươm  oam  oem  im   em   uam  uem  m   
    _3   ap   âp   ôp   up   uôp  uêp   uyp  ươp  oap  oep  ip   ep   uap  uep  p   
    _4   an   ân   ôn   un   uôn  uên   uyn  ươn  oan  oen  in   en   uan  uen  n   
    _5   at   ât   ôt   ut   uôt  uêt   uyt  ươt  oat  oet  it   et   uat  uet  t   
    _6   ang  âng  ông  ung  uông uêng  uynh ương oang oeng inh  eng  uang ueng nh  
    _7   ac   âc   ôc   uc   uôc  uêc   uych ươc  oac  oec  ich  ec   uac  uec  ch  
    _8   au   o    ơ    uâu  uơ   y     ưu   ư    oau  a    ia   ê    uao           
    _9   ay   oi   ơi   uây  uơi  uya   ưi   ưa   oay  oa   iêu  êu   uay  ua   êu  
    _A   ăm   om   ơm   uâm  uơm  uênh  ưm   anh  oăm  oanh iêm  êm   uăm  uanh êm  
    _B   ăp   op   ơp   uâp  uơp  uêch  ưp   ach  oăp  oach iêp  êp   uăp  uach êp  
    _C   ăn   on   ơn   uân  uơn  uyên  ưn   oong oăn  êng  iên  ên   uăn       ên  
    _D   ăt   ot   ơt   uât  uơt  uyêt  ưt   ooc  oăt  êc   iêt  êt   uăt       êt  
    _E   ăng  ong  ơng  uâng uơng uyêng ưng  ôông oăng ing  iêng ênh  uăng ng   êng 
    _F   ăc   oc   ơc   uâc  uơc  uyêc  ưc   ôôc  oăc  ic   iêc  êch  uăc  c    êc
    Giống như mã B, mã B+ hữu dụng trong việc giải mã để hiển thị. Nhưng hơn thế nữa, như đã giới thiệu, ta sẽ dùng nó để xác định thứ tự chính tả.

    - - - Nội dung đã được cập nhật ngày 11-06-2019 lúc 10:28 PM - - -

    Ta đã biết rằng thứ tự chính tả (hay nói đúng hơn, mã tự điển) của một chữ có thể xác định bằng cách phân tách nó ra từng chữ cái. Đó là giải mã toàn phần, hay nói cách khác là "mã hóa" nó bằng mã A.

    Và với mã D', C', các đại biểu của kỹ thuật so sánh mà hoàn toàn không giải mã, ta cũng đã biết rằng có thể xác định mà chẳng cần phải phân tách gì cả (hoặc chỉ tách mã thanh, trong trường hợp của mã C'). Hai mã chữ hoàn toàn có thể so sánh được với nhau như là hai chữ, theo đúng thứ tự chính tả, kể cả khi hai chữ dài ngắn khác nhau, miễn là theo sau chúng không có thêm chữ cái nào.

    Kết hợp hai kỹ thuật trên, ngay lập tức ta có cách so sánh không giải mã, nói thật hơn, chỉ giải mã một phần: mã hóa một chữ bằng một xâu ký tự, với mỗi ký tự biểu diễn một chữ cái, riêng ký tự cuối có thể biểu diễn một xâu [nhiều] chữ cái. Nhờ thế, có thể giảm số ký tự trong mã chữ và, hy vọng, cả độ dài (tính bằng bit) của mã chữ.

    Ví dụ, bảng mã A có 34 ký tự, trong đó 33 ký tự thể hiện chữ cái Việt và 1 ký tự thể hiện dấu trắng. Thêm 3 ký tự lần lượt thể hiện chữ ch, nh, ng nữa, mà hiển nhiên chỉ chuyên dùng để mã hóa phụ âm cuối, ta được mã A1 với 37 ký tự. Giống mã A, độ dài ký tự vẫn chỉ là 6 bit. Nhưng khác mã A, độ dài mã âm vần đã giảm từ 5 còn 4 ký tự, mã chữ giảm từ 7 còn 6 ký tự.

    Phụ âm đầu có tối đa 3 ký tự, nhưng ta sẽ giảm 1 ký tự bằng cách loại bỏ chữ ngh: thay thế mọi ngh bằng ng, ta được một "tiếng Việt mới" đẳng cấu (tương đương) với tiếng Việt về mọi mặt, kể cả thứ tự chính tả. Thật vậy: (1) Với một âm vần v bất kỳ, nghv và ngv không đồng thời tồn tại trong tiếng Việt, nên phép thay thế này biến chữ Việt nghv thành một chữ mới toanh, không "đụng hàng" với bất cứ chữ Việt nào sẵn có, nói cách khác, phép thay thế là song ánh từ tiếng Việt đến "tiếng Việt mới"; (2) Nếu cả hai chữ Việt cần so sánh đều không thay đổi qua phép thay thế này, dĩ nhiên tương quan của chúng không đổi; (3) Nếu chỉ một chữ Việt x chịu tác động của sự thay thế còn chữ Việt thứ hai w thì không, nói cách khác x nằm trong khoảng từ nghe đến nghiu, tương quan giữa hai chữ cũng không đổi bởi vì thay thế ngh bằng ng chỉ nới rộng khoảng "tung hoành" cho x từ nge đến ngiu, trong khi chữ w vẫn "ung dung" yên vị ở ngoài khoảng này; và cuối cùng (4) Nếu cả hai chữ Việt cần so sánh đều bị thay đổi do sự thay thế, tương quan của chúng vẫn không đổi bởi vì với hai xâu (do đó, nói riêng, hai âm vần) u, v bất kỳ và với hai xâu p, q bất kỳ (do đó, nói riêng, hai phụ âm đầu ng, ngh) pu < pv khi và chỉ khi qu < qv.

    Dùng đến cả "quái chiêu" này, mã A1 vẫn còn đến 5 ký tự, với độ dài 5*6 + 3 = 33 bit. Nghĩa là vẫn còn quá dài cho một mã tự điển M hữu dụng.

    - - - Nội dung đã được cập nhật ngày 11-06-2019 lúc 11:38 PM - - -

    Nhưng kỹ thuật trên hoàn toàn có thể cải tiến thêm. Với bảng ký tự sau đây, có thể lập được một mã mới trên cùng nguyên lý với A1, gọi là A2.

    Dễ thấy, bởi thế xin nói luôn, rằng bảng này có 2^2*3^3 = 108 ký tự và vì thế, một ký tự có thể mã hóa bằng 7 bit; mọi âm vần (Bảng 3c) đều có thể viết bằng 2 ký tự và mọi phụ âm đầu ngoại trừ ngh (vốn đã bị loại) cũng thế; vậy, một mã chữ trong mã A2 này chỉ còn có 4 ký tự, với độ dài 4*7 + 3 = 31 bit; hiển nhiên, mã B có thể dịch sang mã A2 bằng tự điển gồm bảng (mảng) phụ âm đầu và bảng (mảng) âm vần, với kích cỡ rất nhỏ là 34*2 + 240*2 = 548 byte; tóm lại, mã A2 đạt mọi tiêu chuẩn hữu dụng và hữu hiệu cần cho mã tự điển M.

    Bảng 6. Tập hợp 108 ký tự của mã A2.
    Code:
    --   au   âp   en   êp   m    ông  p    ych  
    a    ay   ât   eng  êt   n    ôp   q    yêc  
    ac   ăc   âu   eo   êu   ng   ôt   r    yên  
    ach  ăm   ây   ep   f    nh   ơ    s    yêng 
    ai   ăn   b    et   g    o    ơc   t    yêt  
    am   ăng  c    ê    h    oc   ơi   u    ym   
    an   ăp   ch   êc   i    ong  ơm   ư    yn   
    ang  ăt   d    êch  ia   ô    ơn   v    ynh  
    anh  âc   đ    êm   iu   ôc   ơng  w    yp   
    ao   âm   e    ên   j    ôi   ơp   x    yt   
    ap   ân   ec   êng  k    ôm   ơt   y    yu   
    at   âng  em   ênh  l    ôn   ơu   ya   z
    Điều khó thấy là lập tự điển như thế nào. Một âm vần có thể viết thành xâu tối đa 2 ký tự chọn từ bảng này (trong đó, chỉ ký tự cuối có thể hàm ý nhiều chữ cái) theo một hay nhiều cách viết khác nhau. Chẳng hạn, oong chỉ có đúng 1 cách viết là o-onguyêng chỉ có đúng 1 cách viết là u-yêng, nhưng ong có thể viết bằng o-ng hoặc ongyêng có thể viết bằng y-êng hoặc yêng. Cách nào là đúng?

    Giải đáp câu hỏi này không khó. Nhưng nếu có cách nào làm mà không cần hỏi/đáp gì cả thì vẫn hay hơn.

    - - - Nội dung đã được cập nhật ngày 12-06-2019 lúc 05:05 PM - - -

    Và đây, cách "làm mà không cần hỏi/đáp gì". Chỉ giải mã phụ âm đầu, giữ nguyên mã âm vần. Mã này, tất nhiên, được gọi là mã A3. Và mã tự điển thu được bằng cách hoán vị bảng ký tự của A3 để lấy luôn số thứ tự chính tả làm mã số, như thường lệ, được gọi là A3'.

    Nói rõ hơn, bảng mã A3 là bảng mã âm vần của mã B+, vốn đã chứa sẵn 5 chữ cái có mặt trong các phụ âm cuối, bổ sung 16 chữ cái vốn chỉ có mặt trong các phụ âm đầu. Chú ý rằng 16 chữ cái thêm này thật ra không cần mã ký tự: chúng không được dùng ở bất cứ đâu khi giải mã lẫn khi xác định thứ tự chính tả, bởi vì giải mã thật ra là dịch ra mã A, còn xác định thứ tự chính tả là dịch thẳng ra mã A3', hơn là A3. Gán mã ký tự cho chúng chẳng qua để liệt kê chúng ra (xem Bảng 3e). Và liệt kê chẳng qua để cho đẹp "đội hình", để chứng tỏ rằng mã A3 có không quá 256 ký tự và mã A3', do đó, cũng thế. Thực ra, chúng chỉ có 3^5 = 243 ký tự phân biệt mà thôi (xem Bảng 7). Vậy, A3 và A3' là các mã ký tự 8 bit.

    Một chữ Việt được mã hóa bằng 3 ký tự (gồm 2 ký tự phụ âm đầu và 1 ký tự cho âm vần). Độ dài mã là 3*8 + 3 = 27 bit.

    Mảng phụ âm đầu và mảng âm vần dùng hết 33*2 + 240*1 = 306 byte.

    Bảng 3e. Bảng mã A3.

    Code:
         0_   1_   2_   3_   4_   5_    6_   7_   8_   9_   A_   B_   C_   D_   E_   F_
    ===================================================================================
    _0   ao   âu   ô    u    ua   uê    uy   ươu  oao  oe   i    e    uao  ue   --   b 
    _1   ai   ây   ôi   ui   uôi  uêu   uyu  ươi  oai  oeo  iu   eo   uai  ueo       d 
    _2   am   âm   ôm   um   uôm  uêm   uym  ươm  oam  oem  im   em   uam  uem  m    đ 
    _3   ap   âp   ôp   up   uôp  uêp   uyp  ươp  oap  oep  ip   ep   uap  uep  p    f 
    _4   an   ân   ôn   un   uôn  uên   uyn  ươn  oan  oen  in   en   uan  uen  n    g 
    _5   at   ât   ôt   ut   uôt  uêt   uyt  ươt  oat  oet  it   et   uat  uet  t    h 
    _6   ang  âng  ông  ung  uông uêng  uynh ương oang oeng inh  eng  uang ueng nh   j 
    _7   ac   âc   ôc   uc   uôc  uêc   uych ươc  oac  oec  ich  ec   uac  uec  ch   k 
    _8   au   o    ơ    uâu  uơ   y     ưu   ư    oau  a    ia   ê    uao            l 
    _9   ay   oi   ơi   uây  uơi  uya   ưi   ưa   oay  oa   iêu  êu   uay  ua   êu   q 
    _A   ăm   om   ơm   uâm  uơm  uênh  ưm   anh  oăm  oanh iêm  êm   uăm  uanh êm   r 
    _B   ăp   op   ơp   uâp  uơp  uêch  ưp   ach  oăp  oach iêp  êp   uăp  uach êp   s 
    _C   ăn   on   ơn   uân  uơn  uyên  ưn   oong oăn  êng  iên  ên   uăn       ên   v 
    _D   ăt   ot   ơt   uât  uơt  uyêt  ưt   ooc  oăt  êc   iêt  êt   uăt       êt   w 
    _E   ăng  ong  ơng  uâng uơng uyêng ưng  ôông oăng ing  iêng ênh  uăng ng   êng  x 
    _F   ăc   oc   ơc   uâc  uơc  uyêc  ưc   ôôc  oăc  ic   iêc  êch  uăc  c    êc   z

    Bảng 7. Tập hợp 243 ký tự của mã A3, A3'.
    Code:
    --   ây   i    oac  oi   q    uâng ung   uynh
    a    b    ia   oach om   r    uâp  uôc   uyp 
    ac   c    ic   oai  on   s    uât  uôi   uyt 
    ach  ch   ich  oam  ong  t    uâu  uôm   uyu 
    ai   d    iêc  oan  ooc  u    uây  uôn   ư   
    am   đ    iêm  oang oong ua   uc   uông  ưa  
    an   e    iên  oanh op   uac  ue   uôp   ưc  
    ang  ec   iêng oao  ot   uach uec  uôt   ưi  
    anh  em   iêp  oap  ô    uai  uem  uơ    ưm  
    ao   en   iêt  oat  ôc   uam  uen  uơc   ưn  
    ap   eng  iêu  oau  ôi   uan  ueng uơi   ưng 
    at   eo   im   oay  ôm   uang ueo  uơm   ươc 
    au   ep   in   oăc  ôn   uanh uep  uơn   ươi 
    ay   et   ing  oăm  ông  uao  uet  uơng  ươm 
    ăc   ê    inh  oăn  ôôc  uap  uê   uơp   ươn 
    ăm   êc   ip   oăng ôông uat  uêc  uơt   ương
    ăn   êch  it   oăp  ôp   uau  uêch up    ươp 
    ăng  êm   iu   oăt  ôt   uay  uêm  ut    ươt 
    ăp   ên   j    oc   ơ    uăc  uên  uy    ươu 
    ăt   êng  k    oe   ơc   uăm  uêng uya   ưp  
    âc   ênh  l    oec  ơi   uăn  uênh uych  ưt   
    âm   êp   m    oem  ơm   uăng uêp  uyêc  ưu   
    ân   êt   n    oen  ơn   uăp  uêt  uyên  v    
    âng  êu   ng   oeng ơng  uăt  uêu  uyêng w    
    âp   f    nh   oeo  ơp   uâc  ui   uyêt  x    
    ât   g    o    oep  ơt   uâm  um   uym   y    
    âu   h    oa   oet  p    uân  un   uyn   z
    Tóm lại, như A2, mã A3' đạt mọi tiêu chuẩn cần thiết cho một mã tự điển M hữu dụng và hữu hiệu. Khác A2, tự điển dịch sang mã A3' chính là bảng âm vần (của mã B+) có sẵn rồi. Ta cứ dùng nó thôi, chẳng cần phải băn khoăn gì nữa.

    - - - Nội dung đã được cập nhật ngày 13-06-2019 lúc 12:25 AM - - -

    Có điều, ít ra cũng nên thắc mắc một chút. Vì sao để lập mã tự điển A3', mã B vô dụng còn mã B+ thì hữu dụng?

    Để trả lời câu hỏi thứ nhất, chỉ cần nêu một ví dụ. So sánh giếng với giường. Hình 8 chỉ rõ layout (định dạng) của hai chữ này trong mã A3 (và A3') giả định dựa trên mã B và, nhân tiện, chỉ rõ luôn layout trong mã A3, A3' "thật", vốn được định nghĩa trên mã B+.

    Trong mã A3, A3' giả định, hai mã chữ là g-i-ươngg-iêng, và do i < iêng, ta sẽ thu được kết quả giường < giếng (sai).

    Còn trong mã A3, A3' "thật" hai mã chữ là g-i-ươngg-i-êng, và do trong A3' êng < ương, mã A3' "thật" cho kết quả giếng < giường (đúng) trong ví dụ đơn lẻ này.

    Hình 8. Định dạng của hai chữ Việt trong mã A3 (và A3') vốn dựa trên mã B+ và biến thể giả định của nó dựa trên mã B. a) Chữ giường trong cả hai mã được mã hóa như nhau. b) Chữ giếng trong biến thể. c) Chữ giếng trong mã A3 (và A3').

    Code:
    a) "giường" trong A3[B/B+]
    +-----+-----+-----+-----+
    |g    |i    |ương |huyền|
    +-----+-----+-----+-----+
    
    b) "giếng" trong A3[B]
    +-----+-----+-----+-----+
    |g    |iêng |-    |sắc  |
    +-----+-----+-----+-----+
    
    c) "giếng" trong A3[B+]
    +-----+-----+-----+-----+
    |g    |i    |êng  |sắc  |
    +-----+-----+-----+-----+
    Vậy, nếu dựa trên mã B, mã A3 có thể đặt 2 mã chữ vào tư thế so sánh khập khiễng. Hậu quả, mã A3' tương ứng không đảm bảo rằng A3'(x) < A3'(y) khi và chỉ khi x < y cho 2 chữ Việt x, y bất kỳ. Nói cách khác, nó không phải là một mã tự điển.
    Đã được chỉnh sửa lần cuối bởi Ada : 25-06-2019 lúc 09:48 AM. Lý do: Cập nhật bảng mã B+, A3
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  5. #25
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    559

    Để trả lời câu hỏi thứ hai, trước hết ta xác định trong điều kiện nào, kỹ thuật giải mã tiền tố (vốn tạo ra các mã kiểu như A3' từ các mã kiểu như B+) có thể cho một mã tự điển.

    Mã A không kể dấu thanh là một mã chữ cái (1), nghĩa là mỗi ký tự của từ mã biểu thị một chữ cái của ngôn ngữ nguồn (vốn là tập hợp các chữ Việt không dấu thanh, trong ngữ cảnh loạt bài này). Các mã A1, A2, A3, A3' cũng tương tự, chỉ khác là ký tự cuối biểu thị một xâu [gồm 0, 1 hoặc nhiều] chữ cái của ngôn ngữ nguồn. Các mã như thế là mã nén hậu tố. (Gọi thế gọn hơn, nhưng trong loạt bài này, mã giải nén tiền tố có lẽ dễ hiểu hơn.)

    Nhưng "ký tự cuối" là gì? Trong mã A, A1, A2, A3, A3' mọi từ mã đều dài như nhau, đúng n ký tự (không kể mã thanh). Ở mã A, chẳng hạn, n = 7. "Ký tự cuối" phải chăng là ký tự thứ 7?

    Có 3 loại ký tự: dấu trắng, đơn tự (biểu thị một chữ cái) và hợp tự (biểu thị một chữ ghép từ nhiều chữ cái). Dấu trắng là ký tự vô nghĩa. Nó được viết thêm vào cuối, lặp đi lặp lại, để từ mã đủ n ký tự mà thôi. Nó chỉ là một chi tiết thực thi. Có thể làm như thế bởi vì về mặt tự điển, chữ được hiểu như xâu chữ cái (có nghĩa) với độ dài không quá n nhưng cũng có thể hiểu là xâu có độ dài đúng n, cho phép vài dấu trắng (vô nghĩa) ở cuối, miễn là để so sánh, dấu trắng đứng đầu bảng chữ cái.

    Do vậy, ở đây, ta sẽ xem xét mã nén hậu tố trong bản chất của nó, là xâu ký tự có nghĩa với độ dài không quá n, và chỉ có 2 loại ký tự là đơn tự và hợp tự. Trong cách nhìn đó, "ký tự cuối" là ký tự có nghĩa cuối, không nhất thiết ký tự thứ n.

    Trong một mã nén hậu tố, ký tự cuối có thể là hợp tự, ký tự ở các vị trí còn lại đều là đơn tự.

    Dễ thấy rằng, muốn một mã nén hậu tố là một mã tự điển, trước hết bảng ký tự (2) của nó phải là một mã tự điển. Nhưng đó mới chỉ là điều kiện cần. [Phản] ví dụ ở bài trên là minh chứng.

    Hãy xem hai chữ Việt saotbu mã hóa trong một mã nén hậu tố M nào đó, với ab hai chữ cái, s, t, o, u là các xâu chữ cái, trong đó st có cùng độ dài và đã được mã hoá tách biệt khỏi ao, bu bằng hai xâu [đơn tự, cùng độ dài].

    Do hai tiền tố s, t cùng độ dài (có thể cùng là xâu trống), hai chữ cái a, b ở cùng vị trí (có thể cùng dẫn đầu chữ) để xem xét so sánh với nhau.

    Khi st, không có vấn đề so sánh a với b.

    Khi s = t (kể cả khi cả hai cùng trống), có 5 trường hợp.

    • a, b được mã hóa bằng đơn tự.
    • ao, bu được mã hóa bằng hợp tự.
    • ao được mã hóa bằng hợp tự, b được mã hóa bằng đơn tự, u trống.
    • ao được mã hóa bằng hợp tự, b được mã hóa bằng đơn tự (tách biệt với u), u không trống, ab.
    • ao được mã hóa bằng hợp tự, b được mã hóa bằng đơn tự (tách biệt với u), u không trống, a = b.


    Nếu bảng ký tự của M là một mã tự điển, dễ thấy rằng 4 trường hợp đầu được giải quyết.

    Chỉ còn trường hợp cuối, thực chất là so sánh tao với tau. Nếu bảng ký tự của M là một mã tự điển thì do a < ao, M(a) < M(ao), nên M(tau) < M(tao), tau < tao, vốn chỉ đúng nếu u < o, sai nếu o < u. Chả cần phải nói rằng kết quả sai trong trường hợp này đã được minh hoạ qua ví dụ bằng số, ở bài trên.

    Nhìn lại, trường hợp "may rủi" này xảy ra là do đối với hai chữ có dạng tao, tau, hai hậu tố ao, au, vốn có chung chữ cái đầu, đã được mã hóa bằng hai cách khác nhau, nghĩa là mã hóa một cách bất nhất.

    Vậy, có thể dựng mã tự điển bằng cách khử tính bất nhất ấy.

    ____________________
    NOTES

    (1) Thuật ngữ tiêu chuẩn là mã ký tự (character code). Trong bài này, chỉ ký tự của ngôn ngữ mã mới được gọi là "ký tự", còn ký tự của ngôn ngữ nguồn được gọi là "chữ cái". Nhất quán với đó, "mã ký tự" phải gọi trệch thành "mã chữ cái".

    (2) Thuật ngữ tiêu chuẩn là bảng chữ cái (alphabet). Gọi trệch thành "bảng ký tự" để nhất quán với quy ước trên.

    - - - Nội dung đã được cập nhật ngày 15-06-2019 lúc 10:09 AM - - -

    Với phân tích trên, cách dựng, hiển nhiên, như sau. Phân hoạch tập chữ thành các lớp, mỗi lớp gồm mọi chữ trùng nhau ở chữ cái đầu. Ở từng lớp, chọn một trong 2 cách mã hoá chữ: cả chữ thành một ký tự hoặc riêng chữ cái đầu thành một ký tự (và đoạn hậu tố còn lại, đến lượt mình, lại được xem như là "chữ" để xét tiếp). Cách mã hoá, một khi đã chọn, được áp dụng nhất quán lên mọi chữ trong lớp. Một cách hình thức, có thể định nghĩa:

    • Một mã nén hậu tố được gọi là một mã chính quy nếu từng lớp chữ chung nhau chữ cái đầu đều được mã hóa nhất quán.
    • Theo sau một tiền tố t nhất định đã được mã hóa tách biệt [bằng một xâu đơn tự], một lớp các hậu tố chung chữ cái đầu a được mã hóa nhất quán nếu (a) mỗi phần tử đều được mã hóa bằng một ký tự, hoặc (b) chữ cái đầu a ở mọi phần tử được mã hóa tách biệt [bằng một đơn tự] và theo sau tiền tố ta, từng lớp các hậu tố có chung chữ cái đầu đều được mã hóa nhất quán.


    Trong đó, một chữ cũng được xem là một hậu tố (theo sau tiền tố trống). Chú ý rằng phần (b) là một định nghĩa quy nạp: tính nhất quán của một lớp hậu tố cấp k (k là độ dài tiền tố) được định nghĩa bởi tính nhất quán của các lớp hậu tố cấp k+1. Định nghĩa này đúng đắn bởi vì độ dài chữ là hữu hạn, các lớp hậu tố ở cấp càng cao thì càng ngắn, phép quy nạp này chỉ là quy nạp toán học thông thường. Chú ý rằng lớp hậu tố là phân biệt theo từng tiền tố. Hai lớp hậu tố dẫu bằng nhau nhưng theo sau hai tiền tố khác nhau vẫn là hai lớp "khác nhau" và như thế, có thể mã hoá nhất quán theo hai cách khác nhau. Lớp hậu tố no = {n, ng, nh} trong tiếng Việt, chẳng hạn, có thể được mã hóa nhất quán bằng n, n-g, n-h sau tiền tố ta, to, nhưng cũng nhất quán bằng n, ng, nh sau tiền tố tha, tro và, nếu thế, lớp mọi chữ tx chung chữ cái đầu t rất có thể cũng được mã hoá nhất quán.

    Có thể xem các mã chữ cái là trường hợp riêng, tầm thường, của mã nén hậu tố. (Tầm thường vì chúng không "nén" gì cả, hay nói theo ngữ cảnh của bài này, chúng giải nén toàn phần.) Theo nghĩa này, mọi mã chữ cái đều chính quy. Mã A, chẳng hạn, là một mã chính quy.

    Với cách dựng đó, có thể khẳng định.

    • Một mã chính quy là một mã tự điển nếu và chỉ nếu bảng ký tự của nó là một mã tự điển.


    Bây giờ, ta kiểm tra mã A3, vốn hiển nhiên là một mã nén hậu tố, xem nó có chính quy hay không. Hễ nó chính quy thì mã A3', vốn chính là A3 chỉ sai khác hoán vị bảng ký tự, đương nhiên cũng sẽ chính quy và hơn thế nữa, do bảng ký tự đã được sắp xếp theo thứ tự chính tả, sẽ là mã tự điển.

    Kiểm tra mã A3 dễ hơn mã A2. Các âm vần đều bắt đầu bằng một chữ cái nguyên âm. Ngược lại, hầu hết các phụ âm đầu đều chỉ gồm toàn chữ cái phụ âm. Nhờ thế, cho mỗi lớp các hậu tố chung chữ cái đầu, cách mã hoá về cơ bản đã được chọn một cách tự nhiên: nếu lớp ấy là một "lớp phụ âm", biết là đang "bóc, tách" nó ở phụ âm đầu, thì chọn cách (b) (đơn tự) và tiếp tục "bóc, tách" các hậu tố; còn nếu lớp ấy là một "lớp nguyên âm", biết là đã "chạm" đến âm vần, thì thôi "bóc, tách" mà "nhai, nuốt" nó luôn bằng cách (a) (hợp tự).

    Chỉ có 2 ngoại lệ. Hai chữ cái nguyên âm nhưng có thể tham gia phụ âm đầu. Chữ i và chữ y.

    Chữ cái y, khi dẫn đầu chữ, có thể là một chữ (trong y tế, sức ỳ, ỷ lại, ý đồ), có thể làm tiền tố cho 7 âm vần dạng u, chưa kể có thể đi trước nhiều âm vần khác nhau (trong các chữ hiếm yang, ye, yum, thậm chí yip). Vì thế, ở vị trí này y luôn được mã hóa bằng đơn tự và mọi lớp hậu tố có thể theo sau đều được mã hóa nhất quán. Nói riêng, trong 7 chữ thông dụng u, lớp hậu tố êu được mã hoá nhất quán bằng 1 ký tự. Vậy, lớp chữ [trọn vẹn] yo được mã hóa nhất quán.

    Chữ cái i phức tạp hơn. Nó có thể là một chữ (i tờ, ì ạch, âm ỉ, ầm ĩ, í ới, ậm ị). Nó có thể đi trước nhiều âm vần. Nó dẫn đầu 7 chữ ghép có dạng u và 10 chữ ghép có dạng iu. Nó lại có thể theo sau nhiều tiền tố khác nhau. Khi ở đầu chữ hoặc ở sau tiền tố thực sự bất kỳ khác g, nó đều được mã hóa trong một ký tự, thường là hợp tự. Ở sau tiền tố g nó được mã hóa bằng đơn tự, theo sau là mã của u, êu. (Ví dụ, trong im, nó được mã hóa trong hợp tự im, trong rin, riêng nó được mã hóa trong hợp tự in, iêng, còn trong gin, giêng, nó được mã hóa bằng đơn tự i.) Trong đó, cũng như sau tiền tố y, sau tiền tố gi lớp êu được mã hoá nhất quán bằng hợp tự. Khác với tiền tố y, sau tiền tố gi còn có 5 lớp hậu tố nữa dạng bx với b là một chữ cái phụ âm, là cx, mx, nx, px, tx.

    Ba lớp, mx, px, tx, mỗi lớp chỉ có một phần tử, hiển nhiên được mã hoá nhất quán. Lớp cx có 2 phần tử, cch, trong đó chỉ có 1 chữ ghép, ch, nên cũng hiển nhiên được mã hoá nhất quán. Lớp nx có 3 phần tử, n, ngnh, được mã hóa nhất quán do cả ng lẫn nh đều được mã hóa theo cùng một cách (hợp tự). Rút cục, sau tiền tố g, lớp hậu tố io được mã hoá nhất quán.

    Vậy, A3 là mã chính quy. Điều phải chứng minh.
    Đã được chỉnh sửa lần cuối bởi Ada : Hôm nay lúc 07:36 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  6. #26
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    559

    Mặc định một phương pháp mã hóa tiếng Việt

    Nhiều bộ xử lý có thể làm đồng thời vài phép tính, thậm chí mấy phép tính cùng một lúc. Bộ biên dịch tối ưu hóa có thể khai thác khả năng ấy của bộ xử lý. Nhưng bộ biên dịch không phải là thánh. Để việc tối ưu hóa cho code thật tối ưu, cần hỗ trợ từ coder.

    Cho bộ xử lý như thế, quy trình dịch mẫu mực

    Code:
    D -> C -> C* -> B+
    có thể tối ưu hóa thành

    Code:
    D -> C2 -> C2* -> B2+ -> B+
    C2 là một mã có 96 âm vần với cấu trúc giống mã C: đúng một phần tư đầu tiên là các âm vần [nửa] mở lưỡng tính và ba phần tư còn lại là âm vần [nửa] khép lưỡng tính. (Chi tiết, xem Bảng 3f.) Có thể xem nó như một bản thu nhỏ của mã C. Cái tên "C2" thật ra ngụ ý "C/2". Mã C2*, B2+, tương tự, lần lượt, là bản thu nhỏ của C*, B+ và có thể gọi tên một cách gợi nhớ hơn là "C*/2", "B+/2".

    Bảng 3f. Tập hợp 96 âm vần lưỡng tính của mã C2. Như mã D, nếu 1 mã số biểu thị 4 giá trị (như iêm/yêm/iêp/yêp, hay oanh/uanh/oach/uach), thì chỉ liệt kê 2 giá trị tiêu biểu (iêm/iêp, oanh/oach).
    Code:
        _0   _1   _2   _3    _4   _5   _6   _7   _8   _9   _A   _B   _C   _D   _E   _F   
    =====================================================================================
    0_  ao   au   âu   o     ô    ơ    u    uâu  ua   uơ   uê   y    uy   ưu   ươu  ư    
        ai   ay   ây   oi    ôi   ơi   ui   uây  uôi  uơi  uêu  uya  uyu  ưi   ươi  ưa   
                                                                                         
    1_  oao  oau  oe   a     i    ia   e    ê    am   ăm   âm   om   ôm   ơm   um   uâm  
        oai  oay  oeo  oa    iu   iêu  eo   êu   ap   ăp   âp   op   ôp   ơp   up   uâp  
                                                                                         
    2_  uôm  uơm  uêm  uênh  uym  ưm   ươm  anh  oam  oăm  oem  oanh im   iêm  em   êm   
        uôp  uơp  uêp  uêch  uyp  ưp   ươp  ach  oap  oăp  oep  oach ip   iêp  ep   êp   
                                                                                         
    3_  an   ăn   ân   on    ôn   ơn   un   uân  uôn  ươn  uên  uyên uyn  ưn   ươn  oong 
        at   ăt   ât   ot    ôt   ơt   ut   uât  uôt  uơt  uêt  uyêt uyt  ưt   ươt  ooc  
                                                                                         
    4_  oan  oăn  oen  êng   in   iên  en   ên   ang  ăng  âng  ong  ông  ơng  ung  uâng 
        oat  oăt  oet  êc    it   iêt  et   êt   ac   ăc   âc   oc   ôc   ơc   uc   uâc  
                                                                                         
    5_  uông uơng uêng uyêng uynh ưng  ương ôông oang oăng oeng ing  inh  iêng eng  ênh  
        uôc  uơc  uêc  uyêc  uych ưc   ươc  ôôc  oac  oăc  oec  ic   ich  iêc  ec   êch

    Bit cuối (bit thấp nhất) của mã âm vần trong mã C không thay đổi qua chuỗi biến đổi mẫu mực C -> C* -> B+. Tách bỏ nó đi, thì được mã C2. Nói cách khác, mã C2 có thể định nghĩa là mã C thiếu 1 bit cuối ở âm vần. Đó cũng chính là quan hệ giữa C2* với C* và giữa B2+ với B+. Khi đem nó nối vào [mã âm vần của] B2+, tất nhiên, ta khôi phục được [mã âm vần của] B+.

    Vậy, hệ thức giữa [mã âm vần của] C và C2, C* và C2*, B+ và B2+ là

    Code:
    vC  = vC2  * 2 + o
    vC* = vC2* * 2 + o
    vB+ = vB2+ * 2 + o
    Trong đó o, bit cuối của vC (và vC*, vB+), có thể tính bởi

    Code:
    o = h1 & v8 | t1 & t2
    với các bit v8, t1, t2 lần lượt là bit cuối của vD (âm vần trong mã D), bit đầu và bit giữa của tD (thanh trong mã D), đã được định nghĩa trước đây. Dễ thấy rằng t1 & t2 là giá trị của biểu thức tD >= 6. Còn h1 được định nghĩa là giá trị biểu thức vD < 48 hay, nói cách khác, bit đầu (bit dấu) của

    Code:
    h = vD - 48
    Hiển nhiên, công thức dịch D -> C2 là một hàm số có miền giá trị liên tục (nhưng miền xác định thì không) gồm 2 khúc tuyến tính:

    Code:
    vC2 = h1 ? vD / 2  :  vD - 32
    Hiển nhiên, công thức dịch C2 -> C2* (phép chuyển vị ma trận 24 cột thành ma trận 24 hàng) là

    Code:
    vC2* = i + j * 24
       i = vC2 / 24
       j = vC2 % 24
    Hiển nhiên, công thức dịch C2* -> B2+ (phép tính hình thái, tương tự như các phép tính "to upper", "to lower" trên mã ASCII), là

    Code:
    switch (pC2*)
    {
    case '--':...
    case 'b' :...
    case 'c' :...
    ...
    case 'gi':
        pB2+ = pC2*
        vB2+ = 0x9E/2 <= vC2* < 0xB0/2 ? vC2* + 32  :  vC2*
    case 'g/gh':
        pB2+ = 0x9C/2 <= vC2* < 0xC0/2 ? pC2* + ... :  pC2*
        vB2+ = vC2*
    ...
    case 'ng/ngh':
        pB2+ = 0x9C/2 <= vC2* < 0xC0/2 ? pC2* + ... :  pC2*
        vB2+ = vC2*
    ...
    case 'q':
        pB2+ = pC2*
        vB2+ = 0x80/2 <= vC2* < 0x9C/2 ? vC2* + 32  :  vC2*
    ...
    case 'y':
        pB2+ = pC2*
        vB2+ = 0xA9/2 <= vC2* < 0xB0/2 ? vC2* + 32  :  vC2*
    ...
    }
    Đoạn C2 -> C2* -> B2+ trong quy trình tối ưu giống hệt đoạn C -> C* -> B+ ở quy trình mẫu mực. Bước C2 -> C2* (hay C -> C*) gồm 2 phép tính không thể làm đồng thời (phép chia lấy thương đồng thời lấy dư và phép nhân đồng thời cộng). Bước C2* -> B2+ (hay C* -> B+) cũng gồm 2 phép tính không thể làm đồng thời (phép thử khoảng và phép cộng). Nên mỗi bước không thể nhanh hơn 2 xung nhịp. Đầu ra của bước nọ là đầu vào của bước kia, nên 2 bước cũng phải đi nối tiếp nhau. Vậy, 2 bước đó mất ít nhất 4 xung nhịp. Code thực tế có thể chạy lâu hơn thế đáng kể.

    Bản chất của sự tối ưu hóa này là thay bước D -> C rắc rối ở trước chuỗi 2 bước rắc rối nói trên bằng bước D -> C2 ở đầu, bước B2+ -> B+ ở cuối, và chuỗi phép tính o song hành với chuỗi 3 bước D -> C2 -> C2* -> B2+.

    Công thức D -> C2 rất đơn giản. Tính thêm cả B2+ -> B+ vẫn đơn giản hơn D -> C đáng kể. Nhờ thế bảo mật dễ hơn. Viết code bảo mật nói chung là khó hơn code thường bởi vì phải đảm bảo code đích không phân nhánh (branchless), nghĩa là không chứa một lệnh nhảy có điều kiện nào. (Đó là chi tiết kỹ thuật viết code, không bàn trong chủ đề này.) Thêm nữa, chuỗi phép tính o dù rắc rối cũng chỉ mất 2 xung nhịp thôi, nghĩa là vẫn nhanh hơn chuỗi 3 bước nhiều, nên chuỗi sau mới là đường găng (critical path) trong đồ thị tính toán, chứ chuỗi o song hành với nó thì không. Do đó, thời gian chạy của chuỗi o đã được che giấu đi, không cần phải lo bảo mật cho nó. Tóm lại, việc tối ưu hoá sẽ rút ngắn đường găng và thu nhỏ code mật. Nhất cử, lưỡng tiện.
    Đã được chỉnh sửa lần cuối bởi Ada : Hôm nay lúc 06:10 AM. Lý do: Thêm bảng mã C2
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  7. #27
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    559

    Có thể thấy rằng để giải mã tối ưu, kể cả giải mã tiền tố, mã C* là then chốt.

    Ở phiên bản trước đây, mã C dịch sang mã C* bằng phép thế. Từ phiên bản 2019 này, mã C (và D) được xếp đặt lại một cách tương ứng với mã C* để có thể dịch bằng một phép chuyển vị ma trận. Mất thêm 2 phép tính, nhưng đổi lại tiết kiệm được 1 lần đọc bộ nhớ và 192 byte bộ nhớ.

    Như công thức đã chỉ ra, mã C* đã được xếp đặt để có thể viết mọi phép thử hình thái bằng đúng 1 phép thử khoảng. Nhưng còn hơn thế nữa. Trên một số bộ xử lý, khi viết code theo một yêu cầu đặc thù, như bảo mật, phép thử khoảng a <= x < b với x biến và a, b hai hằng số đã biết từ khi biên dịch sẽ hữu hiệu hơn nếu hai cận là hai bội nguyên liên tiếp của một luỹ thừa của 2, nghĩa là a = n * 2^kb = (n+1) * 2^k với n, k nguyên [và k dương, trong loạt bài này].

    Mã C* đã được xếp đặt để có thể viết lại mọi phép thử khoảng với hai cận ở dạng "đẹp" này, trong điều kiện bổ sung rằng một số từ mã nhất định không tồn tại.

    • Sau phụ âm đầu q, để biết âm vần có dạng oa/ua hay không, có thể thử khoảng [a,b) = [0x80, 0xA0), giả thiết từ mã q-êng, q-êc, q-ing, q-ic không tồn tại.
    • Sau phụ âm đầu g/gh, ng/ngh, để biết âm vần có dạng ia, eo hay êu hay không, có thể thử khoảng [0xA0, 0xC0), giả thiết từ mã gh-êng, gh-êc, gh-ing, gh-ic, ngh-êng, ngh-êc, ngh-ing, ngh-ic không tồn tại.
    • Sau phụ âm đầu gi (hay gi/g), để biết âm vần có dạng iu hay u/u hay không, có thể thử khoảng [0xA0,0xB0), giả thiết từ mã gi-ing, gi-ic không tồn tại. Nói riêng, chữ lô-gíc được giả thiết là không tồn tại; chỉ có lô-gích mà thôi.
    • Sau phụ âm đầu -- (hay y/--), để biết âm vần có dạng u/u hay không, có thể thử khoảng [0xA8,0xB0). Không có giả thiết nào, nhưng trong dị bản mã hoá yêu thành --yêu (phụ âm đầu mã hoá bằng --), cần nhớ rằng khoảng này đã gộp cả mã số 0xA8 vốn biểu thị một âm vần không có dạng u/u. Nếu thay đổi hình thái, 0xA8 trở thành một mã số khác (0xE8, nếu dùng mã B). Vì vậy, bảng mã đích (mã B) phải định nghĩa cả mã số kia để đảm bảo rằng cả hai mã số đều biểu thị cùng một âm vần.


    Một số từ mã, như gh-êng, có thể giả thiết là không tồn tại vì trong thực tế, chúng biểu thị các chữ vô cùng hiếm.

    Một số từ mã có thể giả thiết là không tồn tại vì chúng không tồn tại trên lý thuyết (1). Một số, như q-a, không tồn tại vì giải mã thành một chữ sai chính tả. Một số khác, không có mặt trong các giả thiết trên, như q-ua, gi-êng, gi-êc, gi-ia, gi-iu, cũng không tồn tại bởi vì nếu mã hóa như thế thì sai, nghĩa là giải mã thành một chữ thực ra đã được mã hóa bằng một từ mã khác. (Chữ qua được mã hoá là q-oa, giênggi-iêng, giêcgi-iêc, giagi-a, và giugi-u.)

    Các giả thiết bổ sung trên hợp lý, an toàn cho hầu hết mọi ứng dụng. Và chúng là tùy chọn. Ứng dụng không muốn chấp nhận (chẳng hạn, vì muốn cho phép tồn tại chữ lô gíc) thì không cần chấp nhận và có thể dùng các cận không tối ưu đã nêu trong công thức ban đầu. Chú ý rằng cả khoảng không tối ưu cũng chứa vài ký tự "ngoại lai", như a, ia, iu. Nếu muốn cho phép vài từ mã tương ứng (q-a, gi-ia, gi-iu), phải định nghĩa vài ký tự bổ sung, như cách làm với ký tự 0xA8 đã nêu trên.

    Xin nói thêm. Bốn ví dụ sau cũng là ví dụ về một số âm tiếng Việt nói được mà chữ Việt lại không viết được (nghĩa là có thể mã hoá được bởi mã D nhưng từ mã, đến bây giờ, vẫn bỏ không). Nếu âm ấy được viết ra thành chữ theo đúng quy tắc đánh vần, thì trớ trêu, cũng theo đúng quy tắc đánh vần, chữ ấy được hiểu thành âm khác.

    Chúng được hiểu như thế bất kể có dấu thanh hay không và, nếu có, đặt ở đâu. Phương pháp mã hoá của mình dựa trên giả thiết có thể di dời dấu thanh ra khỏi vị trí của nó mà vẫn bảo toàn thông tin, nghĩa là vị trí đặt dấu thanh được suy hoàn toàn từ chữ không dấu thanh. Đó là mô hình giản lược, nhưng mình không phải là người duy nhất theo mô hình này. Thứ tự sắp xếp chính tả, từ điển tiếng Việt từ mấy trăm năm nay dựa vào đó. Mã điện tín, có người gọi là "mã dây thép", "mã TELEX", ít nhất 100 năm nay, dựa vào đó. Các phần mềm gõ tiếng Việt, có từ 30 năm nay, cũng dựa vào đó.

    Trong mô hình này, giâu gia (ria), giầm gìa (dìa), giúc gỉa (rỉa), giặc gĩa (dĩa), giặt gịa (dịa), giập gìu (dìu), gian gíu (díu), giằng gịu (dịu),... không tồn tại.

    Trong ngữ âm học, hai âm dạng oj o có quan hệ gần gũi. (Trong đó o là một nguyên âm và âm đệm j thường được viết bằng một dấu đặt trên đầu chữ cái o hoặc một chữ cái riêng trước chữ cái o và, trong cách viết sau, chữ cái thường dùng là i, j hay y.) Do vậy, đôi khi chúng được xem là hai biến thể, cứngmềm, của cùng một nguyên âm. Trong tiếng Việt (2), là thể mềm của ê. Sau phụ âm đầu gi chúng đều được viết là ê và theo quy tắc diễn giải (đánh vần), lựa chọn nhất quán là thể mềm, nói cách khác, thể cứng được xem là không tồn tại. Ví dụ, giết hiểu là gi-iết, còn gi-ết không tồn tại. Tương tự, giêm giẩm (rêm rẩm), giên gỉ (rên rỉ),... cũng không tồn tại.

    Dĩ nhiên, ở gia, giu, thậm chí giê, quy tắc đó áp dụng một cách trái ngược, nghĩa là ưu tiên "cứng" hơn "mềm". Dù ia (tức ) có những 2 cách viết, âm gi-ia, tức gi-iê, không có một cơ hội nào! Khi đánh vần chữ gia, giu, giê, chúng ta đã chọn hiểu là a thay vì ia, là u thay vì iu, thậm chí là ê thay vì (tức ia), bất chấp hình thái tương đồng với ê, . Vì sao thế? Mình chỉ có thể phỏng đoán. Có thể những người tạo ra chữ Việt, vốn là nhà truyền giáo, lúc ấy đang nghĩ về Chúa. Hoặc cũng có thể họ đã quyết định rằng thế giới có thể thiếu tiểu thư Giên Grê (Jane Grey) hay kỹ sư Giêm Oát (James Watt), nhưng không thể có thế giới mà Rô-mê-ô (Romeo) tồn tại còn Giu-li-ét (Juliet) thì không.

    ____________________
    (1) Ở đây, mình chỉ nói một lý thuyết. Nhưng tiếng Việt hiện đại có những tình huống thực tế không theo lý thuyết ấy. Ví dụ, chữ lô gíc, giêm, giên vẫn xuất hiện trong các văn bản Việt, nơi 2 chữ sau biểu thị gi-êm, gi-ên.

    (2) Mình đang diễn giải theo mô hình giản, theo đó i là một [phụ] âm đệm trong , khác với mô hình chuẩn, theo đó i là một nguyên âm bình đẳng với ê trong . Xem lại bài #1, #2.
    Đã được chỉnh sửa lần cuối bởi Ada : 25-06-2019 lúc 09:53 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  8. #28
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    559

    Nếu muốn giải mã tiền tố (để tính thứ tự chính tả) một chữ yêu đã được mã hoá (trong mã D) bằng từ mã --yêu hơn là y-yêu, ta vẫn có thể dịch ra B+, rồi A3'. Nhưng xem xét một tý sẽ thấy cho mục đích này, B+ và A3' không tối ưu.

    Ta biết rằng đầu ra phải là y-êu để so sánh được với y-ang, y-eo, y-uân, y-ương,... Mã B+, A3' chỉ dành cho mã âm vần 1 byte, nghĩa là chỉ đủ cho êu còn y bắt buộc phải đẩy lên mã phụ âm đầu. Nếu dịch y-yêu thành y-êu, chỉ cần tính lại (biến đổi) mã âm vần. Nhưng giờ đây, khi yêu cầu là dịch --yêu thành y-êu, ta phải tính lại không những mã âm vần mà còn cả mã phụ âm đầu. Nghĩa là mất 02 phép cộng, là vượt định mức. Một phép tính hình thái chỉ được phép dùng 01 phép cộng thôi. Không hơn và, nếu bảo mật, không kém.

    Thị trường khắc nghiệt. Nó không có chỗ cho những công nghệ hạng 02.

    Nếu, bên cạnh định mức tiêu chuẩn về số phép tính đó, "ngân sách" bộ nhớ (ROM) cũng eo hẹp tương tự như mã B+, ta phải dùng đến một phiên bản khác của B+ mà dịch --yêu thành --yêu. Mã B++.

    B++ là hợp của mã B và B+. Bảng mã âm vần của nó có mọi âm vần của cả B lẫn B+ (Bảng 3g).

    Bảng 3g. Bảng mã âm vần của mã B++.
    Code:
         0_   1_   2_   3_   4_   5_    6_   7_   8_   9_   A_   B_   C_   D_   E_   F_  
    =====================================================================================
    _0   ao   âu   ô    u    ua   uê    uy   ươu  oao  oe   i    e    uao  ue   --       
    _1   ai   ây   ôi   ui   uôi  uêu   uyu  ươi  oai  oeo  iu   eo   uai  ueo           
    _2   am   âm   ôm   um   uôm  uêm   uym  ươm  oam  oem  im   em   uam  uem  m        
    _3   ap   âp   ôp   up   uôp  uêp   uyp  ươp  oap  oep  ip   ep   uap  uep  p        
    _4   an   ân   ôn   un   uôn  uên   uyn  ươn  oan  oen  in   en   uan  uen  n        
    _5   at   ât   ôt   ut   uôt  uêt   uyt  ươt  oat  oet  it   et   uat  uet  t        
    _6   ang  âng  ông  ung  uông uêng  uynh ương oang oeng inh  eng  uang ueng nh       
    _7   ac   âc   ôc   uc   uôc  uêc   uych ươc  oac  oec  ich  ec   uac  uec  ch       
    _8   au   o    ơ    uâu  uơ   y     ưu   ư    oau  a    ia   ê    uao                
    _9   ay   oi   ơi   uây  uơi  uya   ưi   ưa   oay  oa   iêu  êu   uay  ua   êu   yêu 
    _A   ăm   om   ơm   uâm  uơm  uênh  ưm   anh  oăm  oanh iêm  êm   uăm  uanh êm   yêm 
    _B   ăp   op   ơp   uâp  uơp  uêch  ưp   ach  oăp  oach iêp  êp   uăp  uach êp   yêp 
    _C   ăn   on   ơn   uân  uơn  uyên  ưn   oong oăn  êng  iên  ên   uăn       ên   yên 
    _D   ăt   ot   ơt   uât  uơt  uyêt  ưt   ooc  oăt  êc   iêt  êt   uăt       êt   yêt 
    _E   ăng  ong  ơng  uâng uơng uyêng ưng  ôông oăng ing  iêng ênh  uăng ng   êng  yêng
    _F   ăc   oc   ơc   uâc  uơc  uyêc  ưc   ôôc  oăc  ic   iêc  êch  uăc  c    êc   yêc

    Tương tự như với B+, A3, A3' trước đây, giải mã tiền tố B++, thì được mã A4. Sắp xếp lại bảng ký tự của mã A4 theo thứ tự [chính tả], thì được mã A4'. Xem Bảng 8.

    Bảng 8. Tập hợp 250 ký tự của mã A4, A4'.
    Code:
    --  ât  êu   m    oe   ôt   uat  uet  uơm   ưn  
    a   âu  f    n    oec  ơ    uau  uê   uơn   ưng 
    ac  ây  g    ng   oem  ơc   uay  uêc  uơng  ươc 
    ach b   h    nh   oen  ơi   uăc  uêch uơp   ươi 
    ai  c   i    o    oeng ơm   uăm  uêm  uơt   ươm 
    am  ch  ia   oa   oeo  ơn   uăn  uên  up    ươn 
    an  d   ic   oac  oep  ơng  uăng uêng ut    ương
    ang đ   ich  oach oet  ơp   uăp  uênh uy    ươp 
    anh e   iêc  oai  oi   ơt   uăt  uêp  uya   ươt 
    ao  ec  iêm  oam  om   p    uâc  uêt  uych  ươu 
    ap  em  iên  oan  on   q    uâm  uêu  uyêc  ưp  
    at  en  iêng oang ong  r    uân  ui   uyên  ưt  
    au  eng iêp  oanh ooc  s    uâng um   uyêng ưu  
    ay  eo  iêt  oao  oong t    uâp  un   uyêt  v   
    ăc  ep  iêu  oap  op   u    uât  ung  uym   w   
    ăm  et  im   oat  ot   ua   uâu  uôc  uyn   x   
    ăn  ê   in   oau  ô    uac  uây  uôi  uynh  y   
    ăng êc  ing  oay  ôc   uach uc   uôm  uyp   yêc 
    ăp  êch inh  oăc  ôi   uai  ue   uôn  uyt   yêm 
    ăt  êm  ip   oăm  ôm   uam  uec  uông uyu   yên 
    âc  ên  it   oăn  ôn   uan  uem  uôp  ư     yêng
    âm  êng iu   oăng ông  uang uen  uôt  ưa    yêp 
    ân  ênh j    oăp  ôôc  uanh ueng uơ   ưc    yêt 
    âng êp  k    oăt  ôông uao  ueo  uơc  ưi    yêu 
    âp  êt  l    oc   ôp   uap  uep  uơi  ưm    z

    So với B+, mã B++ có thêm 7 mã âm vần có dạng u. Tương ứng, mã A4, A4' có thêm 7 ký tự (hợp tự) biểu thị các chữ dạng u. Vậy, lớp chữ yo được mã hoá nhất quán và A4, A4' là mã chính quy.

    Mã A4 có nhiều hơn 256 ký tự, nhưng chả sao. Điều chính vẫn là (i) B++ có không quá 256 mã âm vần, vốn được dùng làm khoá (chỉ số) tra bảng (mảng) hậu tố, nên bảng (mảng) này chỉ có đúng 256 phần tử (Bảng 3g); và (ii) A4, A4' chỉ có 250 ký tự phân biệt (1), do thế, A4' vẫn là một mã 8 bit, mỗi ký tự của nó vẫn chỉ chiếm 1 byte. Cả hai bảng (mảng) tiền tố và hậu tố chiếm cả thảy 32*2 + 256*1 = 320 byte.

    Chú ý rằng bảng (mảng) tiền tố chỉ có 32 phần tử, hơn là 33 (xem Bảng 1a). Khi làm cách này, ta đã giả thiết hoàn toàn không dùng mã y ở phụ âm đầu. Nói cách khác, ngôn ngữ nguồn chỉ có đúng 8 chữ y, yêc, yêm, yên, yêng, yêp, yêt, yêu bắt đầu bằng y mà thôi. Những chữ yang, , ,... nếu có mặt trong văn bản, đều là ngoại ngữ.

    Bảng 1a. Bảng mã phụ âm đầu của mã B++.
    Code:
        _0   _1   _2   _3   _4   _5   _6   _7   _8   _9   _A   _B   _C   _D   _E   _F
    =================================================================================
    0_  --   b    c    ch   d    dz   đ    f    g    gi   h    j    k    kh   l    m
    
    1_  n    ng   nh   p    ph   q    r    s    t    th   tr   v    w    x    gh   z
    ____________________
    (1) Nói "ký tự phân biệt" ở mã A3, A4 không ngụ ý phân biệt ở giá trị (nhị phân) của chúng. "Phân biệt" là phân biệt theo ngoại hàm, tức ngữ nghĩa "bề ngoài" bỏ qua ngữ cảnh. Hai ký tự bất kể theo sau tiền tố nào nếu cùng biểu thị một xâu chữ cái thì được xem là "không phân biệt". Nói chính xác hơn, A3 (A4) có 243 (250) lớp tương đương các ký tự đồng nghĩa (không phân biệt), mỗi lớp tương ứng một cách tự nhiên với một ký tự của A3' (A4').
    Đã được chỉnh sửa lần cuối bởi Ada : 25-06-2019 lúc 12:25 AM. Lý do: Cập nhật bảng mã B++
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  9. #29
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    559

    Còn nếu vẫn muốn hỗ trợ mã hoá các chữ yang, , và đồng thời muốn mã hoá yêu bằng mã phụ âm đầu trống (và tất nhiên, vẫn ở định mức 01 phép cộng), ta buộc phải dịch --yêu thành --y-êu, nghĩa là dành ra 2 ký tự (và thực tế, 2 byte) cho mã âm vần trong kết quả. Nghĩa là tăng gần gấp đôi "ngân sách" bộ nhớ. Nghĩa là phải từ bỏ mã A4, quay lại với mã A2.

    Bảng ký tự của A2 đã được chỉ rõ ở trên (Bảng 6). Nhưng chỉ bảng ký tự thôi thì chưa đủ để định nghĩa một mã nén hậu tố. Phải chỉ rõ cách mã hoá nữa. Mã A2 được định nghĩa là mã nén hậu tố mà sau một phụ âm đầu bất kỳ [vốn được mã hoá bằng một xâu đơn tự], sáu lớp âm vần ax, ăx, âx, ex, êx, ơx được mã hoá [nhất quán] bằng 1 ký tự, và sáu lớp âm vần ix, ox, ôx, ux, ưx, yx được mã hoá [nhất quán] bằng xâu, cụ thể, xâu 2 ký tự khi x là hậu tố thực sự. Với định nghĩa đó, có thể chứng minh rằng A2 là một mã chính quy.

    Năm lớp hậu tố cw, mw, nw, pw, tw [vốn là các phụ âm cuối] có thể theo sau tiền tố gi, nhưng trường hợp này, chỉ g được xem là phụ âm đầu còn i được tính vào âm vần, nói cách khác icw, imw,... là những lớp con của lớp âm vần ix. Vậy, mã phụ âm đầu gi thật ra biểu thị gi/g và phép tính hình thái cho trường hợp này, để luôn giữ nguyên mã âm vần, phải tính lại mã phụ âm đầu (giữ nguyên gi, hoặc biến đổi thành g). Phép tính đó là phép dịch [từ mã C* hay C2*] ra mã B chứ không phải B+ hay B++.

    Hiển nhiên, giải mã tiền tố (dịch mã B sang mã A2) cơ bản giống như giải mã toàn phần (dịch mã B sang mã A), chỉ thay thế bảng phụ âm đầu và bảng âm vần. Bảng phụ âm đầu, như thường lệ cho mục đích này, không chứa mã ngh.

    Mã B có 226 mã âm vần, trong đó âm vần [hình thái] ua có 2 mã số cho 2 dạng q-ua và (chẳng hạn) c-ua (vốn tương ứng lần lượt với 2 âm vần [âm vị] wa). Nên chỉ có 225 âm vần phân biệt, cách mã hoá chúng trong mã A2 được chỉ cụ thể trong Bảng 9. Do chúng chính là tất cả các âm vần [hình thái] của tiếng Việt (1), Bảng 9 chính là một định nghĩa trực quan của mã A2.

    Bảng 9. Tập hợp 225 âm vần phân biệt của mã B đã được dịch ra mã A2.
    Code:
    a    âu   i-êm  o-au  ô     u-ang u-en  u-ôt   ư-a   
    ac   ây   i-ên  o-ay  ô-c   u-anh u-eng u-ơ    ư-c   
    ach  e    i-êng o-ăc  ô-i   u-ao  u-eo  u-ơc   ư-i   
    ai   ec   i-êp  o-ăm  ô-m   u-ap  u-ep  u-ơi   ư-m   
    am   em   i-êt  o-ăn  ô-n   u-at  u-et  u-ơm   ư-n   
    an   en   i-êu  o-ăng ô-ng  u-au  u-ê   u-ơn   ư-ng  
    ang  eng  i-m   o-ăp  ô-ôc  u-ay  u-êc  u-ơng  ư-ơc  
    anh  eo   i-n   o-ăt  ô-ông u-ăc  u-êch u-ơp   ư-ơi  
    ao   ep   i-ng  o-c   ô-p   u-ăm  u-êm  u-ơt   ư-ơm  
    ap   et   i-nh  o-e   ô-t   u-ăn  u-ên  u-p    ư-ơn  
    at   ê    i-p   o-ec  ơ     u-ăng u-êng u-t    ư-ơng 
    au   êc   i-t   o-em  ơc    u-ăp  u-ênh u-y    ư-ơp  
    ay   êch  i-u   o-en  ơi    u-ăt  u-êp  u-ya   ư-ơt  
    ăc   êm   o     o-eng ơm    u-âc  u-êt  u-ych  ư-ơu  
    ăm   ên   o-a   o-eo  ơn    u-âm  u-êu  u-yêc  ư-p   
    ăn   êng  o-ac  o-ep  ơng   u-ân  u-i   u-yên  ư-t   
    ăng  ênh  o-ach o-et  ơp    u-âng u-m   u-yêng ư-u   
    ăp   êp   o-ai  o-i   ơt    u-âp  u-n   u-yêt  y     
    ăt   êt   o-am  o-m   u     u-ât  u-ng  u-ym   y-êc  
    âc   êu   o-an  o-n   u-a   u-âu  u-ôc  u-yn   y-êm  
    âm   i    o-ang o-ng  u-ac  u-ây  u-ôi  u-ynh  y-ên  
    ân   i-a  o-anh o-oc  u-ach u-c   u-ôm  u-yp   y-êng 
    âng  i-c  o-ao  o-ong u-ai  u-e   u-ôn  u-yt   y-êp  
    âp   i-ch o-ap  o-p   u-am  u-ec  u-ông u-yu   y-êt  
    ât   i-êc o-at  o-t   u-an  u-em  u-ôp  ư      y-êu
    Nhân tiện, vài ký tự của mã A2, Bảng 6, không được sử dụng trong Bảng 9 trên. Tức Bảng 6 với 108 ký tự là hơi thừa. Thực tế cần ít hơn. Xin lỗi các bạn vì sai sót này.

    _________________
    (1) Không hẳn thế. "Tiếng Việt" ở đây chỉ là những âm mã hoá được bởi mã C, D mà thôi. Khi lập mã, mình đã bỏ qua 3 âm vần [hiếm, không tồn tại trên thực tế] uyêu, uyêm, uyêp.
    Đã được chỉnh sửa lần cuối bởi Ada : 25-06-2019 lúc 04:27 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  10. #30
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    559

    Như lệ thường mỗi khi kết thúc một đợt cập nhật, mình có vài lời tự đánh giá.

    Thứ nhất, một bài toán phụ, so sánh hai mã chữ với nhau như thể chúng là hai chữ, theo thứ tự chính tả, chuyển thành một bài toán khác, lập mã tự điển và dịch một mã chữ sang đó, đưa đến cách giải là giải mã tiền tố.

    Thứ hai, hai vấn đề, giải mã (toàn phần) và so sánh rút cục hóa ra liên quan mật thiết với nhau. Cả hai đều đòi hỏi xác định hình thái của một mã âm vần vốn có thể biểu thị nhiều hình thái và việc này, đến lượt mình, đòi hỏi xếp đặt các âm vần theo hình thái.

    Có 64 mã âm vần, tức đúng một phần ba, một phần ba cuối bảng mã âm vần của mã C* đòi hỏi xếp đặt như thế.

    Sau khi xem xét, mình đã chia 64 mã số này thành 8 cột, mỗi cột 8 mã số liên tiếp, và gán vào đó 8 âm vần có chung một đặc điểm nhất định. Đặc điểm ấy là chủ âm theo nghĩa âm vị (ví dụ, oau, oay, oăm, oăp, oăn, oăt, oăng, oăc) và trong nhiều trường hợp, cả theo nghĩa hình thái (ví dụ, oao, oai, oam, oap, oan, oat, oang, oac). Trong 8 cột, 7 cột có thể xếp đặt được như thế. Còn cột "lạc điệu" chứa 8 âm còn sót lại sau khi xếp đặt 7 cột kia, là a, oa, oanh, oach, êng, êc, ing, ic. Nhắc lại rằng về mặt âm vị, chủ âm của oanh, oach không phải là a.

    Hôm nay, mình đã xếp đặt nốt hai phần ba còn lại. Kết quả tương tự: 14 cột được xếp đặt theo quy luật, chỉ có 2 cột "lạc điệu", là y, uya, uênh, uêch, uyên, uyêt, uyêng, uyêcư, ưa, anh, ach, oong, ooc, ôông, ôôc. Một lần nữa, chủ âm [âm vị] của anh, ach không phải là a.

    Nhắc lại, chủ âm của ay, oay không phải là ă và chủ âm của ây, uây không phải là â, nên thật ra, ngay cả ở 21 cột "đồng điệu", tính đồng điệu về âm vị cũng chỉ là tương đối.

    Như đã nói, chỉ 1/3 bảng C* cần phải xếp đặt khéo để phục vụ cho các thuật toán giải mã; xếp đặt 2/3 còn lại không có lợi ích thực tiễn nào (trước mắt). Nhưng ít nhất, xếp đặt cả bảng mã âm vần cũng cho nó một vẻ hoàn thiện hoàn mỹ, giúp đọc, hiểu, nhớ thuộc lòng dễ hơn, tạo điều kiện thuận lợi hơn cho bảng mã tìm được nơi dùng, và như vậy, đã ghi dấu thành công lên việc mà mình theo đuổi suốt 10 năm qua. Khỏi phải nói mình nhẹ nhõm và vui sướng nhường nào. Lúc này cảm xúc của mình giống như của Mendeleev khi ông tìm ra bảng tuần hoàn hóa học.

    Thứ ba, như tiêu đề, loạt bài này trình bày một phương pháp mã hóa tiếng Việt, không phải là một thuật toán cụ thể. Các giả thiết chữ này mã hóa thế đấy, chữ nọ mã hóa thế kia đều chỉ nhằm một mục đích: diễn giải mã. Diễn giải tiếng Việt không phải là mục đích, chỉ là phương tiện để mã hóa và cách mã hoá, đến lượt mình, cũng chỉ là phương tiện để diễn giải mã. Và khi có hai cách diễn giải khả dĩ khác nhau, mình trình bày chi tiết hơn, bằng ví dụ, công thức và thuật toán, để người đọc có thể tự so sánh và lựa chọn.

    Có hai cách mã hóa chữ yêu (tiêu biểu cho lớp chữ có dạng u). Mã hoá bằng y-yêu và bằng --yêu. Phân tích chi tiết đã cho thấy cách thứ nhất dường như có lợi hơn về kỹ thuật. Nên hãy xem thử cơ sở khoa học của nó. Nó dựa trên mô hình giản, theo đó y là một âm đệm trong , nghĩa là một nửa nguyên âm, nghĩa là phụ âm, vì thế, giống như gi-iêu chính là giêu, y-yêu chính là yêu.

    Nửa nguyên âm y và phụ âm gi khác nhau nhiều nhưng cũng có nguyên ủy sâu xa. Ví dụ, từ Jehovah (đức chúa trời) được một nửa nhân loại đọc là Yê-hô-va và nửa còn lại đọc là Giê-hô-va. Hai cách đọc lần lượt thống trị hai nửa của lịch sử tiếng Anh (thời cổ - trung cổ và thời cận đại - hiện đại). Tiếng Việt cũng chả ngoại lệ: Yàng (trời) trong nhiều văn bản được viết là Giàng.

    Phản bác ý kiến trên, có thể dựa vào mô hình chuẩn, theo đó y trong là nguyên âm bình đẳng với ê, khác với y trong yang vốn là một nửa nguyên âm. Cứ nhờ một người ngoại quốc mới học tiếng Việt nói yêu. Bạn nhận ra ngay anh/chị ấy nói sai! Và sai ở đâu? Sai ở âm y. Họ nói yêu cứ như yeah, you, yahoo, hay là yang vậy. Khác biệt giữa nguyên âm với nửa nguyên âm là ở đấy.

    Vậy, cách mã hoá đó làm mất đi những từ mã mà đáng lẽ ra có giá trị biểu thị những âm khác. Ví dụ, từ mã y-iêu đáng lẽ ra biểu thị một âm khác yêu.

    Hơn nữa, âm đệm không trực giao với âm vần: một nửa nguyên âm chưa chắc có thể dẫn trước một nửa nguyên âm bất kỳ khác. Hậu quả, không gian mã không còn phẳng (liền, lành) nữa, mà thủng lỗ chỗ, hay rách bươm với những "từ mã" vô nghĩa, nói đúng hơn, những chuỗi bit vô nghĩa, tức vô âm (không thể phát âm), như y-oa, y-uơ, y-uâm, y-uê, y-uya.

    Theo ý kiến, này, cũng như yêu, các chữ iang, yang,... phải được mã hóa nguyên vẹn trong trường mã âm vần, chứ không thể chia tách một phần sang trường mã phụ âm đầu, nghĩa là mã hóa bằng --iang, --yang, hơn là i-ang, y-ang. Nói cách khác, các mã kiểu như i, y không có chỗ trong bảng mã phụ âm đầu.
    Đã được chỉnh sửa lần cuối bởi Ada : Hôm nay lúc 06:52 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Các đề tài tương tự

  1. Dịch vụ gửi hàng hóa đi Australia, gửi hàng hóa đi France, gửi hàng hóa đi Germany, gửi hàng hóa đi Janpan giá rẻ.
    Gửi bởi sales5ttico trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 1
    Bài viết cuối: 30-07-2014, 02:51 PM
  2. Tính thành tiền trong bảng hóa đơn từ bảng chi tiết hóa đơn
    Gửi bởi tuanvi261 trong diễn đàn Thắc mắc đại cương Database & Reporting
    Trả lời: 2
    Bài viết cuối: 06-05-2013, 08:32 PM
  3. Hóa chất làm giảm điện trở đất, bột than tiếp địa, cọc tiếp địa, cọc thép mạ đồng, kim thu sét ese
    Gửi bởi chong set trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 18-04-2012, 12:33 PM
  4. Gọi hàm con.. tiến hóa khôn lường
    Gửi bởi luckyfor trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 06-10-2011, 03:58 PM

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn