D. Các câu hỏi về sách
H. Các câu hỏi về sách và năm xuất bản
4.1. XÂY DỰNG CÁC THÀNH PHẦN HỆ THỐNG
Từ các thông tin cần truy vấn, chúng tôi đã tiến hành xây dựng mô hình dữ liệu của hệ thống cần phải xử lý như hình 4.1 dưới đây:
Hình 4.1 – Mô hình dữ liệu của hệ thống
Dựa trên kiến trúc của hệ thống (Hình 2.2), chúng tôi triển khai xây dựng các thành phần của hệ thống, sau đó tích hợp các thành phần này trong một hệ thống hoàn chỉnh.
4.2 THÀNH PHẦN TIỀN XỬ LÝ CÂU HỎI
Các bước tiền xử lý như sau:
- Loại bỏ các ký tự thừa.
- Chuyển từ tiếng Việt về dạng mã hệ thống xử lý được.
4.2.1 Bước tách tham số trong câu
Hệ thống hiện quy ước tham số của câu truy vấn phải đặt trong cặp dấu nháy kép. Bước này sẽ tìm các thành phần n m trong cắp dấu nháy kép và tách chúng ra khỏi câu.
Với câu hỏi:
Ai viết sách “Giáo trình cơ sở dữ liệu” vậy? Sẽ thu được câu:
Ai viết sách + param[1] + vậy? Trong đó:
param[1] = “Giáo trình cơ sở dữ liệu”
Tham số tìm được sẽ được dùng làm điều kiện cho phép chọn khi hệ thống phát sinh câu lệnh SQL, nên chúng sẽ không bị thay đổi ở các bước xử lý kế tiếp.
4.2.2 Bước loại ỏ ký tự thừa
Việc loại bỏ các ký tự dư thừa trong câu hỏi có thể thực hiện tương đối dễ dàng thông qua các bước sau:
- Định nghĩa tập ký tự của hệ thống.
- Duyệt qua từng ký tự của câu truy vấn, nếu ký tự đó không thuộc
Hình 4.2 – Lưu đồ các thao tác loại bỏ các ký tự thừa
4.2.3 Bước chuyển mã ti ng Vi t
Đề tài này sử dụng ngôn ngữ lập trình Prolog để biểu diễn văn phạm của hệ thống theo cú pháp của UBG. Tuy nhiên khi triển khai trong thực tế thì gặp vấn đề về mặt kỹ thuật, đó là gói công cụ cho phép tích hợp Prolog vào trong môi trường .NET hiện chưa hỗ trợ tiếng Việt. Do đó cần chuyển các từ
inputStr, lengthStr, sysCharacters outputStr = “”, i = 0 i < lengthStr ch = inputStr[i] ch sysCharactors i ++ outputStr+ = ch i++ return outputStr T T F F
tiếng Việt về dạng mã phù hợp có thể xử lý được trên các môi trường khác nhau.
Người thực hiện quyết định chuyển các từ tiếng Việt về dạng mã Telex vì 2 lý do: có thể xử lý được trên môi trường bất kỳ và mã này cũng dễ đọc. Để thực hiện được điều này, trước tiên cần khai bào 3 tập ký tự là
vnUnicodeCharSet, vnTelexCharSet và vnTelexSignSet. Giá trị cụ thể của 3 tập như khai báo dưới đây:
char[] vnUnicodeCharSet = { 'À', 'Á', 'Â', 'Ã', 'È', 'É', 'Ê', 'Ì', 'Í', 'Ò', 'Ó', 'Ô', 'Õ', 'Ù', 'Ú', 'Ý', 'à', 'á', 'â', 'ã', 'è', 'é', 'ê', 'ì', 'í', 'ò', 'ó', 'ô', 'õ', 'ù', 'ú', 'ý', 'Ă', 'ă', 'Đ', 'đ', 'Ĩ', 'ĩ', 'Ũ', 'ũ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ạ', 'ạ', 'Ả', 'ả', 'Ấ', 'ấ', 'Ầ', 'ầ', 'Ẩ', 'ẩ', 'Ẫ', 'ẫ', 'Ậ', 'ậ', 'Ắ', 'ắ', 'Ằ', ' ', 'Ẳ', 'ẳ', 'Ẵ', 'ẵ', 'Ặ', 'ặ', 'Ẹ', 'ẹ', 'Ẻ', 'ẻ', 'Ẽ', 'ẽ', 'Ế', 'ế', 'Ề', 'ề', 'Ể', 'ể', 'Ễ', 'ễ', 'Ệ', 'ệ', 'Ỉ', 'ỉ', 'Ị', 'ị', 'Ọ', 'ọ', 'Ỏ', 'ỏ', 'Ố', 'ố', 'Ồ', 'ồ', 'Ổ', 'ổ', 'Ỗ', 'ỗ', 'Ộ', 'ộ', 'Ớ', 'ớ', 'Ờ', 'ờ', 'Ở', 'ở', 'Ỡ', 'ỡ', 'Ợ', 'ợ', 'Ụ', 'ụ', 'Ủ', 'ủ', 'Ứ', 'ứ', 'Ừ', 'ừ', ' ', 'ử', 'Ữ', 'ữ', 'Ự', 'ự', 'Ỳ', 'ỳ', 'Ỵ', 'ỵ', 'Ỷ', 'ỷ', 'Ỹ', 'ỹ' }; string[] vnTelexCharSet = {
"a", "a", "aa", "a", "e", "e", "ee", "i", "i", "o", "o", "oo", "o", "u", "u", "y", "a", "a", "aa", "a", "e", "e", "ee", "i", "i", "o", "o", "oo", "o", "u", "u", "y", "aw", "aw", "dd", "dd", "i", "i", "u", "u", "ow", "ow", "uw", "uw", "a", "a", "a", "a", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aw", "aw", "aw", "aw", "aw", "aw", "aw", "aw", "aw", "aw", "e", "e", "e", "e", "e", "e", "ee", "ee", "ee", "ee", "ee", "ee", "ee", "ee", "ee", "ee", "i", "i", "i", "i", "o", "o", "o", "o", "oo", "oo", "oo", "oo", "oo", "oo", "oo", "oo", "oo", "oo", "ow", "ow", "ow", "ow", "ow", "ow", "ow", "ow", "ow", "ow", "u", "u", "u", "u", "uw", "uw", "uw", "uw", "uw", "uw",
"uw", "uw", "uw", "uw", "y", "y", "y", "y", "y", "y", "y", "y" }; char[] vnTelexSignSet ={ ‘f’, ’s’, ’’, ’x’, ’f’, ’s’, ’’, ’f’, ’s’, ’f’, ’s’, ’’, ’x’, ’f’, ’s’, ’s’, ’f’, ’s’, ’’, ’x’, ’f’, ’s’, ’’, ’f’, ’s’, ’f’, ’s’, ’’, ’x’, ’f’, ’s’, ’s’, ’’, ’’, ’’, ’’, ’x’, ’x’, ’x’, ’x’, ’’, ’’, ’’, ’’, ’j’, ’j’, ’r’, ’r’, ’s’, ’s’, ’f’, ’f’, ’r’, ’r’, ’x’, ’x’, ’j’, ’j’, ’s’, ’s’, ’f’, ’f’, ’r’, ’r’, ’x’, ’x’, ’j’, ’j’, ’j’, ’j’, ’r’, ’r’, ’x’, ’x’, ’s’, ’s’, ’f’, ’f’, ’r’, ’r’, ’x’, ’x’, ’j’, ’j’, ’r’, ’r’, ’j’, ’j’, ’j’, ’j’, ’r’, ’r’, ’s’, ’s’, ’f’, ’f’, ’r’, ’r’, ’x’, ’x’, ’j’, ’j’, ’s’, ’s’, ’f’, ’f’, ’r’, ’r’, ’x’, ’x’, ’j’, ’j’, ’j’, ’j’, ’r’, ’r’, ’s’, ’s’, ’f’, ’f’, ’r’, ’r’, ’x’, ’x’, ’j’, ’j’, ’f’, ’f’, ’j’, ’j’, ’r’, ’r’, ’x’, ’x’ };
Ta thấy r ng: vnUnicodeCharSet[i] vnTelexCharSet[i] + vnTelexSignSet Vậy mỗi khi đọc được 1 ký tự tiếng việt có dấu, cần tách nó ra 2 thành phần là ký tự dạng mã telex và dấu dạng mã telex. Thành phần dấu sẽ được bổ sung vào cuối mỗi tiếng.
Ví dụ với câu hỏi:
Sách “Lập trình phần mềm hệ thống” có phải do tác giả “Chu Văn Mẫn” viết không?
Sẽ thu được câu:
sachs + param[1] + cos phair do tacs giar + param[2] + vieets khoong?
Trong đó:
param[1] = “Lập trình phần mềm hệ thống” param[2] = “Chu Văn Mẫn”
4.3 THÀNH PHẦN PHÂN TÍCH CÂU HỎI BẰNG UBG
Bước quan trọng ảnh hưởng lớn tới câu truy vấn phát sinh ở bước kế tiếp cũng như kết quả trả về. Cần tiến hành thực hiện các việc:
- Tách từ và nhân diện từ loại trong câu.
- Chuyển câu hỏi về cú pháp UBG.
- Phát sinh cây cú pháp.
4.3.1 Tách từ và nhân di n từ loại
Có thể dùng bộ phân tích cú pháp mã nguồn mở ANTLR để nhận diện các từ vựng dựa trên các luật sinh đã xây dựng. Tuy nhiên ở đề tài này tác giả tự đề xuất phương án nhận diện từ vựng.
Trước hết cần tạo bảng TOKEN(ID, Words, Kind_Words, Context) chứa tập Token sử dụng trong truy vấn thư viện điện tử. Mỗi Token bao gồm 4 thành phần:
- ID: dùng để nhận diện từ. - Words: là nội dung của từ.
- Kind_words: dùng để phân loại từ.
- Type: dùng nhận diện từ trong bối cảnh cụ thể.
Hình 4.3 – Biểu diễn các thành phần của Token
TOKEN
ID Words
Kind_Words Context
Bảng 4.1 sẽ liệt kê một số Token rút trích từ tập các ký hiệu kết thúc lấy từ các luật sinh của hệ thống.
ID Words Kind words Context
1 tác giả title write
2 soạn giả title write
3 giáo sư title write
4 tiến sĩ title write
5 nhà xuất bản title publish
6 nhà phát hành title publish
7 nhà in title publish
8 viết verb write
9 sáng tác verb write
10 biên soạn verb write
11 xuất bản verb publish
12 phát hành verb publish
13 in verb publish
14 vào năm nào what time
15 vào khi nào what time
16 vào thời gian what time
17 ai wtitle write
18 người nào wtitle write
20 nơi nào wtitle publish
21 chỗ nào wtitle publish
22 sách book_type
23 giáo trình book_type
24 tiểu thuyết book_type
25 cuốn book_volum 26 quyển book_volum 27 tập book_volum 28 những complement 29 có những complement 30 có các complement 31 có verb_have 32 thuộc verb_have 33 thuộc về verb_have 34 là verb_be 35 ? question
Bảng 4.1 – Bảng liệt kê một số TOKEN
Khi đã xây dựng được bảng chứa các Token, ta thực hiện việc phân tích câu truy vấn để tạo thành mảng chứa các Token (tokenList) theo thuật giải dưới đây. Xin lưu ý là từ của hệ thống hiện tại có số tiếng nhiều nhất là 3 và số Token không nhiều lắm.
- Bước 1:
o Nếu số tiếng trong câu < 3 thì nhảy xuống bước 2.
o Thực hiện sao chép 3 tiếng đầu tiên xem như là 1 từ.
o Tìm trong các Token xem có Token nào chứa từ khớp với từ
vừa chép ra không, nếu có thì nhảy xuống bước 4.
o Nhảy xuống bước 2.
- Bước 2:
o Nếu số tiếng trong câu < 2 thì nhảy xuống bước 3.
o thực hiện sao chép 2 tiếng đầu tiên xem như là 1 từ.
o Tìm trong các Token xem có Token nào chứa từ khớp với từ
vừa chép ra không, nếu có thì nhảy xuống bước 4.
o Nhảy xuống bước 3.
- Bước 3:
o Nếu số tiếng trong câu = 0 thì nhảy xuống bước 6.
o thực hiện sao chép 1 tiếng đầu tiên xem như là 1 từ.
o Tìm trong các Token xem có Token nào chứa từ khớp với từ
vừa chép ra không, nếu có thì nhảy xuống bước 4.
o Nhảy xuống bước 5.
- Bước 4:
o Ghi Token vừa tìm được vào tokenList ở vị trí kế tiếp.
o Nhảy lên bước 1.
- Bước 5:
o Phát sinh và ghi nhận một Token “unknown” với giá trị là từ đang xét.
o Nhảy lên bước 1.
- Bước 6:
Ví dụ với câu hỏi:
Tác giả nào viết sách “Lập trình phần mềm hệ thống”? Sau bước tách sẽ thu được mảng:
{what(type:write); verb(type:write); book_type; param[1]; question}
Trong đó: param[1] = “Lập trình phần mềm hệ thống”
4.3.2 Chuyển câu hỏi về c pháp UBG
Từ mảng tokenList thu được, có thể chuyển câu truy vấn sang cú pháp UBG. Chúng tôi lựa chọn ngôn ngữ Prolog để biểu diễn cú pháp UBG ([14], [15]) b ng cách ghép các Token lại với nhau hình thành một danh sách của Prolog. Lưu đồ thực hiện được trình bày trong Hình 4.4.
Hình 4.4 – Lưu đồ phân tích cú pháp câu hỏi b ng UBG
tokenList, lengthArr UBGsyntax = “”, i = 0 i< lengthArr e = tokenList [i] UBGsyntax+ = e + “,” i++ return UBGsyntax T F
4.3.3 Phát sinh cây cú pháp
Từ câu truy vấn biểu diễn dưới dạng cú pháp văn phạm UBG thu được ở bước trên, ta có thể tạo ra được cây cú pháp tương ứng.
Ví dụ từ câu:
Ai viết sách “Algorithms” trong năm 2008? Chuyển về mã:
Ai vieets sachs "Algorithms" trong nawm 2008? Miền xác định của câu hỏi: tác giả, sách, năm xuất bản Qui tắc cú pháp UBG:
q1 wtitle(type:write), verb(type:write), book(value:A), time(value:Y), question
Trong đó:
book(value:A) book_type, book_name(value:A) book_type sachs
book_name(value:Algorithms) Algorithms time(value:Y) pre_time, year(value:Y)
pre_time trong nawm year(value:2008) 2008 wtitle(type:write) ai
verb(type:write) vieets question ?
Hình 4.5 – Phát sinh cây cú pháp
4.4 THÀNH PHẦN PHÁT SINH CÂU TRUY VẤN SQL
Bước này thực hiện các công việc sau: - Tìm cấu trúc phù hợp trong hệ thống. - Phát sinh và thực thi câu lệnh SQL.
4.4.1 T m cấu tr c phù hợp
Trong hệ thống đã khai báo sẵn tập các dạng câu hỏi mà hệ thống hỗ trợ. Tuy hệ thống triển khai trong phạm vi hẹp nhưng cũng có rất nhiều dạng câu hỏi cần phải xử lý.
Để nâng cao tốc độ xử lý hệ thống thì trước khi đối chiếu để tìm ra cấu trúc câu phù hợp, cần giới hạn lại phạm vi tìm kiếm dựa trên các yếu tố như số tham số thu được và động từ của câu. Kiểm tra câu hỏi với các cấu trúc đã được giới hạn của hệ thống để tìm ra cấu trúc tương ứng. Có 2 tình huống xảy
ai vieets sachs Algorithm s
trong nawm 2008 ? wtitle(type:write) book_type book_name pre_time year
verb(type:write) book time question q1
ra như sau:
a) Tìm được cấu trúc tương ứng với câu truy vấn của người sử dụng. Cấu trúc này nếu có là duy nhất do trong khi khai báo các dạng câu hỏi đã loại bỏ sự nhập nh ng giữa các cấu trúc.
b) Không tìm được cấu trúc tương ứng với câu truy vấn của người sử dụng. Khi đó lại có 2 khả năng cần xem xét:
Tìm được cấu trúc gần nghĩa với câu truy vấn: giải pháp cho vấn đề này là thực hiện các phép toán hợp nhất và tổng quát giữa các cấu trúc. Kết quả thực hiện sẽ dem so sánh với câu hỏi ban đầu, nếu giữa chúng không quá khác biệt thì sẽ được xem như gần nghĩa.
Không Tìm được cấu trúc gần với câu truy vấn
Trong trường hợp không tìm được cấu trúc tương ứng thì sẽ bỏ qua bước phát sinh và thực thi câu lệnh SQL.
4.4.2 Phát sinh và thực thi câu l nh SQL
Nếu ở bước trên tìm ra cấu trúc tương ứng thì sẽ dựa trên cây cú pháp để phát sinh câu lệnh SQL như sau:
- Từ thành phần what và verb sẽ xác định mệnh đề SELECT.
- Từ thành phần book, time, title, topic sẽ xác định mệnh đề WHERE.
Hình 4.6: Phát sinh câu lệnh SQL
Cây cú pháp trên sẽ tạo ra câu lệnh: SELECT AuthorName
FROM Authors INNER JOIN AuBooks
ON Authors.AuthorID = AuBooks. AuthorID INNER JOIN Books ON AuBooks.BookID = Books.BookID
WHERE BookName = ‘Algorithms’ AND CopyrightYear = 2008; Việc gọi thực thi câu lệnh SQL chỉ đơn thuần về mặt kỹ thuật, phụ thuộc vào hệ quản trị cơ sở dữ liệu và ngôn ngữ lập trình mà hệ thống sử dụng.
4.5 THÀNH PHẦN XỬ LÝ KẾT QUẢ TRUY VẤN
Đây là bước cuối cùng của hệ thống hỏi đáp. Tùy thuộc vào kết quả ở các bước trên mà hê thống sẽ đưa ra câu trả lời tương ứng. Kết quả nhận được là 1 trong 4 trường hợp sau:
ai vieets sachs Algorithm
s
trong nawm 2008 ?
wtitle(type:write) book_type book_name pre_time year
verb(type:write) book time question q1
what(type:write)
SELECT WHERE
- Có câu lệnh SQL và câu lệnh trả về giá trị.
- Có câu lệnh SQL và câu lệnh không trả về giá trị. - Chỉ tìm được cấu trúc gần đúng.
- Không tìm được cấu trúc gần đúng.
4.5.1 Câu l nh SQL trả về giá trị
Tùy thuộc vào câu truy vấn mà cấu trúc dữ liệu nhận được có thể khác nhau. Việc xử lý kết quả để đưa ra câu trả lời sẽ phải căn cứ vào cấu trúc dữ liệu và số lượng kết quả nhận được. Ví dụ như với câu truy vấn:
- Tác giả “Hillson Susan” viết sách gì?
Kết quả trả về là một danh sách các tài liệu. Nhưng với câu hỏi:
- Có phải tác giả “Hillson Susan” viết sách “Algorithms” không? Thì câu trả lời chỉ là một khẳng định.
4.5.2 L nh SQL kh ng trả về giá trị
Trong trường hợp này thì rõ ràng câu hỏi có cú pháp đúng nhưng không có kết quả. Có 2 khả năng xảy ra là:
- Tham số đưa vào sai (hoặc là một khẳng định sai). - Thư viện chưa có thông tin về vấn đề được hỏi. Vậy thì câu trả lời cũng sẽ dựa trên 2 khả năng trên.
4.5.3 Tìm được cấu tr c gần đ ng
Câu truy vấn trong trường hơp này là không đúng cú pháp của hệ thống đặt ra. Có 2 khả năng xảy ra là:
- Thiếu thành phần bắt buộc trong câu.
- Hoặc chứa thành phần thừa (làm phức tạp câu hỏi).
Chương trình sẽ liệt kê các câu hỏi có cấu trúc gần với câu truy vấn để cho người dùng lựa chọn câu hỏi phù hợp.
4.5.4 Kh ng t m được cấu tr c gần đ ng
Câu truy vấn trong trường hơp này không đúng và cũng không gần với tập cú pháp của hệ thống. Giải pháp đưa ra là đề nghị người dùng xem xét và nhập lại câu hỏi đồng thời gợi ý cho người dùng đọc qua các dạng câu hỏi mà hệ thống hỗ trợ.
4.6 CÀI ĐẶT CHƯƠNG TRÌNH
Mục này sẽ trình bày các phần mềm và ngôn ngữ lập trình được sử dụng để xây dựng hệ thống. Giao diện hỏi đáp của chương trình cũng được giới thiệu.
4.6.1 C ng ngh s d ng
Hệ thống hỏi đáp b ng ngôn ngữ tự nhiên tiếng Việt dùng cho thư viện điện tử được cài đặt thử nghiệm trên các nền tảng sau:
- Hệ điều hành: hệ thống hiện tại được cài đặt trên hệ điều hành Microsoft Windows 7 Ultimate. Tuy nhiên các hệ điều hành của Microsort từ phiên bản Windows XP trở về sau đều hỗ trợ đầy đủ cho hệ thống.