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

Nội dung gồm có: Chương 1: Cơ sở lý thuyết 1. giới thiệu chung vê từ điển, các loại từ điển 2. Cơ sở lý thuyết về ngôn ngữ C#, ASP.NET, SQL Server 3. Các giải pháp và kỹ thuật xử lý Chương 2: Chuẩn dữ liệu từ điển 1. Dữ liệu từ điển 2. Các chuẩn về dữ liệu từ điển 3. Cách sắp xếp các mục từ chữ cái tiếng việt 4.Dữ liệu dạng file từ ASCII đến Unicode Chương 3: Phân tích thiết kế hệ thống website tra từ điển 1.Khảo sát 2. Phân tích 3. Thiết kế Chương 4: Hoàn thành ứng dụng website tra từ điển KẾT LUẬN TÀI LIỆU THAM KHẢO

doc66 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2699 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu 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
để kết hợp các phần tử đó. Một số những thành phần chủ yếu của ngôn ngữ UML: - Hướng nhìn (view): Hướng nhìn chỉ ra những khía cạnh khác nhau của hệ thống cần phải được mô hình hóa. Một hướng nhìn không phải là một bản vẽ, mà là một sự trừu tượng hóa bao gồm một loạt các biểu đồ khác nhau. Chỉ qua việc định nghĩa của một loạt các hướng nhìn khác nhau, mỗi hướng nhìn chỉ ra một khía cạnh riêng biệt của hệ thống, người ta mới có thể tạo dựng nên một bức tranh hoàn thiện về hệ thống. Cũng chính các hướng nhìn này nối kết ngôn ngữ mô hình hóa với quy trình được chọn cho giai đoạn phát triển. - Biểu đồ (diagram): Biểu đồ là các hình vẽ miêu tả nội dung trong một hướng nhìn. UML có tất cả 9 loại biểu đồ khác nhau được sử dụng trong những sự kết hợp khác nhau để cung cấp tất cả các hướng nhìn của một hệ thống. - Phần tử mô hình hóa (model element): Các khái niệm được sử dụng trong các biểu đồ được gọi là các phần tử mô hình, thể hiện các khái niệm hướng đối tượng quen thuộc. Ví dụ như lớp, đối tượng, thông điệp cũng như các quan hệ giữa các khái niệm này, bao gồm cả liên kết, phụ thuộc, khái quát hóa. Một phần tử mô hình thường được sử dụng trong nhiều biểu đồ khác nhau, nhưng nó luôn luôn chỉ có một ý nghĩa và một kí hiệu. - Cơ chế chung: Cơ chế chung cung cấp thêm những lời nhận xét bổ sung, các thông tin cũng như các quy tắc ngữ pháp chung về một phần tử mô hình; chúng còn cung cấp thêm các cơ chế để có thể mở rộng ngôn ngữ UML cho phù hợp với một phương pháp xác định (một quy trình, một tổ chức hoặc một người dùng). 1.2.3.2. Một số biểu đồ chính của UML Biểu đồ Use-Case (Use Case Diagram) Biểu đồ Use case chỉ ra một số lượng các tác nhân ngoại cảnh và mối liên kết của chúng đối với Use case mà hệ thống cung cấp (hình 1.2). Một Use case là một lời miêu tả của một chức năng mà hệ thống cung cấp. Lời miêu tả Use case thường là một văn bản tài liệu, nhưng kèm theo đó cũng có thể là một biểu đồ hoạt động. Các Use case được miêu tả duy nhất theo hướng nhìn từ ngoài vào của các tác nhân (hành vi của hệ thống theo như sự mong đợi của người sử dụng), không miêu tả chức năng được cung cấp sẽ hoạt động nội bộ bên trong hệ thống ra sao. Các Use case định nghĩa các yêu cầu về mặt chức năng đối với hệ thống. Hình 1.2: Ví dụ về biểu đồ UseCase Biểu đồ lớp Biểu đồ lớp mô tả cấu trúc tĩnh của hệ thống, thể hiện các phần hệ thống xử lý được. UML thể hiện lớp bằng hình chữ nhật có 3 phần: Phần thứ nhất chứa tên lớp. Trong phần thứ hai là thuộc tính và các dữ liệu thành phần của lớp. Trong phần thứ ba là các phương thức hay hàm thành phần của lớp. Biểu đồ trình tự Biểu đồ trình tự minh họa các đối tượng tương tác với nhau ra sao. Chúng tập trung vào các chuỗi thông điệp, có nghĩa là các thông điệp được gửi và nhận giữa một loạt các đối tượng như thế nào. Biểu đồ trình tự có hai trục: trục nằm dọc chỉ thời gian, trục nằm ngang chỉ ra một tập hợp các đối tượng tại một thời điểm nào đó trong quá trình thực thi của hệ thống. Biểu đồ cộng tác Một biểu đồ cộng tác miêu tả tương tác giữa các đối tượng cũng giống như biểu đồ trình tự, nhưng nó tập trung trước hết vào các sự kiện, tức là tập trung chủ yếu vào sự tương tác giữa các đối tượng, còn biểu đồ trình tự tập trung thể hiện sự tương tác giữa các đối tượng theo trình tự thời gian. Biểu đồ trạng thái Biểu đồ trạng thái thể hiện những khía cạnh mà ta quan tâm tới khi xem xét trạng thái của một đối tượng: - Trạng thái ban đầu. - Một số trạng thái ở giữa. - Một hoặc nhiều trạng thái kết thúc. - Sự biến đổi giữa các trạng thái. - Những sự kiện gây nên sự biến đổi từ một trạng thái này sang trạng thái khác Các giải pháp và kỹ thuật xử lý khi xây dựng chương trình Xử lý dữ liệu Để xử lý file dữ liệu từ điển, chúng ta cần nghiên cứu namepace System.IO, bao gồm các công cụ ghi file, mở file, đổi tên file… Đối với các thao tác ghi file có 3 loại: File text dùng StreameReader, StreanWriter (để làm việc với file dict.tab) Đối với file nhị phân dùng BinaryStream, chạy trên stream cơ bản. Stream là cái tổng quát nhất, có thể dùng thay thế cả hai cái trên. Trong Stream cần chú ý: + position: cho biết vị trí con trỏ văn bản hiện hành + seek: nhảy đến vị trí trong văn bản, cú pháp(pos, seekOrigin), trong đó pos là kiểu long xác định vị trí nhảy, seekOrigin là mốc nhảy. VD: seek(-1,seekOrigin): nhảy từ cuối file về 1 byte Thuật toán tìm kiếm nhị phân Có rất nhiề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\n3 b 4\\5\n6 c 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 7F Mã 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 FF Mã 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 Unicode 16-bit. Bảng mã Unicode 16-bit: Cho phép 65536 mã. (2 mũ 16) Các tên khác: ISO-14646, UCS-2. Mã cho phép: từ 0 đến FFFF  Mã nhỏ nhất: 0, dùng cho NUL Mã lớn nhất 65535 =  FFFF (= thập phân  65535, = nhị phân 1111111111111111 ) Ví dụ: trong bảng Unicode,  kí tự "â`" của tiếng Việt có mã là 1EA7. Lưu ý: 256 kí tự đầu tiên (các mã từ 0...255= FF) giống nhau trong ANSI và Unicode. Ví dụ, ký tự "a" có mã là  61 trong cả ba bảng ASCII và ANSI và Unicode. Nói cách khác, ANSI (cũng như ASCII) là tập con của Unicode. Ưu điểm: đủ chỗ chứa toàn bộ các kí tự của các dân tộc trên thế giới. Khuyết điểm: Hầu hết các máy tính vẫn còn dùng bộ mã ASCII, do đó chúng không nhận ra các mã lớn hơn 7F. Và còn một vấn đề lớn hơn là, các hệ ASCII và ANSI, vốn chỉ xử lý dữ liệu theo từng chuỗi 8-bit, sẽ lầm lẫn khi xử lý các kí tự Unicode được mã hóa dưới dạng 16-bit (UTF-16). Các hệ ASCII/ANSI sẽ diễn dịch MỘT kí tự Unicode 16-bit thành HAI kí tự 8-bit. Ví dụ, kí tự "a" dạng 16-bit sẽ được dịch thành HAI kí tự: kí tự thứ nhất là NUL (00000000), và kí tự thứ hai là kí tự ASCII "a" (01100001). Chẳng hạn, khi bạn muốn thể hiện hàng chữ : "ABCDEF" được mã hóa UTF-16, có khả năng bạn sẽ nhìn thấy " A B C D E F" trên màn hình. (trên màn hình, các kí tự NUL có thể được thể hiện thành các ô trống hay là các ô vuông, tùy theo máy). Vấn đề này cần phải được giải quyết. Chúng ta vẫn muốn dùng bảng mã Unicode nhưng cần mã hoá các kí tự theo cách nào đó mà các hệ ASCII có thể nhận ra các kí tự của chúng ta. Cách mã hoá UTF-16 rõ ràng là có vấn đề cho các hệ điều hành phổ biến hiện nay vẫn đang dùng chuẩn ASCII/ANSI. Ðó là lý do người ta sáng chế ra cách mã hoá UTF-8. Nguyên tắc mã hoá UTF-8: Một kí tự Unicode sẽ được mã hóa thành một hay nhiều chuỗi 8-bit để các hệ ASCII hay ANSI có thể nhận diện. Ðể tương thích với ASCII, các kí tự Unicode thuộc bảng mã ASCII (mã từ 0 đến 7F) được mã hóa thành một chuỗi 8-bit tương đương với giá trị nhị phân của mã. Vì bảng ASCII chỉ có thuần các kí tự tiếng Anh, điều này cũng có nghĩa là các hệ ASCII có thể đọc các văn bản tiếng Anh viết bằng Unicode UTF-8 một cách dễ dàng, không cần phải chuyển đổi gì. Tất cả các kí tự Unicode có mã lớn hơn  7F được mã hoá thành HAI hoặc BA chuỗi 8-bit (byte) phù hợp với nguyên tắc trong bảng phía dưới. Trong UTF-8, byte đầu tiên của một kí tự Unicode sẽ chỉ định có bao nhiêu byte đi kèm theo dành cho kí tự đó. Như vậy nếu một hệ ASCII/ ANSI sau khi đọc được byte thứ nhất của một kí tự UTF-8 thì sẽ biết có bao nhiêu byte đi kèm cho kí tự đó. Ðiều này giúp cho nó trong việc giải mã (để lấy trở lại mã Unicode) cho kí tự.Dưới đây là hai bảng mã hoá UTF-16 và UTF-8 cho các kí tự Unicode. Trong cáccbảng, một chữ "x", "y" hoặc "z" có thể là một bit 0 hoặc một bit 1. Bảng A: Cho mã có giá trị từ 0 đến  7F (các kí tự ASCII): mã                    UTF-16                           UTF-8 ----               --------------------                     -----------                  byte 1     byte 2 0-7F      00000000  0xxxxxxx              0xxxxxxxx Bảng B: cho mã từ hex 80 trở lên: mã                        UTF-16                                   UTF-8 -------                -------------------                    -------------------------------                      byte 1      byte 2              byte 1       byte 2        byte 3 80-7FF       00000yyy  yyxxxxxx        110yyyyy  10xxxxxx 800-FFFF  zzzzyyyy   yyxxxxxx        1110zzzz  10yyyyyy   10xxxxxx Theo bảng A: Nếu mã nhỏ hơn hoặc bằng 7F thì được mã hoá thành 8-bit tương đương với dạng nhị phân của mã. Theo bảng B: Nếu mã lớn hơn 7F và nhỏ hơn hoặc bằng 7FF thì được mã hoá thành 2 chuỗi 8-bit. Nếu mã lớn hơn 7FF thì được mã hoá thành 3 chuỗi 8-bit. Ví dụ: Mã hoá kí tự Unicode tiếng Việt "ầ" (mã = 1EA7) dùng UTF-8: Ðầu tiên viết mã thành 1 chuỗi 16-bit (UTF-16): 0001111010100111 tương đương với 1EA7. Cắt chuỗi 16-bit thành hai byte: byte 1 là: 00011110 và byte 2 là: 10100111. 1EA7 lớn hơn 7FF và nhỏ hơn FFFF. Theo bảng trên, dùng dòng cuối cùng để chuyển đổi (nghĩa là dạng mã hóa UTF-8 của bạn cho kí tự "ầ" sẽ có 3 chuỗi 8-bit (3-byte) . Đối chiếu với byte 1 và byte 2 trong dòng cuối của cột UTF-16, bạn sẽ có: zzzz = 0001; yyyyyy = 111010; và xxxxxx = 100111. Đối chiếu với byte 1 và byte 2 trong dòng cuối của cột UTF-8, bạn sẽ có dạng UTF-8: byte 1 là: 1110zzzz = 11100001 (=E1) byte 2  là: 10yyyyyy = 10111010 (= BA) byte 3 là: 10xxxxxx = 10100111 (=A7) Tổng hợp lại, kí tự "ầ" đã được mã hóa dưới dạng UTF-8 là: E1BAA7. Lưu ý rằng bây giờ bạn có 3 byte cho kí tự ầ, khác với kí tự gốc chỉ có 2 byte. Nếu bạn theo nguyên tắc trên, bạn có thể viết các trình mã hoá/giải mã UTF-8 cho hệ thống của mình. Bảng Unicode cho các kí tự Việt Nam. 225  a'    224  a`   7843 a?    227   a~    7841 a.    7855 a(' a(` a(? a(~.    7857    7859    7861    7863    7845 a^' a^` a^? a^~ a^.    7847    7849    7851    7853    250  u' u` u? u~ u.    249    7911    361    7909    7913 u*' u*` u*? u*~ u*.    7915    7917    7919    7921    233  e' e` e? e~ e.    232    7867    7869    7865    7871 e^' e^` e^?  e^~  e^.    7873    7875    7877    7879    243 o' o` o?  o~  o.    242    7887    245    7885    7889 o^' o^` o^?  o^~  o^.    7891    7893 7895    7897    7899 o*' o*` o*?  o*~  o*.    7901    7903    7905    7907    237 i' i` i?  i~  i.    236    7881    297    7883    253 y' y` ...    7923    7927    7929    7925 259 a( a^ u* e^ o* o^    226    432    234    417    244    273 d-    193 A'   A`   A?   A~  A.    192    7842    195    7840 7854  A('  A(`  A(?  A(~  A(.    7856    7858    7860    7862    7844  A^'  A^`  A^?  A^~  A^.    7846    7848    7850    7852     218  U'  U`  U?  U~  U.     217    7910    360    7908    7912  U*'  U*` U*?   U*~   U*.    7914   7916 7918   7920   201   E'  E`  E?  E~  E.   200  7866  7868  7864  7870  E^  E^  E^  E^   E^  7872  7874  7876  7878  211  O'  O`  O?  O~  O.  210  7886  213  7884  7888 O^'  O^`  O^?  O^~  O^.  7890 7892  7894  7896  7898 O*' O*` O*?  O*~  O*.  7900  7902  7904  7906  205 I'  I`  I?  I~  I.  204  7880  296  7882  221  Y'  Y`  Y?  Y~  Y.  7922  7926  7928  7924  258   A(   A^   U*   E^    O*   O^  195  431  202  416  212  208  D- Hinh 2.9: Bảng Unicode cho các kí tự Việt Nam CHƯƠNG 3 PHÂN TÍCH THIẾT KẾ HỆ THỐNG WEBSITE TRA TỪ ĐIỂN 3.1. Khảo sát hệ thống website tra từ điển Nhiệm vụ cơ bản Hệ thống website tra từ điển phải đảm bảo được các chức năng chính của nó, đó là: -Tra từ, nghĩa của từ được hiển thị rõ ràng. Có chức năng phát âm cho từ Tốc độ tra từ nhanh và chính xác Mục đích chính của hệ thống là chức năng tra từ điển. Người dùng có thể đăng nhập hoặc không cần đăng nhập để tra từ. Quy trình xử lý Để xây dựng hệ thống tra từ điển, vấn đề quan trọng nhất của giai đoạn này là thu thập cơ sở dữ liệu. Các file dữ liệu sẽ được lưu trữ theo định dạng. Sau khi thu thập dữ liệu nghiên cứu cách xử lý file. Định hướng các chức năng cho hệ thống, phân tích tìm hiểu các nhu cầu của người dùng hiện nay để đưa thêm một số chức năng vào website. Phân tích hệ thống Mô hình hóa trường hợp sử dụng (Mô hình Use-Case) Xác định danh sách tác nhân và các ca sử dụng Hệ thống này bao gồm 2 tác nhân đó là người dùng (User) và Admin Người dùng: tác nhân này tham gia vào chương trình chủ yếu là tìm kiếm ngữ nghĩa của từ cần tra, nge phát âm từ, tìm kiếm từ gần đúng. Ngoài ra còn có thể thực hiện các chức năng khác như thảo luận cùng các user khác, có thể kiểm tra vốn từ vựng của mình hay góp ý với Admin về hệ thống. Nhưng để thực hiện được các chức năng này thì User phải đăng nhập vào hệ thống, trước khi đăng nhập thì đăng ký thành viên. Admin: Ngoài những chức năng như của tác nhân người dùng thì chức năng chính của Admin là quản lý thông tin người dùng. Sau đây là danh sách các ca sử dụng của các tác nhân: Tác nhân Use-Case Người dùng (User) Đăng ký Đăng nhập Quên mật khẩu Tra từ Nge phát âm Thảo luận Góp ý Admin Quản lý thông tin User Quản lý bài viết của User Bảng 3.1: Danh sách các Use Case Mô hình Use-Case Mô hình Use-Case của tác nhân User Hình 3.2: Mô hình Use-Case cho tác nhân User Mô hình Use-Case cho tác nhân Admin Hình 3.3: Mô hình Use-Case cho tác nhân Admin Đặc tả một số Use-Case chính Đặc tả một số Use-Case của tác nhân người dùng Use-Case Đăng Ký: Mục đích: Đăng ký tài khoản vào hệ thống để thực hiện các chức năng yêu cầu có tài khoản. Tác nhân: Người dùng (User). Luồng sự kiện chính: Khởi động hệ thống Click chuột vào mục đăng ký Hệ thống hiển thị form đăng ký User nhập các thông tin yêu cầu vào form đăng ký Click vào nút Đăng Ký để hoàn thành đăng ký Luồng sự kiện phụ: Hệ thống kiểm tra thông tin đăng ký. Đăng ký bị lỗi nếu thông tin tài khoản bị trùng hay thông tin cá nhân thiếu Hệ thống hiển thị thông báo lỗi. User có thể về đầu của luồng sự kiện chính hay hủy bỏ việc đăng ký. Use-Case Đăng Nhập và sửa thông tin cá nhân: Mục đích: Đăng nhập vào hệ thống bởi tài khoản đã được đăng ký và có thể thay đổi thông tin cá nhân của mình theo ý muốn Tác nhân: User Luồng sự kiện chính: Từ trang chủ của website, chọn chức năng đăng nhập. Hệ thống hiển thị form đăng nhập User nhập các thông tin và nhấn Đăng nhập để xác nhận Hệ thống sẽ kiểm tra thông tin User và hiển thị kết quả. Đăng nhập thành công hệ thống sẽ chuyển đến trang thông tin cá nhân cho phép User xem và sửa thông tin. Luồng sự kiện phụ: Nếu người dùng nhập sai tên đăng nhập hoặc mật khẩu, hệ thống sẽ hiển thị một thông báo lỗi. Người dùng có thể chọn trở về đầu luồng sự kiện chính hoặc hủy bỏ việc đăng nhập. Use-Case Tra Từ, nge phát âm: Mục đích: Tìm kiếm nghĩa của từ và nge cách phát âm của từ được tra. Tác nhân: User Luồng sự kiện chính: Chọn chức năng tra từ hoặc trang chủ mặc định bởi chức năng ta từ. Chọn loại từ điển cần tra Gõ từ cần tra vào textbox Click vào button Tra từ Hệt thống sẽ tìm kiếm nghĩa của từ và hiển thị nghĩa Luồng sự kiện phụ: Nếu từ cần tìm được nhập không chính xác hệ thống sẽ thông báo không tìm thấy và sẽ đưa ra một số từ gợi ý mà có thể bạn cần tìm. Nếu muốn nge phát âm của từ thì click vào button speaker để nge. Use-Case Thảo Luận Mục đích: Giúp người dùng trao đổi, thảo luận với nhau về nghĩa của các từ không tìm thấy trong từ điển. Đó cũng là 1 cách học tiếng anh rất tốt. Tác nhân: User Luồng sự kiện chính: Chọn chức năng thảo luận. Hệ thống hiển thị site thảo luận. User nhập nội dung vào form text để tham gia thảo luận. Click vào nút Gửi để đăng nội dung thảo luận của mình. Luồng sự kiện phụ: Hệ thống sẽ thông báo lỗi nếu người dùng chưa đăng nhập vào hệ thống. User có thể quay về chức năng đăng nhập để đăng nhập vào hệ thống và tham gia thảo luận hoặc không tham gia thảo luận mà chỉ xem thông tin. Use-Case Lấy Mật Khẩu Mục đích: Giúp User có thể lấy lại mật khẩu của mình trong trường hợp quên mật khẩu. Tác nhân: User Luồng sự kiện chính: User chọn chức năng quên mật khẩu Hệ thống hiển thị chức năng quên mật khẩu. Người dùng gõ email đã đăng ký vào ô textbox. Hệ thống sẽ gửi thông tin về tên đăng nhập và mật khẩu vào email đó của người dùng. Luồng sự kiện phụ: Nếu người dùng nhập email không chính xác với email đã đăng ký trước đó thì hệ thống sẽ thông báo lỗi. Người dùng có thể nhập lại email để tiếp tục truy vấn hoặc có thể hủy bỏ. UC Góp ý Mục đích: Tiếp thu ý kiến đóng góp của User Tác nhân: User Luồng sự kiện chính: Người dùng chọn chức năng Góp ý Hệ thống hiển thị form góp ý. User nhập vào tiêu đề và nội dung góp ý để gửi. Click vào nút Gửi góp ý để gửi. Luồng sự kiện phụ: Hệ thống sẽ thông báo lỗi khi gửi nếu User chưa đăng nhập vào hệ thống. User quay về chức năng đăng nhập để được góp ý, hoặc hủy bỏ thao tác góp ý. Nếu User đã đăng nhập thì nội dung góp ý sẽ được hiển thị lên website. Đặc tả một số Use-Case của chức năng Admin Use-Case Đăng nhập của Admin Mục đích: Mô tả cách thức Admin đăng nhập vào trang quản trị với quyền đăng nhập tương ứng. Luồng sự kiện chính: Truy cập vào trang đăng nhập. Nhập tên đăng nhập và passwork để đăng nhập vào hệ thống. Luồng sự kiện phụ: Nếu Admin nhập không đúng tên đăng nhập và password thì hệ thống sẽ thông báo lỗi và yêu cầu nhập lại. UC Quản lý thông tin của User Mục đích: UC này mô tả cách thức Admin quản lý người dùng của hệ thống. Luồng sự kiện chính: Từ trang quản trị, Admin nhấn vào mục quản lý người dùng. Hệ thống hiển thị trang quản lý người dùng, Admin chọn chức năng phù hợp. Sau khi đã chắc chắn về lựa chọn của mình, Admin xác nhận. Hệ thống sẽ hiển thị thông báo kết quả. Luồng sự kiện phụ: Nếu Admin nhập thông tin không chính xác, hệ thống sẽ thông báo lỗi tương ứng với những sai sót của Admin. UC quản lý bài viết của người dùng Mục đích: Mô tả cách thức Admin quản lý các bài viết như thảo luận, góp ý của người dùng Tác nhân: Admin Luồng sự kiện chính: Từ trang quản trị Admin nhấn vào mục quản lý bài viết. Admin kiểm tra các bài viết của User, nếu nội dung bài viết không lành mạnh và không phù hợp thì có thể bị xóa đi. Hệ thống sẽ cập nhật lại những thay đổi của Admin đối với user đó trong database. Mô hình hóa tương tác đối tượng Đặc tả UC “Đăng ký” của User Biểu đồ trình tự: Hình 3.4: Biểu đồ trình tự đặc tả UC “Đăng ký” Biểu đồ cộng tác: Hình 3.5: Biểu đồ cộng tác của UC “Đăng ký” Đặc tả UC “Đăng nhập và sửa thông tin” của User Biểu đồ trình tự: Hình 3.6: Biểu đồ trình tự của UC “Đăng nhập và sửa thông tin” Biểu đồ cộng tác: Hình 3.7: Biểu đồ cộng tác của UC “Đăng nhập và sửa thông tin” Đặc tả Use-Case “Quên mật khẩu” của User Biểu đồ trình tự: Hình 3.8: Biểu đồ trình tự của UC “Quên mật khẩu Biểu đồ cộng tác: Hình 3.9: Biểu đồ cộng tác UC “Quên mật khẩu” Đặc tả UC “Tra từ và nge phát âm” của User Biểu đồ trình tự: Hình 3.10: Biểu đồ trình tự UC “Tra từ và nge phát âm” Biểu đồ cộng tác: Hình 3.11: Biểu đồ cộng tác UC “Tra từ và nge phát âm” Đặc tả Use-Case “Thảo luận” Biểu đồ trình tự: Hình 3.12: Biểu đồ trình tự UC “Thảo Luận” Biểu đồ cộng tác: Hình 3.13: Biểu đồ cộng tác UC “Thảo Luận” Đặc tả Use-Case “Góp ý” Biểu đồ trình tự: Hình 3.14: Biểu đồ trình tự UC “Góp Ý” Biểu đồ cộng tác: Hình 3.15: Biểu đồ cộng tác UC “Góp Ý” Đặc tả Use-Case “Đăng nhập” của Admin Biểu đồ trình tự: Hình 3.16: Biểu đồ trình tự UC “Đăng nhập của Admin” Biểu đồ cộng tác: Hình 3.17: Biểu đồ cộng tác UC “Đăng nhập của Admin” Đặc tả Use-Case “Quản lý thông tin User” của Admin Biểu đồ trình tự: Hình 3.18: Biểu đồ trình tự UC “Quản lý thông tin User” của Admin Biểu đồ cộng tác: Hình 3.19: Biểu đồ cộng tác UC “Quan ly thông tin User” của Admin Mô hình đối tượng: Biểu đồ lớp thực thể Từ việc khảo sát hệ thống và từ các biểu đồ trình tự luồng sự kiện của các Use-Case ở trên ta tìm ra các lớp thực thể của hệ thống bao gồm các thuộc tính và liên kết giữa các lớp: Hình 3.20: Biểu đồ lớp Mô hình hóa hành vi: Biểu đồ hoạt động của hệ thống Hình 3.21: Biểu đồ hoạt động của hệ thống Thiết kế hệ thống Thiết kế các bảng dữ liệu Bảng Account: Thuộc tính Kiểu dữ liệu Diễn giải Ràng buộc username Varchar(100) Tên đăng nhập của User Khóa chính pass Varchar(100) Mật khẩu quyen Varchar(20) Quyền người dùng email Varchar(150) Email của user hoten Nvarchar(100) Họ tên trangthai Int Trạng thái ngaydangky Datetime Ngày đăng ký Bảng LoaiTuDien: Thuộc tính Kiểu dữ liệu Diễn giải Ràng uộc loaitudien Varchar(50) Ký hiệu tên từ điển Khóa chính diengiai Nvarchar(50) Diễn giải tên TĐ Bảng TuDien: Thuộc tính Kiểu dữ liệu Diễn giải Ràng buộc id Int Số thứ tự Khóa chính loaitudien Varchar(50) Tên loại từ điển Khóa ngoài filetu Varchar(max) Tên file chứa từ filenghia Varchar(max) Tên file chứa nghĩa Bảng ThaoLuan: Thuộc tính Kiểu dữ liệu Diễn giải Ràng buộc id Int Số thứ tự Khóa chính username Varchar(100) Tên đăng nhập của user Khóa ngoài noidung Text Nội dung ngaygui Datetime Ngày gửi Bảng GopY: Thuộc tính Kiểu dữ liệu Diễn giải Ràng buộc id Int Số thứ tự Khóa chính username Varchar(100) Tên đăng nhập của User Khóa ngoài tieude Nvarchar(150) Tiêu đề noidung Text Nội dung ngaygui Datetime Ngày gửi ô hình quan hệ cơ sở dữ liệu Hình 3.22: Mô hình hóa quan hệ dữ liệu CHƯƠNG 4 HOÀN THÀNH ỨNG DỤNG WEBSITE TRA TỪ ĐIỂN 4.1. Các thành phần giao diện cơ bản Trang chính, giới thiệu website tra từ Tra từ với hình minh họa Mỗi từ được tra sẽ hiển thị kèm theo hình minh họa cho từ đó. Giao diện đăng ký Giao diện đăng nhập Trang thông tin cá nhân Sau khi đăng nhập, hệ thống sẽ tự động chuyển đến trang cá nhân của User Giao diện trang Thảo luận Chức năng nay giúp người dùng trao đổi, thảo luận những câu, từ, đoạn văn tiếng Anh mà không thể tra cứu bởi từ điển. Người dùng phải đăng nhập mới có thể thảo luận Site Góp Ý Người dùng phải đăng nhập vào hệ thống mới dùng được chức năng này. Site Room Chat tiếng Anh 4.2. Cài đặt ứng dụng Các công cụ và môi trường được sử dụng: Môi trường lập trình: .NET Framwork Ngôn ngữ: ASP.NET, C# Môi trường cài đặt ứng dụng: Micorosoft Windows. Ngoài ra còn sử dụng các thư viện có sẵn hỗ trợ cho cả việc phát âm tiếng Anh và tiếng Việt như Microsoft Speech SDK 5.1 Để đưa ứng dụng lên host ta có thể dùng các web hỗ trợ up host free hoặc có thể trả tiền để mua tên miền và sử dụng trên Internet. KẾT LUẬN Trong quá trình thực hiện đề 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”, em đã thu được những kết quả sau: - Củng cố lại được nhiều kiến thức về C#, .NET - Tìm hiểu được quy trình xây dựng một ứng dụng từ điển trên máy. - Biết được kiến thức về chuẩn dữ liệu từ điển, hiểu được cách thức tổ chức file dữ liệu, cách mở file, đọc file, ghi file,… - Tìm hiểu công nghệ phát âm Text To Speech của Microsoft. - Áp dụng thuật toán tìm kiếm nhị phân vào việc tìm kiếm từ trong từ điển. - Xây dựng được ứng dụng website tra từ điển Anh – Việt, có phát âm và tìm kiếm nâng cao. Các chức năng như Thảo luận, chát tiếng anh, góp ý. Tuy nhiên do hạn chế về thời gian cũng như kinh nghiệm nên chương trình của e vẫn còn thiếu sót như: chưa đưa được nhiều bộ dữ liệu vào, chưa có khả năng tra đoạn văn bản, tra từ đồng nghĩa, từ trái nghĩa… Với những kết quả đạt được em sẽ tiếp tục hoàn thiện chương trình này hơn nữa, bổ xung nhiều từ điển hơn, thêm nhiều tính năng tra từ để có thể đưa ra sử dụng trên Internet. TÀI LIỆU THAM KHẢO Tiếng Việt: [1]. Bùi Đức Tiến, Ebook làm từ điển với phần mềm Spdict. [2]. Nguyễn Ngọc Bình Phương, Thái Thanh Phong, Giải pháp C#, Nhà xuất bản Giao thông vận tải. [3]. Phương Lan, Hoàng Đức Hải, Lập trình Windows với C#.NET, Nhà xuất bản Lao động – xã hội. [4]. Phạm Hữu Khang, Kỹ Thuật Lập Trình Ứng Dụng C#.net Toàn tập,Tập 3, NXB Lao Động Xã hội, năm 2002. [5].Đặng Văn Đức, Phân tích thiết kế hướng đối tượng bằng UML (thực hành với Rational Rose), NXB Giáo dục. Các website tham khảo: Diễn đàn công nghệ: Trang download dữ liệu từ điển: Tra từ online: DANH MỤC CÁC BẢNG, HÌNH VẼ Bảng 1.1: Các kiểu dữ liệu trong C# 11 Hình 1.2: Ví dụ về biểu đồ UseCase 15 Hình 2.1: Định dạng của file AnhViet.txt 20 Hình 2.2: Định dạng dict.org của file anhviet.index 22 Hình 2.3: Định dạng dict.org của file anhviet.dict 22 Hình 2.4: Cấu trúc file dữ liệu chuẩn Spdict 24 Hình 2.5: Bảng tập các ký tự tiếng Việt có dấu 29 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 30 Hình 2.7: Minh họa cách sử dụng biên dưới 30 Hình 2.8: Minh họa cách sử dụng biên trên 31 Bảng 3.1: Danh sách các Use Case 41 Hình 3.2: Mô hình Use-Case cho tác nhân User 41 Hình 3.3: Mô hình Use-Case cho tác nhân Admin 42 Hình 3.4: Biểu đồ trình tự đặc tả UC “Đăng ký” 46 Hình 3.5: Biểu đồ cộng tác của UC “Đăng ký” 47 Hình 3.6: Biểu đồ trình tự của UC “Đăng nhập và sửa thông tin” 47 Hình 3.7: Biểu đồ cộng tác của UC “Đăng nhập và sửa thông tin” 48 Hình 3.8: Biểu đồ trình tự của UC “Quên mật khẩu 48 Hình 3.9: Biểu đồ cộng tác UC “Quên mật khẩu” 49 Hình 3.10: Biểu đồ trình tự UC “Tra từ và nge phát âm” 49 Hình 3.11: Biểu đồ cộng tác UC “Tra từ và nge phát âm” 50 Hình 3.12: Biểu đồ trình tự UC “Thảo Luận” 50 Hình 3.14: Biểu đồ trình tự UC “Góp Ý” 51 Hình 3.15: Biểu đồ cộng tác UC “Góp Ý” 52 Hình 3.16: Biểu đồ trình tự UC “Đăng nhập của Admin” 52 Hình 3.17: Biểu đồ cộng tác UC “Đăng nhập của Admin” 53 Hình 3.18: Biểu đồ trình tự UC “Quản lý thông tin User” của Admin 53 Hình 3.19: Biểu đồ cộng tác UC “Quan ly thông tin User” của Admin 54 Hình 3.20: Biểu đồ lớp 54 Hình 3.21: Biểu đồ hoạt động của hệ thống 55 Hình 3.22: Mô hình hóa quan hệ dữ liệu 58

Các file đính kèm theo tài liệu này:

  • docNghiê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