Hạn nộp bài: 23:59' ngày thứ Sáu 5/10/2012.
Ngôn ngữ viết dùng cho SMS, comment, blog, chat... có rất nhiều kiểu viết không theo như chính tả được quy định trong từ điển. Chẳng hạn đối với tiếng Việt có một số hình thức như:
1. Viết tắt (vd. ko thay cho không),
2. Ghi âm phương ngữ (vd. iu thay cho yêu),
3. Không bỏ dấu (vd Anh dang hoc thay cho Anh đang học).
...
Để có thể dùng loại văn bản này cho các tác vụ xử lý tự động thông thường đối với văn bản ngôn ngữ, chẳng hạn như tổng hợp tiếng nói, dịch máy, lọc ngữ nghĩa, cần có bước chuẩn hóa chính tả.
Chủ đề của bài tập này là xây dựng một thư viện nhỏ phục vụ công việc chuẩn hóa tiếng Việt và thử nghiệm thư viện đó.
Thư viện được đặt trong các lớp có tên SpellChecker và Rule.
SpellChecker có các phương thức sau:
boolean loadRuleBase(String filename)
nạp các quy tắc từ một file và hủy các quy tắc đã nạp trước đó nếu có. Nội dung của file là các quy tắc chuẩn hóa (ví dụ: ko thay bằng không, iu thay bằng yêu) theo định dạng như sau: Mỗi quy tắc nằm trên 1 dòng với cú pháp: <in>:<space><out>trong đó, <in> là một chuỗi kí tự không chứa dấu hai chấm ":"; <space> chỉ bao gồm đúng 01 kí tự space; <out> là chuỗi kí tự kéo dài cho đến hết dòng. Trong mỗi file không có hai dòng nào có phần in giống nhau. Khi chạy chương trình, file này được đảm bảo chứa toàn dữ liệu đúng định dạng, bạn không cần phải kiểm tra. Trong hoặc sau khi nạp, cần sắp xếp danh sách các quy tắc theo thứ tự giảm dần. Xem mô tả về lớp Rule để biết về quan hệ lớn hơn/nhỏ hơn giữa các quy tắc.
String fix(String input)
chuẩn hóa xâu input theo các quy tắc đã nạp, trả về kết quả là xâu đã chuẩn hóa. Thuật toán rất đơn giản: duyệt từng quy tắc đã nạp, với mỗi quy tắc, áp dụng cho xâu input cho đến khi không thể áp dụng được quy tắc đó nữa. Với các bộ quy tắc phức tạp, thứ tự áp dụng quy tắc có thể dẫn đến các kết quả chuẩn hóa khác nhau. Ở đây, ta duyệt theo thứ tự đã được sắp xếp khi nạp file.
Rule: mỗi đối tượng Rule đại diện cho một quy tắc chuẩn hóa. Mỗi đối tượng SpellChecker có một danh sách quy tắc. Với các bộ quy tắc phức tạp, thứ tự thực hiện khác nhau có thể dẫn đến các kết quả khác nhau với chất lượng khác nhau. Do đó cần có một thứ tự ưu tiên thực hiện giữa các quy tắc và danh sách quy tắc nói trên cần được sắp thứ tự. Trong bài này, ta dùng một thứ tự ưu tiên đơn giản sau: Giữa mỗi cặp quy tắc (in, out), có một quan hệ sắp thứ tự, gọi tên là "lớn hơn"/"nhỏ hơn" được định nghĩa như sau:
SpellCheckerTest: Thư viện SpellChecker trên không phải là một chương trình sẵn sàng để chạy. Để thử nghiệm thư viện, sau khi thu bài, giáo viên sẽ dùng một chương trình test chức năng fix của thư viện SpellChecker của bạn theo các bộ test có dạng như sau: Mỗi bộ test (test set) gồm 1 file chứa quy tắc chính tả (như định dạng ở trên, kèm theo là các cặp input/output của các trường hợp test trong bộ đó. Bạn cũng cần tự viết một chương trình SpellCheckerTest và thiết kế dữ liệu test cũng như cách test để tự kiểm thử SpellChecker trước khi nộp bài. Cần thiết kế và thực hiện tổng cộng ít nhất 10 test case trong các bộ test. Yêu cầu tối thiểu là test chức năng fix, nhưng cố gắng phủ tất cả các trường hợp, và lưu ý thông qua việc test SpellChecker.fix để test cả các lớp khác và các phương thức khác.
Ví dụ về một bộ test phương thức fix() của SpellChecker cùng với file quy tắc RULES.DAT
File RULES.DAT:
e: em a: anh b h: bây giờ b: nhưng h: giờ k: không j`: gì dc: được uh: ừCác test case
STT | Input | Output | Ghi chú |
1 |
bao h e di dc ? | bao giờ em di được ? | Test này kiểm tra trường hợp đơn giản, không ảnh hưởng thứ tự sắp xếp. Chú ý có dấu cách giữa dc và ? thì mới đọc riêng được từ 'dc'. |
2 |
b h la may h? | bây giờ la may h? | quy tắc "b h" lớn hơn quy tắc "b" nên được xét áp dụng trước. Test này kiểm tra việc sắp xếp thứ tự các quy tắc. |
src
tests
của project.