3 Thực nghiệm
3.3 Tập quy tắc xác định phần tử trung tâm
S l -H;S;VP;AP;NP;.* SBAR l -H;SBAR;S;VP;AP;NP;.* SQ l -H;SQ;VP;AP;NP;.* NP l -H;NP;Nc;Nu;Np;N;P;.* VP l -H;VP;V;A;AP;N;NP;S;.* AP l -H;AP;A;N;S;.* RP r -H;RP;R;T;NP;.* PP l -H;PP;E;VP;SBAR;AP;QP;.* QP l -H;QP;M;.* XP l -H;XP;X;.* YP l -H;YP;Y;.* MDP l -H;MDP;T;I;A;P;R;X;.* WHNP l -H;WHNP;NP;Nc;Nu;Np;N;P;.* WHAP l -H;WHAP;A;N;V;P;X;.* WHRP l -H;WHRP;P;E;T;X;.* WHPP l -H;WHPP;E;P;X;.* WHXP l -H;XP;X;.*
Ví dụ với quy tắc: VP l –H;VP;V;A;AP;N;NP;S;.* Có thể hiểu như sau:
Nếu một cụm có nhãn là VP: chúng ta sẽ duyệt từ trái sang phải, nếu gặp thành phần nào mà kết là H thì đó sẽ là thành phần chính của cụm VP này. Nếu khơng, ta tìm đến cụm VP tiếp theo chứa trong cụm ban đầu và tìm đến V, A, AP, N, NP, S, duyệt các thành phần đó nếu có theo các quy tắc tiếp theo. Nếu khơng thấy bất kì thành phần nào như trên, thì có thể lấy thành phần đầu tiên khi duyệt từ trái sang kí hiệu là .* làm thành phần chính của cụm VP. Thơng thường, một cụm VP sẽ có một động từ làm thành phần chính, nếu khơng tìm được động từ đó, có thể là các thành phần tiếp theo được liệt kê trong luật trên. Hiện nay có rất nhiều cơng cụ chuyển đổi từ dạng treebank sang định dạng CoNLL-X hoặc định dạng của MSTParser. Trong luận văn, chúng tôi đã xây
dựng một thuật tốn chuyển tự động để có thể thực hiện được điều này. Thuật tốn khá dễ hiểu và có thể áp dụng cho tồn bộ Viettreebank với hơn 10.000 câu phân tích cú pháp thành phần.
3.2.2 Thuật toán chuyển tự động từ Viettreebank sang cú pháp phụ thuộc
Thuật toán chuyển tự động từ treebank sang cú pháp phụ thuộc được trình bày theo tài liệu [15]. Thuật toán dựa trên kho ngữ liệu cú pháp thành phần Viettreebank và sử dụng tập quy tắc tìm phần tử trung tâm đã trình bày ở trên. Thuật tốn chuyển kho ngữ liệu Viettreebank về định dạng CoNLL-X để thực nghiệm với công cụ MaltParser, sau đó sẽ chuyển từ CoNLL-X sang định dạng của MSTPaser để thực nghiệm với công cụ này.
Việc chuyển tự động dữ liệu gồm các bước thực hiện chính là: Đọc dữ liệu từ Viettreebank, bao gồm các câu dưới dạng cú pháp thành phần (biểu diễn bằng cấu trúc đặt ngoặc) tải vào cây cú pháp thành phần −→ Cú pháp phụ thuộc.
Ví dụ, cho một câu tiếng Việt: “Mảnh đất của đạn bom khơng cịn người nghèo.” có phân tích cú pháp thành phần: (S-TTL (NP-SUB (Nc-H Mảnh) (N đất) (PP (E-H của) (NP (N-H đạn) (N-H bom)))) (VP (R khơng) (V-H cịn) (NP-DOB (N-H người) (A nghèo))) (. .)). Cây cú pháp thành phần của câu tiếng Việt này được biểu diễn trong Hình 3.1. Sau đó, từ cây cú pháp thành
Hình 3.1: Cú pháp thành phần của một câu tiếng Việt
Mảnh đất của đạn bom khơng cịn người nghèo . 1 2 3 4 5 6 7 8 9 10 root nsubj nc prep
pobj nn neg dobj amod
punct
Như vậy, thuật toán chuyển tự động từ Viettreebank sang cú pháp phụ thuộc trải qua hai bước chính.
1. Đọc dữ liệu từ Viettreebank tải vào cây cú pháp thành phần
Đầu vào của bước này chính là các câu cú pháp thành phần của Viettree- bank, đầu ra là mô tả theo cây cú pháp thành phần. Thuật toán sử dụng một ngăn xếp, mỗi phần tử trong một ngăn xếp bao gồm: Parent (Nút cha để thêm các nút con vào) và Key (thành phần dữ liệu gồm (, các cụm, các từ,... ). Xây dựng cây cú pháp thành phần dựa vào ngăn xếp như sau:
• Nếu gặp chuỗi ( câu cú pháp thành phần đầu tiên đưa vào ngăn xếp là: Phrase = null, Parent = null.
• Nếu gặp chuỗi tiếp theo ta xét các trường hợp:
– Nếu là chuỗi wi 6= ( thì tạo nút ni mới với thơng tin của chuỗi đầu vào. Xem phần tử ở đầu của ngăn xếp, nếu P arent =null và chỉ có một phần tử (nghĩa là nút gốc) thì sẽ tạo nút Root đưa vào cây, sau đó cập nhật P arent = Root, P hrase = P hrase của từ đang xét. Nếu ngược lại, ni.P arent = P arent của phần tử lấy từ ngăn xếp. Thêm ni là con của nút P arent.
– Nếu là chuỗi ) thì xóa phần tử đầu tiên của ngăn xếp vì các nút đã chèn hết con hoặc là khơng có con.
– Lặp lại các bước trên, thuật tốn kết thúc khi gặp chuỗi )cuối cùng. 2. Chuyển cây cú pháp thành phần sang cú pháp phụ thuộc
Chúng ta phải thực hiện ba bước cho phần này. Tìm các từ phụ thuộc với nhau và gán nhãn phụ thuộc cho mỗi quan hệ đó, cuối cùng là xây dựng
phân tích cú pháp phụ thuộc cho toàn bộ các từ trong câu. Ở bước thứ nhất, tìm các từ phụ thuộc với nhau, chúng ta dựa vào tập luật tìm phần tử trung tâm, dựa vào hướng đi để duyệt các từ trong câu, và theo thứ tự ưu tiên có thể lấy ra được phần tử trung tâm mà từ đó phụ thuộc vào (Algorithm 1). Ở bước thứ hai, duyệt tất cả những nhãn phụ thuộc ở tập nhãn đã xây dựng
Algorithm 1:FindHeadP(P, lstHeadRules, lstElements)
Require: P: a phrase; lstElements: list of elements in P; lstHeadRules: list of head rules
Ensure: head of P
for headRule ∈ lstHeadRules do if headrule.Phrase=P then hr ← headRule break end if end for lstRightHR ← hr.Right
for element ∈ lstElements do for rightEle ∈ lstRightHR do
if element.Phrase=rightEle or element.Pos=rightElethen
head ← element break end if end for end for return head
để tìm ra nhãn phù hợp nhất với hai từ trên (Algorithm 2). Cuối cùng,
Algorithm 2:GetDependentLabel(h, d, lstLabels)
Require: (h, d), where d is a head and d is its dependent; lstLabels: list of labels
Ensure: a dependency label l: h−→l d
for labelele∈ lstlabel do
lef t ← GetInf ormation(h, labelele.Lef t) right ← GetInf ormation(d, labelele.Right)
center ← GetCenterInf ormation(h, d, labelele.center)
if IsLabel(lef t, right, center) then
l ←labelele.Label break
end if end for return l
sau khi đã thực hiện được hai bước cơ bản trên, ta xây dựng cây cú pháp phụ thuộc với tất cả các cung đều được gán nhãn phụ thuộc (Algorithm 3).
Algorithm 3: ConvertToDP(Root,lstHeadRules,lstLabels,dpTree)
Require: Root: root node of the constituency tree; lstHeadRules: list of head rules; lstLabels: list of dependency labels; dpTree: saved dependency tree
Ensure: Head of the sentence
if Root=null then return end if if IsLeaf(Root) then lstElements ← Word(Root) return FindHeadP(Phrase(Root),lstHeadRules,lstElements) end if if AllChildIsLeaf(Root) then forchild ∈ Root do
lstElements ← Word(child)
end for
h ← FindHeadP(Phrase(Root),lstHeadRules,lstElements)
forchild ∈ Root do
label ← GetDependencyLabel(h, child, lstLabels) depTree ← (h, child, label)
end for
return h
end if
lstHeadChilds ← null
forchild ∈ Root do
lstHeadChilds ← ConverToDP(Phrase(child), lstHeadRules,lstLabels, dpTree)
end for
h ← FindHeadP(Phrase(Root),lstHeadRules, lstHeadChilds)
forheadchild ∈ lstHeadChild do
label ← GetDependencyLabel(h, headchild, lstLabels) depTree ← (h, headchild, label)
end for
return h
Để việc chuyển dữ liệu từ Viettreebank sang kho ngữ liệu cú pháp phụ thuộc hiệu quả nhất, chúng tôi đã xây dựng bằng tay gần 3000 câu trong tập dữ liệu Viettreebank để kiểm tra và điều chỉnh. Việc làm này mất khá nhiều thời gian và phải hiểu rõ về luật cũng như các nhãn cú pháp phụ thuộc mới có thể triển khai được.
3.3 Kết quả thực nghiệm
Sau khi thuật toán kết thúc đã tạo ra được bộ tài nguyên với 10165 câu từ treebank sang định dạng CoNLL-X.
Khi đã có tài nguyên là 10165 câu ở định dạng CoNLL-X, chúng tơi trích ra tập những câu có độ dài nhỏ hơn 25 từ (gồm 6546 câu trong Viettreebank). Mục đích của việc làm này là để cho phân tích được chính xác hơn với những câu có độ dài ngắn. Sau đó, chúng tơi chia nhỏ tập dữ liệu. Tiếp theo, chúng tôi thực hiện đánh giá chéo bằng cách: chia bộ dữ liệu ra thành 10 phần, huấn luyện trên 9 phần và phân tích trên 1 phần cịn lại rồi so sánh kết quả, sau đó quay vịng với 9 tập cịn lại. Sau đó, sẽ dùng mơ hình tạo ra khi huấn luyện để phân tích trên dữ liệu mới.
Định dạng CoNLL-X cho một câu tiếng Việt trước khi thực hiện phân tích cú pháp phụ thuộc trong bảng 3.4.