Bước tách tham số trong câu

Một phần của tài liệu Phương pháp xử lý một số dạng câu hỏi tiếng việt cho công cụ tìm kiếm thư viện điện tử luận văn thạc sĩ (Trang 55)

D. Các câu hỏi về sách

4.2.1Bước tách tham số trong câu

H. Các câu hỏi về sách và năm xuất bản

4.2.1Bướ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, vnTelexCharSetvnTelexSignSet. 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. (adsbygoogle = window.adsbygoogle || []).push({});

- 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 (adsbygoogle = window.adsbygoogle || []).push({});

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. (adsbygoogle = window.adsbygoogle || []).push({});

- 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 (adsbygoogle = window.adsbygoogle || []).push({});

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ị (adsbygoogle = window.adsbygoogle || []).push({});

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.

- Hệ quản trị CSDL: CSDL của thư viện điện tử được quản trị bởi Microsoft SQL Server 2005.

- Nền tảng lập trình:

o Chương trình của đề tài được xây dựng trong môi trường Visual C# 2005.

o Các câu truy vấn biểu diễn b ng ngôn ngữ prolog được xử lý dựa trên thư viện liên kết động của ứng dụng SWI-Prolog Version 5.11.18.

4.6.2 Cài đặt và s d ng h thống

Trước hết cần cài đặt hệ quản trị CSDL SQL Server 2005 trên nền hệ điều hành Microsoft Windows (Windows XP hoặc mới hơn) và đưa CSDL quản lý thư viện điện tử vào SQL Server. Để chạy chương trình lập trình b ng Visual C# 2005, cần cài gói Microsoft .NET Framework 2.0 hoặc mới hơn.

Một phần của tài liệu Phương pháp xử lý một số dạng câu hỏi tiếng việt cho công cụ tìm kiếm thư viện điện tử luận văn thạc sĩ (Trang 55)