CHƢƠNG 3TRUY VẤN DỮ LIỆU VIETTREEBANK VỚI PML-TQ
3.1 Giới thiệu về công cụ TrEd
TrEd, viết tắt của Tree Editor,là một công cụ phần mềm hỗ trợ việc soạn thảo, chỉnh sửa, duyệt các cấu trúc dữ liệu dạng cây, ví dụ nhƣ các cây cú pháp, thông qua bộ giao diện đồ họa thân thiện với ngƣời dùng. Công cụ TrEdđƣợc phát triển bởi trƣờngĐại học Chales, Cộng hòa Czech. Phần mềm này cho phép có thể đƣợc lập trình thêm một cách linh hoạt và mở rộng thêm tính năng mới tùy thuộc vào ngƣời sử dụng bằng việc viết thêm module mở rộng.
Hiện nay TrEd có phiên bản mới nhất là 2.0, đƣợc phát triển bằng ngôn ngữ lập trình Perl.Bộ công cụ phần mềm TrEd có thể tải về từ địa chỉ http://ufal.mff.cuni.cz/tred/. TrEd có thể tƣơng thích với nhiều nền tảng hệ điều hành nhƣ:
Windows 2000/XP/Vista/7
Linux
Mac OS X
BSD, UNIX, Solarisvàcác hệ thống dựa trên UNIX khác
3.2 Chuyển đổi VietTreebanksang định dạng PML
Để có thể truy vấn bằng ngôn ngữ truy vấn PML-TQ, các treebank cần đƣợc chuyển đổi sang định dạng PML. Thực hiện việc chuyển đổi kho ngữ liệu tiếng Việt gồm khoảng 10.000 câu từ định dạng Penn sang định dạng PML, một chƣơng trình chuyển mã đã đƣợc phát triển để thực hiện công việc chuyển đổi một cách tự động. Các bƣớc và thủ tục chuyển đổi đƣợc thực hiện nhƣ sau:
Bƣớc 1: Tìm hiểu cách mã hóa. Để có thể chuyển đổi định dạng thì chúng ta cần hiểu sâu về cách cách mã hóa của cả hai định dạng Penn và PML. Các định dạng này đã đƣợc trình bày chi tiết tại chƣơng 2. Bảng so sánh dƣới đây sẽ tóm tắt cấu trúc tƣơng ứng của hai định dạng trên thông qua một ví dụ cụ thể. Cấu trúc Penn Thành phần tƣơng ứng trong cấu trúc PML
(S (NP-SUB (P Tôi)) (VP (V đá)
(NP-DOB (N bóng))) (. .))
Thẻ <cat> lƣu các nhãn phân loại nhƣ S, NP,VP… Thẻ <functions> lƣu các nhãn chức năng SUB, DOB… Thẻ <form> lƣu các giá trị từ Tôi, đá, bóng…
Thẻ <pos> lƣu các nhãn từ loại nhƣ N,V...
Bảng 11. Bảng so sánh cấu trúc Penn với PML tƣơng ứng.
Bƣớc 2: Gom nhóm dữ liệu. Kho ngữ liệu 10.000 câu cú pháp tiếng Việt đƣợc nhóm phát triển chia nhỏ và lƣu thành 175 tệp tin có phần đuôi mở rộng là .prd. Trƣớc khi thực hiện chƣơng trình chuyển đổi, một đoạn mã đƣợc sử dụng để ghép toàn bộ từ các tệp tin riêng lẻ thành một tệp tin duy nhất và đƣợc đặt tên là VietTreebank.prd.
Bƣớc 3: Thực hiện chuyển đổi tự động. Tại bƣớc này các câu cú pháp trong file VietTreebank.prd đƣợc chuyển đổi tự động từ định dạng Penn sang định dạng PML và toàn bộ kết quả của quá trình chuyển đổi đƣợc lƣu vào file tƣơng ứng là VietTreebank.prd.pml. Trong quá trình chuyển đổi, các lỗi trong cấu trúc VietTreebank nhƣ: câu chƣa đƣợc gán nhãn, các ký tự đặc biệt dẫn đến quá trình chuyển đổi chƣơng trình bị lỗi, dấu chấm câu khi chuyển đổi xong chƣa đạt yêu cầu đƣợc chƣơng trình ghi ra file nhật ký để phục vụ việc hậu kiểm về sau.
Lƣu đồ giải thuật của chƣơng trình chuyển đổi đƣợc thể hiện ở hình vẽ dƣới đây.
Bắt đầu
Open source file Đọc dòng kế tiếp
=>$line
$input:= $input+$line
$line:= “\n” + $line
Chuẩn hóa chuỗi $line
$s_count:=0 $sentenceArray:=split ($input, “\n) $terminal_count:=0 $nonterminal_count:=0 $order:=0; $root = { -name => 'LM', -attributes => { id=>$sentence_id }, -up => undef, -children => [], }; $parent = $root;
Split string by Regular Expression
my $node = { -name => 'terminal',
-attributes => { id => $terminal_id }, -children => [
{ -name => 'form', -content=>$form }, { -name => 'pos', -content=>$tag } , { -name => 'order', - content=>$order++ }), ]}; $terminal_count++ $terminal_id = "$sentence_id- t$terminal_count"; $sentence:=$sentenceArray[s_count++]
Lưu $root vào file XML Kết thúc $parent->{-children} = $node $parent = $parent->{-up}; $s_count++ $nonterminal_count++; $node = { -name => 'nonterminal', -attributes => { id => $nonterminal_id }, -children => [], }; $parent = $children;
Tách chuỗi cho nhãn chức năng FUNCTIONS push @{$node->{-children}},
{ -name => 'functions', -children => @functions };
Tách chuỗi cho nhãn phân loại CAT push @{$node->{-children}}, {
-name => 'cat', -content => $cat }, $children;
$parent->{-children}= $node;
$children = { -name => 'children', - children => [], -up => $parent };
+ - - + + - - + - + - + $s_count < $sentenceArray.length()
(POS<space>Form) open braket ( close braket ) $line <>EOF
Là câu mới
3.3 Truy vấn dữ liệu với PML-TQ
PML-TQ là một hệ thống tìm kiếm và duyệt các treebank[11]. Nó cung cấp một bộ truy vấn mạnh và công cụ báo cáo tiện lợi.Để hiểu rõ các kỹ thuật truy vấn dữ liệu với ngôn ngữ PML-TQ, trong phần này sẽ trình bày các hiện tƣợng ngữ pháp Tiếng Việt, tƣơng ứng với nó là các câu truy vấn bằng PML-TQ. Thông qua các truy vấn này, các kỹ thuật truy vấn với PML-TQ sẽ đƣợc trình bày một cách kỹ lƣỡng. Bên cạnh đó, nhằm hỗ trợ cho việc giải thích các vấn đề liên quan đến ngữ pháp tiếng Việt, các tóm lƣợc về vấn đề cấu tạo câu, các thành phần của câu cũng sẽ đƣợc trình bày trong mục này.
3.3.1 Mô tả chung về quy tắc viết lệnh PML-TQ
Cấu trúc cú pháp chung cách viết lệnh của PML-TQ là:
TYPE […]: Bộ lựa chọn các kiểu của nút (tùy thuộc vào các loại treebank). Đối với treebank tiếng Việt thì TYPE là terminal và nonterminal. Bên trong dấu ngoặc vuông [] là các điều kiện tìm kiếm.
TYPE $a:= […]: Bộ lựa chọn đƣợc đặt tên (có thể tham khảo tới $a. $a là một biến đại diện cho kiểu và các quan hệ đƣợc đặt trong […].)
Trong PML-TQ để biểu diễn mối quan hệ giữa các nút thì một loạt các hàm quan hệ nhƣ child, parent… đƣợc xây dựng sẵn.Bảng dƣới đây mô tả đầy đủ các hàm quan hệ có trong PML-TQ.
Các quan hệ
TYPE $a := [ child TYPE $b:= [ ] ] $b là con của $a
TYPE $a := [ child TYPE $b:= [ lbrothers()=0 ] ] $b là conđầu tiên của $a TYPE $a := [ child TYPE $b:= [ lbrothers()=N-1 ] ] $b là con thứ N của $a TYPE $a := [ child TYPE $b:= [ rbrothers()=0 ] ] $b là con cuối cùng của $a TYPE $a := [ child TYPE $b:= [ rbrothers()=N-1 ] ] $b là N con phải cùng của$a TYPE $a := [ children()=1, child TYPE $b:= [ ] ] $b là con duy nhất của $a TYPE $a := [ parent TYPE $b:= [ ] ] $b là cha của $a
TYPE $a := [ ancestor TYPE $b:= [ ] ] $b bao gồm cha và ông của $a TYPE $a := [ ancestor{1,2} TYPE $b:= [ ] ] $b là cha hoặc ông của $a TYPE $a := [ descendant TYPE $b:= [ ] ] $b bao gồm con và cháu của $a TYPE $a := [ descendant{1,2} TYPE $b:= [ ] ] $b là con hoặc cháu của $a
TYPE $a := [ descendant TYPE $b:= [ ], 0x descendant [ order-precedes $b ] ]
$b là cháu bên trái nhất của $a
TYPE $a := [ descendant TYPE $b:= [ ], 0x descendant [ order-follows $b ] ]
$b là cháu bên phải nhất của $a
TYPE $a := [ sibling TYPE $b:= [ ] ] $b là lân cận của$a
TYPE $a := [ sibling{,-1} TYPE $b:= [ ] ] $b là lân cận đứng trƣớc $a TYPE $a := [ sibling{-1,-1} TYPE $b:= [ ] ] $b là lân cận ngay trƣớc $a TYPE $a := [ sibling{1,} TYPE $b:= [ ] ] $b là lân cận sau $a
TYPE $a := [ sibling{1,1} TYPE $b:= [ ] ] $b là lân cận ngay sau $a TYPE $a := [ same-tree-as TYPE $b:= [ ] ] $b là cây đồng dạng với$a
TYPE $a := [ order-follows TYPE $b:= [ ] ] $b cây con đứng sau và là đồng dạng của $a TYPE $a := [ order-follows{1,1} TYPE $b:= [ ] ] $b cây con ngay sau và đồng dạng với $a TYPE $a := [ order-precedes TYPE $b:= [ ] ] $b cây đứng trƣớc và đồng dạng với$a
TYPE $a := [ order-follows{1,1} TYPE $b:= [ ] ] $b cây đứng ngay trƣớc và đồng dạng với $a
TYPE $a := [ order-follows{-1,1} TYPE $b:= [ ] ] $b cây đồng dạng đứng ngay trƣớc hoặc ngay sau $a
TYPE $a := [ same-document-as TYPE $b:= [ ] ] $b phụ thuộc văn bản giống $a
Các phép so sánh
(!) =, ~, ~*, in <, >, <=, >=
Các phép toán
+, -, *, div, mod, &
Các hàm
descendants(), sons()… length(), substr(), match()… round(), exp(), sqrt()…
count(), sum(), max(), ration()…
Các phép phủ định
Phép toán Ý nghĩa
cat = 'NP' ∃ x ∈ cat ( x = 'NP' )
! cat = 'NP' ∀ x ∈ cat ( x ≠ 'NP' )
* cat = 'NP' ∀ x ∈ cat ( x = 'NP' )
Phép kiểm tra sự tồn tại của nút
nonterminal [ 0x descendant terminal [pos = "NN"]]
Dƣới đây là một số ví dụ minh họa cho việc tìm kiếm thông tin và thống kê bằng cấu trúc cơ bản của ngôn ngữ truy vấn PML-TQ
Tìm kiếm một từ:
Terminal $p:= [form=’đi’]; Tìm kiếm một nhãn phân loại:
Nonterminal $p:=[cat=’NP’]; Tìm kiếm một nhãn chức năng:
Nonterminal $p:=[function=’SUB’]; Thống kê số lần xuất hiện của từ „đi‟.
Terminal $p:= [form=’đi’]; >>give count()
Đƣa ra nhãn chức năng của từ „đi‟, đếm số lần sử dụng ứng với từng chức năng.
Terminal $p := [ form = 'đi' ];
>>for $p.posgive $1,count() sort by $2
Tìm tất cả các từ „đi‟ nằm trong cụm danh từ. Đếm số lần xuất hiện ứng với chức năng từ loại.
Terminal $c := [ form = 'đi',
parent nonterminal $p:=[cat=’NP’] ]; >>for $c.posgive $1,count() sort by $2
Sau đây chúng ta sẽ đi khảo cứu các quy tắc cú pháp: cấu trúc cụm từ, cấu trúc câu và mệnh đề, các nhãn chức năng… để hiểu rõ về cách viết lệnh PML- TQ.
3.3.2.1 Cụm danh ngữ
Ký hiệu: NP
Cấu trúc cơ bản: <phần phụtrước><danh từtrung tâm><phần phụsau>
Một số thành tố phụ đứng trƣớc danh từ trung tâm tạo thành phần đầu của cụm danh từ, một số khác thì đứng sau danh từ trung tâm, tạo thành phần cuối của cụm danh từ.
Ví dụ: “một mái tóc đẹp” thì danh từchỉloại “mái” là trung tâm, “một” là phần phụ trƣớc, còn danh từ“tóc” và tính từ“đẹp” thuộc phần phụ sau.
(NP (M một) (Nc-H mái) (N tóc) (A đẹp))
Một cụm danh từ có thể thiếu phần phụ trƣớc hay phần phụ sau nhƣng không thể thiếu phần trung tâm.
Từ lý thuyết đã trình bày ở phía trên, chúng ta sẽ đƣa ra một số câu hỏi về cụm danh từ, tƣơng ứng với nó là các câu truy vấn.
Câu hỏi:
Tìm cụm danh từ đầy đủ đóng vai trò là chủ ngữ
Câu truy vấn:
nonterminal $parent :=
[ child $child, (cat = 'NP' and functions = 'SUB') ];
terminal $child :=
[ (pos = 'N-H' and lbrothers() > 0 and rbrothers() = 0) ];
Trong câu truy vấn trên thì $parent và $child là các biến đại diện cho các nút cần truy vấn. Nút $parent có kiểu là nonterminal (nút chƣa kết thúc) và nút $child có kiểu là terminal (các nút kết thúc). Bên trong dấu ngoặc vuông [] là các điều kiện tìm kiếm. Việc sử dụng biến sẽ khiến câu lệnh dễ nhìn và ít sai sót hơn.
nonterminal
[ (cat = 'NP' and functions = 'SUB'), terminal
[ (pos = 'N-H' and lbrothers() >0 and rbrothers() > 0) ] ];
Có thể diễn giải câu truy vấn nhƣ sau: Tìm các nút không kết thúc(nonterminal), có nhãn phân loại là cụm danh từ „NP‟ và nhãn chức năng là chủ ngữ „SUB‟, có con (child). Con có nhãn từ loại là danh từ trung tâm (pos = 'N-H') và có phần phụ bên trái (lbrothers() >0) và phần phụ bên phải (rbrothers() >0).
Dƣới đây là một trong các kết quả truy vấn:
Hình 11. Cụm danh từ đầy đủ là chủ ngữ
Câu hỏi Tìm cụm danh từ có bổ ngữ là cụm giới từ Câu truy vấn: nonterminal $p := [ cat = 'NP', nonterminal [ cat = 'PP' ] ];
Ý nghĩa câu truy vấn: Tìm các nút không kết thúc có nhãn phân loại là cụm danh từ (cat = 'NP'), trong cụm danh từ có nút không kết thúc (nonterminal) là thành phần cụm bổ ngữ (cat = „PP‟)
Câu hỏi
Tìm nhãn cụm danh từ có nhiều phần tử trung tâm
Câu truy vấn:
nonterminal $p := [ cat = 'NP',
2+x terminal [pos ~ 'N*-H'] ];
Ý nghĩa câu truy vấn: Tìm các nút không kết thúc có nhãn phân loại là cụm danh từ (cat=‟NP‟), trong cụm danh từ có nhiều hơn 2 nút kết thúc (2+x) mà nhãn từ loại của nó là danh từ trung tâm (pos = 'N*-H'), nút * ở đây đại diện cho ký tự bất kỳ, có thể là Nc, Np, Nu...
Một trong những kết quả truy vấn là:
Hình 12. Cụm danh từ có bốn phần tử trung tâm
Cụmđộng từ, cụm tính từ cũng có cấu trúc tƣơng tự cụm danh từ nên cách tìm kiếm cũng tƣơng tự.
Câu hỏi
Tìm cụm động từ có bổ ngữ là cụm danh từ.
Câu truy vấn:
[ cat = 'VP', nonterminal
[ cat = 'NP' ] ];
Tƣơng tự nhƣ cụm danh từ về cách lý giải. Câu hỏi: Tìm cụm tính từ có phần phụ trước là phụ từ Câu truy vấn: nonterminal $p := [ cat = 'AP', terminal
[ (pos = 'R' and lbrothers() = 0) ] ];
Ý nghĩa câu truy vấn: tìm các nút không kết thúc là cụm tính từ (cat=‟PP‟), trong cụm tính từ này có nút kết thúc có một nhãn là phụ từ (pos=‟R‟) và không có phần phụ bên trái của phụ từ (lbrothers() = 0).
Việc tìm cụm giới từ, cụm phó từ... cũng đƣợc thực hiện tƣơng tự.
3.3.2.2 Cụm từ chỉ số lƣợng Ký hiệu:QP Thành phần chính của QP là các sốtừ. Ngoài ra còn có phụ từ. Câu hỏi: Tìm cụm từ chỉ số lượng là phụ từ hoặc số từ Câu truy vấn: nonterminal $p := [ cat = 'QP', terminal [ pos in {'R', 'M'} ] ];
Ý nghĩa câu truy vấn: Tìm các nút không kết thúc là cụm từ chỉ số lƣợng (cat=‟QP‟), trong cụm từ chỉ số lƣợng này có chứa các nút kết thúc là các từ mang nhãn từ loại là phụ từ hoặc số từ hoặc cả hai (pos in {'R', 'M'}).
Một trong các kết quả truy vấn
Hình 13. Cụm từ chỉ số lƣợng có cả phụ từ và số từ 3.3.3 Tìm cấu trúc câu và mệnh đề
Trong phần này, chúng ta sẽ nghiên cứu một số cách khai thác thông tin mang tính chất tổng hợp để thấy tính chất báo cáo mạnh mẽ của PML-TQ
3.3.3.1 Câu trần thuật
Ký hiệu:S
Theo quan điểm coi cấu trúc chủ-vịlà cấu trúc chủ đạo của câu tiếng Việt [1], câu trần thuật sẽcó cấu trúc sau:
<chủngữ><vịngữ>
Trong đó chủ ngữ thƣờng là cụm danh từ, còn vị ngữ thƣờng là cụm động từ hoặc cụm tính từ.
VD: Anh nói thế không đúng đâu.
(S (S-SUB (NP-SUB (N-H Anh)) (VP (V-H nói) (P thế)))
(AP-PRD (R không) (A-H đúng) (T đâu))) (. .))
Câu hỏi:
Đưa ra mẫu câu trần thuật có chủ ngữ là cụm chủ vị
Câu truy vấn: nonterminal $p := [ cat = 'S', child $c ]; * $c := [ ]; >> give $p,$p.cat,first_defined($c.cat&"- "&$c.functions,$c.cat,$c.pos)
>> give $2 & " -> " & concat($3," "over $1 ) >> for $1 give count(),$1 sort by $1 desc
Ý nghĩa câu truy vấn: Tìm các nút không kết thúc có nhãn phân loại là câu trần thuật (cat=‟S‟), có các nút con (child $c). Các nút con có thể là nút kết thúc hoặc không kết thúc (dấu * có nghĩa bao gồm tất cả các nút kết thúc và nútkhông kết thúc). Đồng thời đƣa ra các cấu trúc câu, đếm số cấu trúc đƣợc sử dụng, sắp xếp theo thứ tự giảm dần.
Để trích xuất các thông tin, chúng ta sẽ sử dụng các bộ lọc kết quả (output filters) đƣợc xây dựng sẵn trong PML-TQ để thực hiện. Các bộ lọc kết quả sẽ trích xuất dữ liệu từ kết quả đƣợc trả về của câu truy vấn và sinh ra bảng tổng hợp. Về mặt cú pháp của ngôn ngữ PML-TQ thì các bộ lọc đƣợc viết ngay sau câu truy vấn và bắt đầu bằng ký hiệu >>. Nhiều bộ lọc có thể kết hợp với nhau thành một chuỗi: bộ lọc đầu tiên sẽ trích xuất các thông tin từ kết quả truy vấn và các bộ lọc con sẽ thực hiện trên kết quả lọc đã đƣợc xử lý bởi bộ lọc đầu tiên.
Với câu lệnh trên, bộ lọc đầu tiên:
>> give $p,$p.cat,first_defined($c.cat,$c.pos) Sẽ đƣa ra cấu trúc câu thỏa mãn điều kiện biến $p, đƣa ra các nhãn phân loại của $p, đƣa ra các nhãn phân loại con của $p ($c.cat), nhãn từ loại ($c.pos) là con của $p.
>> give $2 & " -> " & concat($3," " over $1 ) Là lọc kết quả của bộ lọc thứ nhất, $1, $2, $3 lần lƣợt thay thế cho $p; $p.cat; first_defined($c.cat,$c.pos) – hàm này sẽ lấy giá trị cat (nếu có) hoặc pos (nếu có). Bộ lọc thứ hai đƣa ra kết quả đã đƣợc cấu trúc lại để cho dễ nhìn dễ hiểu từ bộ lọc thứ nhất. Bộ lọc thứ ba đếm kết quả của bộ lọc thứ hai và sắp xếp theo thứ tự giảm dần số lần xuất hiện của kết quả. Kết quả truy vấn nhƣ sau:
Số lần xuất hiện Mẫu câu
14034 S -> NP-SUB VP 7566 S -> NP-SUB VP . 1408 S -> S , S . 1110 S -> NP-SUB AP-PRD 1095 S -> NP-TMP , NP-SUB VP . 1071 S -> NP-TMP NP-SUB VP ... 1 S -> N-H 1 S -> S-TC 1 S -> VP-PRP 1 S -> VP-TMP 1 S -> X 1 S -> N-H 1 S -> S-TC
Bảng 12. Tổng hợp các cấu trúc câu trần thuật
Hình 14. Câu trần thuật là một tít báo
PML-TQ là ngôn ngữ báo cáo mạnh mẽ, qua kết quả trên đã chứng minh phần nào, không chỉ đƣa ra các câu trần thuật, nó còn có khả năng thống kê số lƣợng và đƣa ra cấu trúc câu trần thuật.
3.3.3.2 Mệnh đềphụkết
Ký hiệu:SBAR
Mệnh đềphụkết đóng vai trò bổnghĩa cho danh từ, động từ, hay tính từ. Bản thân nó không thể đứng độc lập làm thành một câu. Vềcơbản cấu trúc của mệnh đềphụbao gồm một liên từphụkết và một mệnh đề(ký hiệu S).
VD: Quyển sách mà anh mƣợn (NP (Nc-H Quyển) (N sách) (SBAR (C mà) (S (NP-SUB (N-H anh)) (VP (V-H mượn))))) Câu hỏi:
Thống kê các chức năng cú pháp của thành phần phụ kết
Câu truy vấn:
nonterminal $p := [ cat = 'SBAR' ]; >> give $p.functions
>> for $1 give count(),$1 sort by $1 desc