MỤC LỤC
LỜI CẢM ƠN 1
LỜI CAM ĐOAN 2
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 5
1.1. Giới thiệu chung về từ điển 5
1.1.1. Các từ điển Online 5
1.1.2. Từ điển Offline 6
1.2. Giới thiệu tổng quan về ASP.NET, C# và ngôn ngữ UML 7
1.2.1. Tổng quan về ASP.NET 7
1.2.2. Ngôn ngữ C# 11
1.2.3. Ngôn ngữ thống nhất mô hình hóa UML 12
1.2.3.1. Các thành phần của ngôn ngữ UML 14
1.2.3.2. Một số biểu đồ chính của UML 14
1.3. Các giải pháp và kỹ thuật xử lý khi xây dựng chương trình 16
1.3.1. Xử lý dữ liệu 16
1.3.2. Thuật toán tìm kiếm nhị phân 17
1.3.3. Thuật toán tìm từ gần đúng 18
1.3.4. Phát âm cho từ điển 19
1.3.5. Lựa chọn công cụ 19
CHƯƠNG 2: CHUẨN DỮ LIỆU TỪ ĐIỂN 20
2.1. Cơ sử dữ liệu từ điển 20
2.2. Các chuẩn dữ liệu từ điển 21
2.2.1. Chuẩn dict.org 21
2.2.2. Định dạng Spdict 24
2.2.3. Chuẩn dict.tab 27
2.3. Tìm hiểu về sắp xếp các mục từ tăng dần theo bảng chữ cái tiếng Việt 28
2.4. Dữ liệu dạng file từ ASCII đến Unicode 31
CHƯƠNG 3: PHÂN TÍCH THIẾT KẾ HỆ THỐNG WEBSITE TRA TỪ ĐIỂN 40
3.1. Khảo sát hệ thống website tra từ điển 40
3.1.1. Nhiệm vụ cơ bản 40
3.1.2. Quy trình xử lý 40
3.2. Phân tích hệ thống 40
3.2.1. Mô hình hóa trường hợp sử dụng (Mô hình Use-Case) 40
3.2.1.1. Xác định danh sách tác nhân và các ca sử dụng 40
3.2.1.2. Mô hình Use-Case 41
3.2.2. Đặc tả một số Use-Case chính 42
3.2.2.1. Đặc tả một số Use-Case của tác nhân người dùng 42
3.2.2.2. Đặc tả một số Use-Case của chức năng Admin 45
3.2.3. Mô hình hóa tương tác đối tượng 46
3.2.3.1. Đặc tả UC “Đăng ký” của User 46
3.2.3.2. Đặc tả UC “Đăng nhập và sửa thông tin” của User 47
3.2.3.3. Đặc tả Use-Case “Quên mật khẩu” của User 48
3.2.3.4. Đặc tả UC “Tra từ và nge phát âm” của User 49
3.2.3.5. Đặc tả Use-Case “Thảo luận” 50
3.2.3.6. Đặc tả Use-Case “Góp ý” 51
3.2.3.7. Đặc tả Use-Case “Đăng nhập” của Admin 52
3.2.3.8. Đặc tả Use-Case “Quản lý thông tin User” của Admin 53
3.2.4. Mô hình đối tượng: Biểu đồ lớp thực thể 54
3.2.5. Mô hình hóa hành vi: Biểu đồ hoạt động của hệ thống 55
3.3. Thiết kế hệ thống 56
3.3.1. Thiết kế các bảng dữ liệu 56
3.3.2. Mô hình quan hệ cơ sở dữ liệu 58
CHƯƠNG 4: HOÀN THÀNH ỨNG DỤNG WEBSITE TRA TỪ ĐIỂN 59
4.1. Các thành phần giao diện cơ bản 59
4.2. Cài đặt ứng dụng 63
KẾT LUẬN 64
TÀI LIỆU THAM KHẢO 65
DANH MỤC CÁC BẢNG, HÌNH VẼ 66
66 trang |
Chia sẻ: netpro | Lượt xem: 3719 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề tài Nghiên cứu chuẩn quốc tế về dữ liệu từ điển, xây dựng website tra từ điển theo chuẩn, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
iều thuật toán có thể áp dụng vào để làm được từ điển như dùng cây nhị phân tìm kiếm, cây cân bằng AVL, cây đỏ đen (cây cờ bạc), dùng bảng
băm, dùng cơ sở dữ liệu access, XML,…
Phương pháp cây nhị phân: Đây là một thuật toán làm từ điển khá nhanh và đã rất nhiều bạn sinh viên đã từng làm. Tuy nhiên cây sẽ bị mất đối xứng khi thêm, xóa và việc xử lý điều này bằng ngôn ngữ lập trình cũng hơi phức tạp, dễ lỗi.
- Phương pháp cây cân bằng AVL, cây đỏ đen: Phương pháp này đáp ứng được tốc độ thêm, xóa từ cực nhanh, nhưng cũng có nhược điểm là để nhảy đến vị trí bất kỳ thì không hề đơn giản chút nào.
- Phương pháp dùng bảng băm: Từ từ khóa cần tìm dùng mã băm để băm đến danh sách chứa vị trí nghĩa, tức là nhảy trực tiếp đến nghĩa của từ cần tra, vô cùng nhanh, nhưng lại rất phụ thuộc vào hàm băm và dữ liệu nhập vào, nhanh hay chậm là tùy thuộc vào hàm băm.
Mỗi thuật toán trên đều có những ưu, nhược điểm nhất định, tùy vào khả năng của mỗi người mà chọn cho mình những thuật toán phù hợp. Vì dữ liệu của từ điển đã được sắp xếp sẵn theo thứ tự tăng dần của bảng chữ cái nên em chọn thuật toán tìm kiếm nhị phân. Thuật toán này rất đơn giản, dễ hiểu, dễ thao tác.
* Thuật toán tìm kiếm nhị phân:
Được áp dụng trên mảng đã có thứ tự.
- Ý tưởng:
Giả xử ta xét mảng có thứ tự tăng, khi ấy ta có ai-1<ai <ai+1.
+ Nếu X>ai thì X chỉ có thể xuất hiện trong đoạn [ai+1, an-1].
+ Nếu X<ai thì X chỉ có thể xuất hiện trong đoạn [a0, ai-1].
+Ý tưởng của giải thuật là tại mỗi bước ta so sánh X với phần tử đứng giữa trong dãy tìm kiếm hiện hành, dựa vào kết quả so sánh này mà ta quyết định giới hạn dãy tìm kiếm ở nửa đầu hay nửa sau của dãy tìm kiếm hiện hành.
- Giải thuật:
Giả sử dãy tìm kiếm hiện hành bao gồm các phần tử nằm trong aleft -> aright, các bước của giải thuật như sau:
+Bước 1: left = 0; right = N-1;
+ Bước 2:
+Mid = (left + right) / 2; //chỉ số phần tử giữa của dãy hiện hành
+ So sánh a[mid] với x. Có 3 khả năng
• a[mid] = x: tìm thấy: Dừng.
• a[mid] > x: Right = mid - 1;
• a[mid] < x: Left = mid + 1;
+Bước 3: Nếu Left <= Right; // còn phần tử trong dãy hiện hành
Lặp lại bước 2
Ngược lại : Dừng.
- Độ phức tạp của thuật toán: O(log2N)
Người ta đã chứng minh được độ phức tạp của thuật toán tìm kiếm nhị phân trong trường hợp tốt nhất là O(1), trong trường hợp xấu nhất là O(log2N) và trong trường hợp trung bình là O(log2N/2).
Thuật toán tìm từ gần đúng
Xét 2 string s, s1, với s là xâu ta cần phải tìm từ gần giống nó nhất, s1 là xâu đem ra để so sánh với s. Thuật toán:
+ Đầu tiên kiểm tra độ dài string, so sánh s1 nếu ít hơn hay nhiều hơn 30% so với s thì loại.
+ Tiếp là duyệt 2 strinng từ trái qua phải, so sánh từng ký tự của 2 string nếu không bằng nhau thì lỗi cộng thêm 1, tiếp tục so sánh các ký tự lân cận tiếp theo của cả 2 string. Trong khoảng sai số nếu có, thì chỉnh lại vị trí i, j là chỉ số tương ứng của 2 string đó, cái này sẽ kiểm tra các lỗi thừa hay thiếu từ, đọc ký tự kế tiếp.
+ Cuối cùng, khi 1 trong 2 string đã đi hết thì còn mẩu đuôi ta làm:
loi + = s.Length - i + s1.Length - j; Tức là nếu 1 string còn thừa thì cho mẩu đó là lỗi cộng vào.
Nếu số lỗi <= 30% thì là đạt, không thì không đạt.
Phát âm cho từ điển
Để phát âm được tiếng Anh ta chỉ cần tích hợp bộ SDK Text To Speech của Microsoft vào máy. Ứng dụng này sử dụng bộ SDK 5.1, là bản mới nhất. Bộ SDK này đã giúp cho công việc lập trình phát âm trở nên đơn giản hơn rất nhiều.
Để phát âm được tiếng Việt, ta dùng thư viện phát âm tiếng Việt VnSpeech được xây dựng trên cơ sở của SDK 5.1 của tác giả Nguyễn Hữu Minh, có tên là NHMTTS Sapi5. Phần mềm này đã cung cấp 2 giọng đọc nam (Male) và nữ (Female) đều đọc văn bản chứa mã Unicode. Tuy nhiên nếu cảm thấy không thích giọng đọc sẵn, ta có thể cài thêm giọng đọc vào máy, ở đây cài thêm giọng đọc của Minh Du (cho Unicode) của Trung tâm tin học vì người mù Sao Mai.
Lựa chọn công cụ
Vì từ điển của chúng ta là từ điển đa ngôn ngữ thế nên việc cần thiết là phải hỗ trợ unicode , ngoài ra nên hỗ trợ sắp xếp đa ngôn ngữ (không nhất thiết phải có). Mình chọn C# 2008 để lập trình cho ASP.NET, vb.net cũng được, 2 cái này thoả mãn cả hai tính năng trên, các ngôn ngữ dùng framework hình như đều hỗ trợ . Còn không các bạn có thể dùng vb (lấy control unicode của bên caulacbovb.net) hoặc delphi, vc++ cũng được ,cái này chỉ mang tính chất thói quen người dùng thôi. Ngoài ra , để làm việc với file dict.tab các bạn còn cần một công cụ có khả năng hiển thị file text hàng chục mb với tốc độ nhanh, việc này notepad thậm chí word cũng không làm được. Hiện giờ mình chỉ biết notepad2 và notepad++ đủ khả năng đó: notepad++ nhiều tính năng hơn, nhưng hiển thị unicode một số ký tự thành ô vuông, vì vậy mình quyết định chọn notepad2. Còn với file dữ liệu dict.org ta có thể hiển thị nó ngay trong công cụ lập trình VS studio 2008.
CHƯƠNG 2: CHUẨN DỮ LIỆU TỪ ĐIỂN
2.1. Cơ sử dữ liệu từ điển
Phần quan trọng nhất đối với một ứng dụng từ điển chính là cơ sở dữ liệu (CSDL). Việc xây dựng CSDL cho từ điển phải đảm bảo được khả năng truy cập nhanh bởi dữ liệu của từ điển thường khá lớn. Để nhập một CSDL từ đầu thì đúng là mệt, chưa kể nó vừa ít về số lượng, kém về nội dung, lại có thể sai về ngữ nghĩa ( con người mà, sai là chuyện thường), rất may cho chúng ta, có một nguồn cung cấp từ điển rất lớn trên web của người việt đó là ở trang www.tudientiengviet.net, số lượng từ điển ở đây rất phong phú , đa ngôn ngữ và thừa để bạn có thể bắt tay vào làm soft từ điển. Để lấy CSDL từ điển bạn vào . Dữ liệu của từ điển này được lấy từ dữ liệu củ từ điển stadict trong trang web www.tu dientiengviet.net bằng cách sử dụng công cụ convert file: stardict editor.7z , sau khi giải nén, các bạn hãy vào thư mục đó chạy file stardict editor.exe.
Nó là một công cụ convert file stardict sang định dạng dict.tab và ngược lại. File dict.tab này thực ra chỉ là file text, sau khi convert từ stardict sẽ là file để lấy dữ liệu cho từ điển của chúng ta bởi vì định dạng của nó cực kỳ đơn giản và nó còn có một số tính năng bổ trợ từ điển rất tốt. Cụ thể nó được thể hiện như sau:
Hình 2.1: Định dạng của file AnhViet.txt
Tuy nhiên ta thấy định dạng này chưa phải là định dạng tối ưu vì khi thực hiện thao tác tìm kiếm 1 từ và lấy nghĩa của nó hết sức khó khăn, phức tạp. Do đó mà cần thay đổi lại cấu trúc file dữ liệu hỗ trợ cho việc tìm kiếm nhanh, dễ dàng. Các định dạng tối ưu hơn được áp dụng đó là định dạng dict.org và định dạng Spdict.
Trong ứng dụng này em sẽ sử dụng định dạng dict.org và sẽ được trình bày trong phần sau đây.
Các chuẩn dữ liệu từ điển
2.2.1. Chuẩn dict.org
Đây là bài viết của anh Trần Bình An, admin tudientiengviet.net chính nơi chúng ta lấy dữ liệu về dùng, cũng chính bài viết này mà chuẩn dict.org đã được biết đến nhiều ở việt nam và các từ điển multidictionary, powerclick , jtranslator mới xuất hiện. Việc học ngoại ngữ hiện này đã trở thành nhu cầu không thể thiếu đối với rất nhiều người. Và vật dụng cần nhất khi học ngoại ngữ đó chính là quyển từ điển. Cũng như các bạn, khi học ngoại ngữ tôi cũng phải dùng từ điển. Tuy nhiên, chắc hẳn các bạn cũng như tôi sẽ cảm thấy rất vất vả khi phải tra từ trên từ điển . Và giải pháp đáng giá là sử dụng các ứng dụng từ điển trên máy vi tính.
Phần quan trọng nhất đối với một ứng dụng từ điển không phải là khả năng hoạt động của ứng dụng đó, mà lại chính là cơ sở dữ liệu. Việc xây dựng cơ sở dữ liệu cho từ điển phải đảm bảo được khả năng truy cập nhanh cho ứng dụng bởi dữ liệu của từ điển thường khá lớn, lên tới hàng chục nghìn từ. Thật may mắn, www.dict.org đã xây dựng một format từ điển rất dễ sử dụng, Dạng format này đã được một số cá nhân sử dụng để xây dựng những bộ từ điển khá lớn.
Dict format được mô tả như sau: toàn bộ cơ sở dữ liệu được chứa trong 2 file, một file chứa nghĩa của từ và một file index. File index bao gồm tên từ, vị trí nghĩa của từ bắt đầu trong file chứa nghĩa và độ dài của nghĩa.
Đây là định dạng dict.org của file chứa từ anhviet.index
Hình 2.2: Định dạng dict.org của file anhviet.index
Còn đây là file chứa nghĩa:
Hình 2.3: Định dạng dict.org của file anhviet.dict
Trong đó:
Vị trí bắt đầu và độ dài của nghĩa được mã hoá theo cách như sau:
Sử dụng 64 chữ cái: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Chữ cái A tương đương số 0, chữ cái B tương đương số 1 v.v… Giữa từ, vị trí bắt đầu và độ dài nghĩa phân cách nhau bởi ký tự tab (ASCII 9). Mỗi dòng trong file index chứa dữ liệu của một từ. Các dòng phân cách nhau bởi ký tự xuống dùng (ASCII 10).
Ví dụ như trong file index của từ điển Anh Việt như sau: game 3JH1 Pv
Như vậy nghĩa của từ game trong file chứa nghĩa sẽ bắt đầu tại offset 3JH1 (theo mã 64 ký tự) và độ dài là Pv. Việc chuyển từ mã cơ số 64 về cơ số 10 được thực hiện như sau:
Đối với vị trí bắt đầu: 3JH1. Ta có 3 ở mã cơ số 64 = 56 ở cơ số 10, J = 8, H = 6, 1 = 54. Như vậy chuyển sang cơ số 10, mã 3JH1 có giá trị là: 56*64^3 + 8*64^2 + 6*64^1 + 54*64^0 = 481038434742
Đối với độ dài nghĩa: Pv. Ta có P = 15, v = 48. Như vậy chuyển sang cơ số 10, mã Pv ở cơ số 64 có giá trị là: 15*64^1 + 48*64^0=1008
File index được sắp xếp để giảm bớt thời gian tìm kiếm. Việc mã hoá theo cơ số 64 như trên giúp cho kích thước file index sẽ giảm xuống rất nhiều khi so với khi không mã hóa.
Còn cấu trúc của file chứa nghĩa gồm các phần như sau:
@headword
* tu loai (noun, verb...)
- dinh nghia 1
= cau vi du cho dinh nghia 1 + nghia cua cau do
- dinh nghia 2
= cau vi du cho dinh nghia 2 + nghia cua cau do
* tu loai
- dinh nghia 3
Nghĩa của mỗi từ gồm một phần như trên, các nghĩa của mỗi từ nối tiếp nhau liên tục. Như vậy, các bạn đã hiểu cách thức và hoàn toàn có thể xây dựng được cho mình các bộ từ điển riêng rồi. Tuy nhiên, công việc nhập dữ liệu lại không hề đơn giản một chút nào. Nhưng, lại một lần nữa, chúng ta thật may mắn vì đã có một số bạn bỏ công ra nhập sẵn cho chúng ta một số bộ từ điển thông dụng rồi. Các bạn có thể tham khảo thêm tại:
Ngoài ra còn rất nhiều bộ từ điển chuyên dụng khác nữa, các bạn có thể tham khảo thêm ở các địa chỉ trên hoặc tại www.dict.org.
Định dạng Spdict
Cấu trúc của định dạng này như sau:
Hình 2.4: Cấu trúc file dữ liệu chuẩn Spdict
Định dạng Spdict do tác giả Bùi Đức Tiến phát triển dựa tên định dạng dict.org, nó khắc phục một số hạn chế của dict.org như: thêm, sửa xóa cập nhật nghĩa của từ.
- Phần 1: Thông tin về từ điển.
+ 4 byte đầu là vị trí của mảng con trỏ hay chính là vị trí bắt đầu của phần thứ ba.
+ 2 byte tiếp theo lưu số lần phát sinh dữ liệu thừa (đến một con số nào đó chương trình sẽ tự cập nhật dữ liệu thừa).
+ Tiếp theo là String kiểu binary: gồm mã sắp xếp, giọng phát âm, tên từ điển, tác giả, nguồn gốc xuất xứ (phân cách nhau bởi ký tự \0, dùng 2byte để lưu độ dài).
- Phần 2: Dữ liệu từ điển (phần này lưu nội dung từ và nghĩa của nó), mỗi từ gồm 2 string nối tiếp nhau: string từ và string nghĩa dạng binary, trong đó phần từ dùng 2 byte còn phần nghĩa dùng 4 byte để lưu độ dài.
- Phần 3: Là mảng số nguyên kiểu int (mảng con trỏ), mảng số nguyên này được sắp xếp theo thứ tự tăng dần của bảng chữ cái. Mỗi một phần tử (chiếm 4 byte) trong mảng chính là dữ liệu trỏ đến vị trí của mỗi từ.
Hay file cuả nó được mở bởi Notepad2 như sau:
Lưu ý string kiểu binary không giống string bình thường, nhìn hình dưới thấy rất rõ nó ghi độ dài của string rồi mới đến dữ liệu chuỗi (chuẩn dict cũng làm thế này nhưng mã hoá dưới dạng 64 còn mình là 256) chứ không phải là dữ liệu rồi mới đến ký tự kết thúc chuỗi như nhiều người vẫn tưởng.Và vì lẫn lộn string và dữ liệu int như ở dưới, đừng ai suy nghĩ ngây thơ rằng có thể đọc định dạng bằng cách mở trực tiếp ra mà đọc nhé .
Các bạn có thể hiểu phần thứ 1 là các dữ liệu thông tin về từ điển, phần thứ 2 là nội dung từ, phần thứ 3 là mảng con trỏ (cái này quan trọng nhất ).
Để lấy được tổng số từ ta lấy kích thước file - vị trí mảng (lấy ở phần 1) rồi tất cả chia cho 4. để nhảy đến vị trí thứ n bất kỳ thì ta chỉ việc nhảy đến vị trí mảng +4*(n-1). Vì đây là mảng, việc tìm kiếm nhị phân có lẽ không phải nói nhiều chắc ai cũng biết chỉ có điều mảng bình thường thì ta gõ chỉ số nó ra biến có nội dung ngay ví dụ a[3], nhưng vì đây là mảng ta tự định nghĩa nên phải nhảy đến phần tử cần lấy nội dung, đọc 4 byte lấy vị trí nội dung, nhảy đến từ rồi mới lấy được nghĩa.
Để thêm xoá từ, ví dụ thêm từ ở vị trí thứ n (để cho danh sách vẫn theo thứ tự abc) , ta tống toàn bộ mảng con trỏ (gọi thế này cho quen thuộc) lên ram, ghi nội dung từ mới vào cuối phần dữ liệu từ, lưu phần mảng từ đầu -> n-1 vào file, thêm vị trí phần tử mới thêm, lưu nốt phần còn lại vào. Xoá từ, chúng ta để nguyên phần nội dung, chỉ xoá phần vị trí của từ cần xoá trong mảng con trỏ. Giống access vậy, dữ liệu này sẽ là dữ liệu thừa, và chỉ được đẩy đi khi dùng lệnh "compact and repair database". Chúng ta phải tạo thêm 1 công cụ có chức năng tương tự cho từ điển.
Cần lưu ý phần mảng con trỏ phải luôn ở cuối file để kích thước của nó luôn luôn là min (4byte cho mỗi phần tử) , chứ nếu để mảng này ở đầu file, load lên ram, phải load luôn cả phần nội dung (có khi hàng trăm mb) thì chết mất .
Nói chung so với các loại cây thì cái này thêm xoá chậm hơn nhưng đối với từ điển, nhập tuần tự chứ không thay đổi liên tục thì tốc độ này hoàn toàn thoả mãn. Người dùng sẽ không thể nhận thấy sự khác biệt nếu thời gian nhập từ là 0.001 giây với 0.1 giây. Định dạng này rất thích hợp khi thêm xoá với từ điển. Mọi người cũng có thể ứng dụng cái để làm các csdl loại nhỏ, cơ động, không đòi hỏi quá nhiều.
2.2.3. Chuẩn dict.tab
Chính là định dạng file dữ liệu text mà ta đã nói ở trên. Định dạng dict.tab là dữ liệu dạng text lớn (từ vài mb trở lên), dict.tab sau khi convert từ stardict sẽ là file để lấy dữ liệu cho từ điển của chúng ta bởi vì định dạng của nó cực kỳ đơn giản và nó còn có một số tính năng bổ trợ từ điển rất tốt. Định dạng của nó như sau:
============a 1\n2\n3b 4\\5\n6c 789
=====.======
Ta dùng Notepad2 để mở file này
Cũng như đã nói ở trên, nếu ta dùng định dạng này để xây dựng từ điển thì rất bất cập. Tuy nhiên định dạng Spdict có một số kết hợp với chuẩn này làm tăng khả năng tra từ cho từ điển.
Chức năng ghép nối từ điển:
SPDict tool có 2 tính năng là convert dict.tab sang SPDict và ngược lại. Để ghép các từ điển, giả sử người dùng phân nhau nhập liệu từ điển chẳng hạn, lúc cần ghép, thì chỉ cần làm như sau : convert từ SPDict sang dict.tab, nối các file dict.tab, rồi convert ngược lại. Trong quá trình convert ngược lại, máy sẽ tự động sắp xếp lại danh sách . Tính năng này theo mình biết thì chưa từ điển nào áp dụng.
Ngoài ra, chúng ta còn có thể dùng dict.tab để chuyển đổi font cho từ điển, rất nhiều tính năng…
Tìm hiểu về sắp xếp các mục từ tăng dần theo bảng chữ cái tiếng Việt
Đối với từ điển Anh – Việt thì thứ tự các từ sắp xếp đơn giản hơn, chỉ cần theo thứ tự của bảng chữ cái tiếng Anh. Còn đối với từ điển Việt – Anh thì việc sắp xếp này phức tạp hơn, phải tuân theo thứ tự tăng dần các ký tự của bảng chữ cái tiếng Việt.
Vì chuẩn dữ liệu được sử dụng là chuẩn dict.org, chuẩn này đã được sắp xếp thứ tự theo bảng chữ cái tiếng Việt rồi nên ở đây ta chỉ tìm hiểu quy trình sắp xếp và so sánh các chữ cái như thế nào. Nhưng đối với chuẩn Spdict do tác giả Bùi Đức Tiến xây dựng thì việc so sánh và sắp xếp thứ tự này phải được thực hiện trong quá trình xây dựng định dạng.
Các thứ tự trong bảng chữ cái đó là:
A, (á, à, ả, ã, ạ), ă, (ắ, ằ, ẳ, ẵ, ặ), â, (ấ, ầ, ẩ, ẫ, ậ), b, c, d, đ, e, (é, è, ẻ, ẽ, ẹ), ê, (ế, ề, ể, ễ, ệ), f, g, h, i, (í, ì, ỉ, ĩ, ị), j, k, l, m, n, o, (ó, ò, ỏ, õ, ọ), ô, (ố, ồ, ổ, ỗ, ộ), ơ, (ớ, ờ, ở, ỡ, ợ), p, q, r, s, t, u, (ú, ù, ủ, ũ, ụ), ư, (ứ, ừ, ử, ữ, ự), v, w, x, y, (ý, ỳ, ỷ, ỹ, ỵ), z.
Việc so sánh hai chữ sẽ đưa về so sánh từng ký tự với nhau. Ví dụ: chữ “Lộc” sẽ có thứ tự nhỏ hơn chữ “Thanh” vì chữ cái “T” có thứ tự lớn hơn chữ cái “L”; chữ “lốc” sẽ có thứ tự nhỏ hơn chữ “lộc” vì đối với chữ cái “ô” dấu nặng có thứ tự lớn hơn dấu sắc.
Để tiến hành sắp xếp các mục từ theo thứ tự ta phải tiến hành so sánh các chuỗi. Ta chia bảng gồm tập các ký tự tiếng Việt trên thành 2 tập: Tập thứ nhất X gồm các ký tự thỏa: không có dấu tiếng Việt và có thứ tự trên bảng mã Unicode. Tập thứ hai Y gồm các ký tự thỏa: có dấu tiếng Việt và không có thứ tự trên bảng mã Unicode.
Như vậy tập Y sẽ gồm các ký tự sau:
Hình 2.5: Bảng tập các ký tự tiếng Việt có dấu
Tập X sẽ gồm những ký tự còn lại trong bảng mã Unicode.
Khi so sánh hai ký tự c1, c2 với nhau ta sẽ lần lượt xét các trường hợp sau:
- Nếu cả hai ký tự đều thuộc tập Y thì so sánh vị trí của nó trong tập Y.
Ví dụ: ký tự “ư” nhỏ hơn ký tự “ỷ” vì trong tập Y thứ tự của “ỷ” lớn hơn thứ tự của “ư”.
- Nếu cả hai ký tự không có trong tập Y, nghĩa là thuộc tập X thì so sánh theo mã Unicode. Ví dụ: ký tự “a” nhỏ hơn ký tự “b” vì trong tập X mã của ký tự “b” lớn hơn mã của ký tự “a”.
- Nếu ký tự c1 thuộc tập X, ký tự c2 thuộc tập Y thì tìm ký tự biên dưới Lb, biên trên Ub của c2.
Hình 2.6: Biên trên và biên dưới của các kí tự có dấu tiếng Việt
Nếu mã ký tự Lb lớn hơn mã của ký tự c1 thì ta nói c1 có thứ tự nhỏ hơn c2. Ví dụ khi ta so sánh hai ký tự “k” (c1) và ký tự “ò” (c2), ký tự “ò” có biên dưới Lb là “o”, biên trên Ub là “p”, mã của ký tự “o” lớn hơn mã của ký tự “k” nên “k” có thứ tự nhỏ hơn “ò”.
Hình 2.7: Minh họa cách sử dụng biên dưới
Nếu mã ký tự Ub nhỏ hơn mã của ký tự c1 thì ta nói c1 có thứ tự lớn hơn c2. Ví dụ khi so sánh hai ký tự “q” (c1) và ký tự “ò” (c2), ký tự “ò” có biên dưới là “o”, biên trên ub là “p”, mã của ký tự “q” lớn hơn mã của ký tự “p” nên “q” có thứ tự lớn hơn ký tự “ò”.
Hình 2.8: Minh họa cách sử dụng biên trên
Nếu ký tự c1 thuộc tập Y, ký tự c2 thuộc tập X thì làm tương tự như trường hợp ký tự c1 thuộc tập X, ký tự c2 thuộc tập Y.
Dữ liệu dạng file từ ASCII đến Unicode
Đây là bài viết tôi search trên mạng , vì từ điển của chúng ta là đa ngôn ngữ, nên sẽ dùng mã Unicode chứ không phải vni hay tcvn3, chúng ta nên có chút kiến thức về nó.
(Xin cám ơn bạn Minh Sơn ở TP HCM đã dịch bài viết này từ Anh ra Việt).
Bài viết này là để giúp các bạn có trình độ máy tính trung bình hiểu được Unicode và UTF-8 rõ ràng hơn. Sau khi đọc xong, các bạn sẽ biết được lịch sử của Unicode, nó có các dạng thức nào, UTF-8 là gì và tại sao luôn đi đôi với Unicode. Khi tổng hợp nên tài liệu này, để cho đơn giản, tôi đã bỏ qua nhiều khía cạnh hơi phức tạp của Unicode như các đề tài về mã tổ hợp, mã dựng sẵn. Nếu có thiếu sót, mong các bạn thông cảm. Thêm vào đó, bài viết không bàn về cách cài đặt/sử dụng Unicode font trong các hệ điều hành hay phần mềm. Về chuyện này, các bạn có thể tham khảo trang web của Lê Hoàn hay các thư trao đổi về Unicode.
Một vài điều cần lưu ý:
Trong bài viết, tôi chỉ dùng hệ thập lục phân (hệ 16) để chỉ giá trị của các mã. Ví dụ, khi tôi nói kí tự "a" có mã là 61, bạn phải hiểu rằng đây là 61 trong hệ thập lục phân (bằng 97 hệ thập phân). Lí do là trong các bảng mã, các mã thường có dạng thập lục phân chứ ít khi có dạng thập phân.
Ở cuối bài, tôi có một bảng mã Unicode cho các kí tự Việt nam các bạn tham khảo. Nếu muốn xem toàn bộ bảng mã Unicode (dưới dạng file PDF) vào Trong đó, click "Code Charts" và bạn sẽ thấy nhiều "trang mã". Toàn bộ các kí tự tiếng Việt có thể được tìm thấy ở các trang Latin-1 Supplement, Latin Extend A và Latin Extend B, và Latin Extended Additional. Bạn có thể in các trang mã nếu muốn.Cuối cùng, bạn có thể bỏ qua các phần mình đã biết và đi thẳng đến nơi tôi nói về UTF-16, UTF-8. Tuy nhiên, tôi cho rằng nếu bạn hiểu rõ hơn về các bảng mã ASCII và ANSI thì sẽ hiểu rõ hơn sự ra đời và phát triển của Unicode.
Một số định nghĩa hữu ích:
-Bảng mã: Một tập hợp nhiều kí tự khác nhau. Một ví dụ là bảng mã chuẩn ASCII (American Standard Code for Information Interchange - Mã chuẩn Hoa kỳ trong Trao đổi Thông tin) bao gồm 128 kí tự, phần lớn là các kí số, kí tự tiếng Anh, những ký tự đặc biệt và thông dụng như các dấu cộng, trừ, phần trăm... Unicode là một bảng mã chuẩn khác, gồm có hàng ngàn các kí tự gồm tiếng Anh và quốc tế bao gồm cả các kí tự Việt nam. Cũng có một vài bảng mã tiếng Việt (không chuẩn) như TCVN-ABC, VNI, VISCII, chúng chỉ có tối đa là 256 kí tự .
- Mã: Một số nguyên dương đại diện cho một kí tự trong một bảng mã. Mã của một kí tự thay đổi tùy theo bảng mã. Ví dụ, trong bảng mã tiếng Việt TCVN-ABC, kí tự "ầ" có mã C7. Trong bảng tiếng Việt VISCII, "ầ" có mã là A5. Trong bảng Unicode, "ầ" có mã là 1EA7 (=7847 thập phân). Lưu ý là mã của một kí tự cho thấy vị trí của kí tự trong bảng mã. Ví dụ, trong bảng Unicode, "ầ" nằm ở vị trí 7847 . Mỗi kí tự Unicode chỉ được "gắn" một mã duy nhất. Ví dụ, trong Unicode, bạn không thể tìm thấy kí tự "ầ" tại bất kỳ chổ nào khác ngoài vị trí 7847. Các máy tính chỉ biết một kí tự qua mã của nó. Ví dụ, khi bạn đánh Unicode dùng một bộ gõ tiếng Việt và bạn muốn nhập chữ "ầ", bộ gõ tìm cách gửi mã 1EA7 (sau khi đã được mã hóa dưới dạng nhị phân) đến bộ xử lý trung ương của máy tính.
- Font Unicode: Một font được gọi là font Unicode khi nó cung cấp cấu hình của các kí tự trong bảng mã Unicode. Một font file (tập tin font) dùng mã của một kí tự để chỉ định cấu hình cho kí tự đó. Ví dụ, khi phải thể hiện kí tự "ầ" trên màn hình dùng font Arial, phần mềm sẽ lục tìm mã 1EA7 trong font file Arial.ttf và xác định cấu hình tương ứng. Nếu một font như VNI-Times không hổ trợ Unicode, nó sẽ không có cấu hình cho mã 1EA7 vì nó chỉ có mã lớn nhất là FF (=255 thập phân). Vì vậy, nó không thể hiển thị kí tự "ầ" và nó không được gọi là font Unicode. Tương tự như vậy, các font Arial, Times New Roman, Tahoma của các hệ điều hành như Windows 95 hoặc Windows 98 không có cấu hình cho các kí tự Unicode; do đó bạn phải "cập nhật" chúng bằng cách tải và cài đặt các font Unicode với các tên tương tự vào máy nếu bạn muốn đọc mail hay duyệt các web site dùng Unicode font.
- Chuỗi bit: Một chuỗi các số nhị phân, như 01100001. Do máy vi tính chỉ "đọc" được số nhị phân, dữ liệu phải được chuyển đổi thành các chuỗi bit trước khi được nhập vào máy. Mỗi kí số trong một số thập lục phân luôn được biểu diễn bằng bốn 4 số nhị phân. Ví dụ, 6 = 0110, 1 = 0001, F = 1111, 7 = 0111, 61 = 01100001, 7F=01111111.
- Mã hóa (encoding): Cách biểu diễn một kí tự trong dạng một chuỗi bit. Tùy theo cách mã hóa, một kí tự có thể được biểu diễn khác nhau.
"UTF-16" là một kiểu mã hóa các kí tự Unicode trong đó mỗi kí tự được biểu diễn dưới dạng một chuỗi 16-bit tương đương với giá trị của mã. Ví dụ, trong UTF-16, "ầ" được mã hoá thành một chuỗi 16-bit: 0001111010100111 (= 1EA7), tương đương với mã gốc của "ầ" trong bảng Unicode.
"UTF-8" là một kiểu mã hóa khác cho các kí tự Unicode, trong đó mỗi kí tự được biểu diễn dưới dạng MỘT hay NHIỀU chuỗi 8-bit, có thể KHÔNG tương đương với mã gốc. Ví dụ, trong UTF-8, "ầ" được mã hóa thành ba chuỗi 8-bit (cũng có thể gọi là một chuỗi 24 bit) 111000011011101010100111 (= E1BAA7) không tương đương với mã gốc là 1EA7. Tại sao cần UTF-8. Chúng ta sẽ biết sau.
- Giải mã: Sau khi hệ điều hành nhận được một kí tự (ví dụ đọc từ một file) đã được mã hóa, nó phải giải mã để lấy lại mã gốc của kí tự trong bảng mã trước khi vào font file để tìm cấu hình và thể hiện kí tự trên màn hình. Một font file chỉ dùng các mã gốc chứ không dùng dạng đã mã hóa.
Hệ ASCII/ANSI: các hệ điều hành chỉ dùng các bảng mã ASCII hay ANSI. Ví dụ: Windows 95 dùng bảng mã ANSI. Các hệ ASCII và ANSI luôn luôn dùng một đơn vị dữ liệu là 8 bit (1 byte).
QUÁ TRÌNH PHÁT TRIỂN: từ ASCII đến ANSI cho đến Unicode
1. Bảng mã ASCII: 7-bit, cho phép 128 mã (2 mũ 7) Còn có tên khác là ISO 646-IRV. ASCII là bộ mã đầu tiên lúc máy tính được phát minh. Mã cho phép: từ 0 đến 7FMã nhỏ nhất: 0, dùng cho kí tự NUL (null: trống trơn, không có gì).Mã lớn nhất 7F (=thập phân 127, =nhị phân 01111111). Được dùng cho phím DEL (delete-xoá). (lưu ý: mặc dù đơn vị dữ liệu là 8 bit, chỉ có 7 bit cuối được dùng, )
Ví dụ: Trong bảng ASCII, kí tự "a" có mã là 61.Khuyết điểm: chỉ có 128 kí tự được cho phép. Mọi người cần nhiều mã hơn, nhất là sau khi hệ DOS và máy tính cá nhân xuất hiện. Vì vậy, người ta phải nghĩ ra bộ mã ANSI.
2. Bảng mã ANSI : 8-bit, là bảng mã ASCII mở rộng; cho phép 256 mã (2^8).Các tên khác: ISO-8859-1, LATIN-1.Mã cho phép: từ 0 đến FFMã nhỏ nhất: 0, dùng cho kí tự NUL.Mã lớn nhất 255 = FF ( =thập phân 255, =nhị phân 11111111 ) .(lưu ý: tất cả 8 bit trong đơn vị dữ liệu được dùng)
Ví dụ: trong bảng ANSI, kí tự "ô" của tiếng Việt có mã là F4. (các bộ mã tiếng Việt đều dựa trên ANSI với nhiều sửa đổi). Lưu ý: 128 kí tự đầu tiên (các mã từ 0...7F) giống nhau trong ASCII và ANSI.Ví dụ, ký tự "a" có mã là 61 trong cả hai bảng ASCII và ANSI. Nói cách khác, ASCII là tập con của ANSI.
Ưu điểm: số lượng mã cho phép đã được tăng đến 256. Do đó, bây giờ bảng mã có chỗ cho các kí tự khác bên cạnh tiếng Anh. Khuyết điểm: Vẫn chưa đủ chỗ cho các kí tự quốc tế. (Tàu, Hàn Quốc, Ä Rập, Do Thái...,quá nhiều!) Vì vậy, người ta phát minh ra Uni
Các file đính kèm theo tài liệu này:
- Nghiên cứu chuẩn quốc tế về dữ liệu từ điển, xây dựng website tra từ điển theo chuẩn.doc