MỘT SỐ THUẬT TOÁN NHẬN DẠNG VÀ CHUYỂN MÃ TIẾNG VIỆT ThS. PHẠM XUÂN TÍCH Bộ môn Khoa học máy tính Khoa Công nghệ thông tin Trường Đại học Giao thông Vận tải Tóm tắt: Hiện nay, tiếng Việt có hơn 40 loại bảng mã khác nhau được sử dụng để mã hóa các loại văn bản: từ trang web, các dữ liệu điện tử đến các cơ sở dữ iệu… Việc nhận biết bảng mã và chuyển đổi giữa các bảng mã tiếng Việt là rất cần thiết, không chỉ mang lại lợi ích cho các lập trình viên mà cho cả nhân viên văn phòng, nhân viên xử lý văn bản. Công việc này cũng tạo tiền đề cho các việc xử lý tiếp theo trong tiếng Việt như: kiểm tra phát hiện lỗi chính tả, tóm tắt văn bản, làm từ điển, thậm chí cả dịch máy và xử lý ngôn ngữ tự nhiên. Trong khuôn khổ bài báo này, chúng tôi đưa ra một thuật toán nhận dạng mã để dễ dàng chuyển đổi mã tiếng Việt mà các chương trình hiện nay hầu hết chỉ chuyển mã biết trước mà không nhận dạng được các bảng mã, cũng như không xử lý được các văn bản tiếng Việt có nhiều loại mã trong cùng một văn bản. Summary: In recent years, there are over 40 Vietnamese codes for encoding on all types of data from websites, databases to documents, and many others. Codes recognization and conversion have so many advantages for not only programmers but office clients and secretaries as well It makes premises for advanced Vietnamese processing such as: spell checking, syntact correcting, document abstracting, dictionary constructing, even machine translating and natural language processing. In this article, we present an algorithrm which can recognize many kinds of Vietnamese codes to make them easy to convert, while almost other programs can only convert some known codes and cannot recognize codes or process Vietnamese documents having more than one code. CNTT-CB I. MÃ HOÁ TIẾNG VIỆT TRONG CÔNG NGHỆ THÔNG TIN Công nghệ thông tin là một ngành non trẻ ở nước ta, với khoảng 20 năm phát triển nhưng nó cũng đang là một ngành có nhiều đóng góp đối với nền kinh tế đất nước. Với chi phí rất ít nhưng nó đem lại lợi nhuận cao, là một hướng đi tắt đón đầu cho các nước đang phát triển bắt kịp với các nước khác. Không những thế công nghệ thông tin làm hiện đại hóa, công nghiệp hóa không chỉ nền sản xuất xã hội, mà còn làm thay đổi bộ mặt đời sống văn hóa tinh thần của toàn xã hội. Việc đưa tiếng Việt vào máy tính không chỉ để soạn thảo văn bản mà còn xây dựng phát triển các phần mềm có giao diện tiếng Việt, thậm chí xử lý tiếng Việt. Dẫn tới việc xuất hiện các bảng mã tiếng Việt, cho phép soạn thảo và xử lý chúng. Hiện nay, với trên 40 bảng mã khác nhau được sử dụng, nên việc khai thác tài liệu, xử lý dữ liệu rất phức tạp. Các bảng mã tự bản thân cũng phức tạp bởi có loại 1 byte có loại 2 byte; có loại tổ hợp nguyên âm và dấu lại có loại dựng sẵn cho cả nguyên âm lẫn dấu. Nhưng về cơ bản các phụ âm, nguyên âm không dấu đều sử dụng theo mã ASCII. Sự khác nhau chỉ là nguyên âm có dấu. Ví dụ: Bảng mã Unicode dựng sẵn cho các nguyên âm và nguyên âm có dấu [2.] Ký tự Không dấu Huyền Sắc Nặng Hỏi Ngã ơ 0x0061 0x00e0 0x00e1 0x1ea1 0x1ea3 0x00e3 ă 0x0103 0x1eb1 0x1eaf 0x1eb7 0x1eb3 0x1eb5 â 0x00e2 0x1ea7 0x1ea5 0x1ead 0x1ea9 0x1eab e 0x0065 0x00e8 0x00e9 0x1eb9 0x1ebb 0x1ebd ê 0x00ea 0x1ec1 0x1ebf 0x1ec7 0x1ec3 0x1ec5 i 0x0069 0x00ec 0x00ed 0x1ecb 0x1ec9 0x0129 o 0x006f 0x00f2 0x00f3 0x1ecd 0x1ecf 0x00f5 ô 0x00f4 0x1ed3 0x1ed1 0x1ed9 0x1ed5 0x1ed7 ơ 0x01a1 0x1edd 0x1edb 0x1ee3 0x1edf 0x1ee1 u 0x0075 0x00f9 0x00fa 0x1ee5 0x1ee7 0x0169 ư 0x01b0 0x1eeb 0x1ee9 0x1ef1 0x1eed 0x1eef y 0x0079 0x1ef3 0x00fd 0x1ef5 0x1ef7 0x1ef9 A 0x0041 0x00c0 0x00c1 0x1ea0 0x1ea2 0x00c3 Ă 0x0102 0x1eb0 0x1eae 0x1eb6 0x1eb2 0x1eb4 Â 0x00c2 0x1ea6 0x1ea4 0x1eac 0x1ea8 0x1eaa E 0x0045 0x00c8 0x00c9 0x1eb8 0x1eba 0x1ebc Ê 0x00ca 0x1ec0 0x1ebe 0x1ec6 0x1ec2 0x1ec4 I 0x0049 0x00cc 0x00cd 0x1eca 0x1ec8 0x0128 O 0x004f 0x00d2 0x00d3 0x1ecc 0x1ece 0x00d5 Ô 0x00d4 0x1ed2 0x1ed0 0x1ed8 0x1ed4 0x1ed6 Ơ 0x01a0 0x1edc 0x1eda 0x1ee2 0x1ede 0x1ee0 U 0x0055 0x00d9 0x00da 0x1ee4 0x1ee6 0x0168 Ư 0x01af 0x1eea 0x1ee8 0x1ef0 0x1eec 0x1eee Y 0x0059 0x1ef2 0x00dd 0x1ef4 0x1ef6 0x1ef8 CNTT- CB II. NGÔN NGỮ HÌNH THỨC VÀ OTOMAT HỮU HẠN CÓ LỐI RA Ở đây, chúng tôi không trình bày các thuật ngữ trong ngôn ngữ hình thức gồm: bảng chữ cái, từ, xâu ký tự, ngôn ngữ hình thức, văn phạm và phân loại của Chomsky. Chúng tôi chỉ giới thiệu sơ lược về văn phạm chính quy, otomat hữu hạn. Đặc biệt otomat hữu hạn có lối ra, qua đó xây dựng giải thuật cho bài toán đặt ra ở mục trước: Định nghĩa 1: Văn phạm hay văn phạm sinh là một bộ bốn ( ) σ =ΣG,V,,P với , và Σ∩ trong đó: Σ≠∅ ≠∅V =∅V - Bảng chữ cái chính hay bảng chữ cái các từ của văn phạm, Σ V - Bảng chữ cái phụ hay bảng chữ cái hỗ trợ của văn phạm, σ ∈ V được gọi là tiên đề hay ký hiệu xuất phát của văn phạm, { } ϕψϕ ψ +∗ = → ∈ Σ∪ ∈ Σ∪ →∉ Σ∪P ( V) , ( V) , ( V) - Tập các quy tắc sinh của văn phạm [1.]. Định nghĩa 2: Văn phạm sao cho tất cả các quy tắc sinh thuộc một trong hai dạng: , được gọi là văn phạm chính quy hay văn phạm otomat [1]. ( σ =ΣG,V,,P ) Σ→→ ∈∈AaB,Aavíi A,BV, a Định nghĩa 3: Otomat hữu hạn có lối ra là một bộ sáu 0 (, ,, ,, )ASXYs ϕ ψ = trong đó S, X, Y là các tập hữu hạn được gọi một cách tương ứng là tập trạng thái, bảng chữ cái vào và bảng chữ cái ra của otomat A [1]. 0 sS∈ được gọi là trạng thái khởi đầu ϕ - hàm chuyển trạng thái là ánh xạ từ tích Đề các S X × vào S ψ - hàm ra là ánh xạ từ tích Đề các S X × vào Y. Ví dụ 4: Cho otomat có lối ra { } { } { } ( ) 012 ,, , ,, ,0,1,,Asssabc ϕ ψ = với hàm chuyển và hàm ra như sau: Hàm chuyển trạng thái ϕ CNTT-CB 0 s 1 s 2 s a 0 s 0 s 0 s b 1 s 2 s 1 s c 1 s 0 s 2 s Hàm chuyển trạng thái ψ 0 s 1 s 2 s a 0 0 1 b 1 0 1 c 0 1 0 Mỗi một văn phạm chính quy đều tồn tại một nguồn và một otomat hữu hạn tương đương với nó và ngược lại. Ngoài ra, người ta đã chứng minh được lớp ngôn ngữ chính quy đóng đối với các phép toán hợp, tích ghép, lấy phần bù, giao và phép đồng cấu. III. THUẬT TOÁN NHẬN DẠNG VÀ CHUYỂN MÃ Sự phức tạp ở nhận dạng mã tiếng Việt ở chỗ có rất nhiều mã nếu trong bảng mã này thì là chữ này nhưng trong bảng mã kia lại là chữ khác. Hay nói cách khác là có rất nhiều ký tự ở các bảng mã khác nhau có cùng một mã ASCII. Ví dụ ký tự “ỏ” trong mã UNICODE dựng sẵn và ký tự “á” trong TCVN3 đều có mã là 0x00e1; hay ký tự “ơ” trong mã VNIWIN và ký tự “ụ” trong TCVN3 cũng có chung một mã là 0x00f4. Do đó, để nhận dạng một văn bản có nhiều bảng mã khác nhau, chúng ta phải xây dựng văn phạm chính quy, cho phép phân tích từ vựng của các từ trong bảng mã đó. Vì mọi văn phạm chính quy đều có một otomat tương đương. Nên ta có thể dùng otomat đó để phân tích từ vựng và trên cơ sở otomat có lối ra ta sẽ chuyển mã sang các mã đích theo mong muốn. Khi đó, thuật toán nhận dạng và chuyển mã được tiến hành theo 2 bước: Bước 1. Xây dựng otomat có lối ra để phân tích từ vựng và chuyển mã Ta xây dựng otomat A = (S, X, Y, s 0 , ϕ, ψ) trong đó: S – tập trạng thái là tập các mã tiếng Việt đang được dùng: BKHCM1, BKHCM2, BKED60, TCVN1, TCVN2, TCVN3, VNIDOS, VNIWIN, UNICODE1, UNICODE2 … (khoảng 40 bảng mã) X – Tập tất cả các mã tiếng Việt của các ký tự của tất cả các mã có thể Y – Là một tập mã nhất định (chẳng hạn TCVN3) làm bảng mã trung gian chuyển đổi về nó trước khi chuyển sang mã đích. ϕ - Là hàm chuyển dựa vào các mã trong tập X thuộc vào bảng mã nào của tập S ta xây dựng tương ứng để nhận biết mã từ S X × vào S định hướng để nhận các mã tiếp theo. ψ - Là hàm ra, sau khi đã nhận biết được bảng mã của ký tự dựa vào ϕ ta chuyển sang một mã trung gian hoặc mã đích luôn. Bước 2. Viết thuật toán chuyển mã có độ phức tạp tuyến tính Khi đã có otomat, thuật toán đơn giản chỉ hoạt động biến đổi trạng thái theo otomat đã được xây dựng với cấu trúc dữ liệu là 2 bảng phi và xi thay cho 2 hàm để tra cứu tính toán cho nhanh. function recognize_and_convert(Phi,Xi:Array,source:string):string Begin destination:= “”; state:=recognize(); for i:=1 to length(source) do begin state:= Phi[source[i]][state]; destination:=concat(destination,Xi[state]); end return destination; CNTT- CB end; Vì mọi otomat không tất định ta đều xây dựng được một otomat tất định tương đương mà việc phân tích dựa trên otomat tất định là tuyến tính. Do đó, ta luôn xây dựng được một thuật toán tuyến tính để nhận dạng và chuyển đổi mã tiếng Việt. IV. KẾT LUẬN Việc xây dựng thuật toán nhận dạng được các loại mã tiếng Việt khác nhau và chuyển đổi mã tiếng Việt về một bảng mã thống nhất, đã giúp cho việc xử lý tiếng Việt đơn giản hơn, xây dựng các thư viện xử lý tiếng Việt trở lên dễ dàng hơn chẳng hạn các hàm so sánh tiếng Việt nhận biết được các từ bỏ dấu ở các nguyên âm khác nhau là giống nhau. Ngoài ra, nó cũng hỗ trợ cho việc sắp xếp từ điển, làm từ điển dịch máy. Hơn nữa, dùng lý thuyết ngôn ngữ hình thức còn có thể bóc tách dữ liệu từ các dữ liệu có định dạng thẻ như rtf, html, xml…, phân tích từ vựng, phân tích cú pháp từ đó ta có thể kiểm tra lỗi chính tả, rút gọn văn bản, tóm tắt dữ liệu, thậm chí là dịch máy và xử lý ngôn ngữ tự nhiên. Đây là các hướng mở cho tác giả và các đồng nghiệp nghiên cứu tiếp theo. Tài liệu tham khảo [1]. Đặng Huy Ruận (2005), Lý thuyết ngôn ngữ hình thức và otomat, NXB Đại học Quốc gia Hà Nội. [2]. Bảng mã UNICODE Tiếng Việt, Viện Công Nghệ Thông Tin – Trung tâm Khoa học tự nhiên và Công nghệ Quốc gia♦ . các phép toán hợp, tích ghép, lấy phần bù, giao và phép đồng cấu. III. THUẬT TOÁN NHẬN DẠNG VÀ CHUYỂN MÃ Sự phức tạp ở nhận dạng mã tiếng Việt ở chỗ có rất nhiều mã nếu trong bảng mã này thì. KẾT LUẬN Việc xây dựng thuật toán nhận dạng được các loại mã tiếng Việt khác nhau và chuyển đổi mã tiếng Việt về một bảng mã thống nhất, đã giúp cho việc xử lý tiếng Việt đơn giản hơn, xây dựng. toán nhận dạng mã để dễ dàng chuyển đổi mã tiếng Việt mà các chương trình hiện nay hầu hết chỉ chuyển mã biết trước mà không nhận dạng được các bảng mã, cũng như không xử lý được các văn bản tiếng