Xử lý ngôn ngữ tự nhiên (Phần 3)


Chúng ta sẽ tìm hiểu cách xây dựng cây cú pháp dạng List. Trước tiên bạn sẽ phải biết cách gộp các dòng quy tắc trong Prolog. Bạn thử nghĩ nếu phân tích nhiều câu có cùng chủ ngữ , động từ,… thì mỗi lần kiểm tra kết quả phân tích bạn phải tạo ra nhiều file.pl hay có nhiều quy tắc cú pháp giống nhau. Việc này gây tốn thời gian và dữ liệu trùng lắp. Để giải quyết chúng ta sẽ gộp các câu có cấu trúc ngữ pháp, từ loại tương tự.

Xét những dòng quy tắc (CFG/DCG) giống nhau, ta chỉ chọn 1. Thứ tự sắp xếp nên là s, np , nn, vp, vb,…. Hãy xem ví dụ sau:

Định nghĩa một văn phạm DCG để nhận diện các câu sau đây là đúng hay sai cú pháp

– Nó mua sách.
– Nó mua cuốn sách.
– Nó mua một cuốn sách.
– Nó mua sách mới.
– Nó mua cuốn sách mới.
– Nó mua một cuốn sách mới.
– Nó mua một cuốn sách rất hay.

Lưu ý:
+ Trong một VP, động từ VB bắt buộc phải hiện diện như là thành phần chính của VP.
+ Trong một NP, danh từ NN bắt buộc phải hiện diện như là thành phần chính của NP.
+ Trong một PP, bắt buộc phải có một giới từ IN và một danh ngữ NP.
+ …

Cây cú pháp cho từng câu: (“Nó” là Đại danh từ/Đại từ nhân xưng, ký hiệu:PRP hoặc PPR)

Sau khi vẽ Cây cú pháp, bạn phải viết CFG, nhưng mình sẽ bỏ qua CFG vì nó tương ứng với DCG. Vậy ta có các quy tắc cú pháp theo DCG như sau:
*Lưu ý: Xét tới quy tắc nào mà trước đó đã có rồi thì ta chỉ lấy 1 (vd: np- – >un,nn. trong câu “Nó mua cuốn sách”. Ta xét tiếp câu “Nó mua một cuốn sách”, thì thấy cũng xuất hiện quy tắc np- – >un,nn. giống câu trước, do đó ta sẽ không thêm vào tập quy tắc DCG.)

xltn18

Tập quy tắc DCG bên cạnh được rút gọn đi rất nhiều. Nếu bạn phân tích mỗi câu đưa thêm các quy tắc tương ứng thì bài giải rất dài và khó kiểm soát khi có lỗi xảy ra. Nó sẽ như thế này nếu bạn không gộp câu:
s–>np,vp.
np–>prp.
np–>prp.
np–>prp. …. 😕
Chúng ta đã chuẩn bị muối tiêu ớt (Cây cú pháp, CFG, DCG), bây giờ bỏ vào nồi canh (Prolog) và nếm thử (test truy vấn).
xltn19
Sai rồi @@, sai ngay khi test câu ” Nó mua một cuốn sách rất hay”. Bạn thử truy vấn câu tự đặt “Nó mua một cuốn sách hay” hoặc “Nó mua sách hay” => kết quả đều đúng, mà khi test với các câu có chữ “rất” thì xảy ra lỗi.

Hướng giải quyết: Thay đổi cây cú pháp (nhánh NP)
– Nó mua sách.                                  NP–>NN
– Nó mua cuốn sách.                        NP–>UN  NN
– Nó mua một cuốn sách.                NP–>CD  NP         NP–>UN NN
– Nó mua sách mới.                          NP–>NP  ADJP    ADJP–> JJ
– Nó mua cuốn sách mới.                NP–>NP  ADJP     NP–>UN  NN  ADJP–>JJ
– Nó mua một cuốn sách mới.        NP–>CD  NP  ADJP   NP–>UN  NN
– Nó mua một cuốn sách rất hay.  NP–>CD  NP          NP–>NP  ADJP         NP–>UN  NN        ADJP–>RB  JJ
Sau khi xây dựng lại cây cú pháp, CFG, DCG ta sẽ có cây cú pháp và kết quả truy vấn như sau:
xltn17cuoi
và kết quả test
xltn19dasuaKinh nghiệm khi làm bài: đừng bao giờ sợ sai, cứ vẽ một cây cú pháp và kiểm tra nó trên prolog. Cần chú ý trước NN hay NNP… là NP ;  trước JJ hay RB JJ … là ADJP.
Để rèn luyện, bạn hãy hoàn thành bài tập sau:
xltn16
Đến đây bạn đã biết gộp nhiều câu thành một tập quy tắc ngắn gọn dễ kiểm soát. Tiếp theo chúng ta sẽ tìm hiểu về  Cây cú pháp dạng List (DCG List).

CÂY CÚ PHÁP DẠNG LIST

Khác với các ví dụ, bài học trên, khi truy vấn kết quả trả về ở dạng True hay False. Ở phần bài học này, mục tiêu của chúng ta là khi truy vấn, kết quả trả về với dạng List (X= s(……..))

Lấy ví dụ “Nó học bài”, ta áp dụng như sau:
xltn15Chúng ta tiến hành chuyển DCG sang DCG list cùng cách truy vấn trong Prolog
xltn22sua
Kết quả trả về đã ở dạng list, thông qua kết quả này ta có thể hình dung được cây cú pháp đã xây dựng. 😛

Kết thúc phần 3 tại đây. Phần 4 sẽ giới thiệu cách chuyển một quy tắc DCG thành mệnh đề Prolog và DCG ràng buộc nghĩa.

Bonus :
xltn25


Cảm ơn bạn đã theo dõi blog.
Nhiều ngày tốt lành!

13 thoughts on “Xử lý ngôn ngữ tự nhiên (Phần 3)

  1. Pingback: Prolog + (Java/C#) | Sâu non tìm lá

  2. Cám ơn bạn nhiều nhé. Đang bối rối mà tìm được blog của bạn là hiểu hết luôn ^^.

    Like

  3. Bạn ơi cho mình hỏi yêu cầu của đề này là sao vậy bạn :
    Định nghĩa một văn phạm DCG (Definite Clause Grammar) để phân tích và trả về cây cú pháp của tất cả các câu mở rộng của những câu sau trên Prolog:

    1) Nam rất đẹp trai
    2) Nam đang học ở thành phố
    3) Nam thích đá bóng
    Mình chưa hiểu cái đề này lắm, bạn giải thích dùm mình với. Cảm ơn bạn nha

    Like

    • bạn xem lại phần “CÂY CÚ PHÁP DẠNG LIST” tại post phần 3 này nha. Mình nhắc lại hướng làm thế này. CFG->DCG->DCG List <= “trả về cây cú pháp”. Lưu ý là chúng ta gộp tất cả các quy tắc cú pháp của 3 câu test, quy tắc nào trùng thì bỏ 1. Bạn cố gắng xem lại các phần của chủ đề này nhé. Chúc bạn học tốt.

      Like

      • Cảm ơn bạn nhiều nhé, cơ mà nó nói là “của tất cả các cây mở rộng” mình ko hiểu lắm chỗ này, nghĩa là bộ test nó sẽ như nào nhỉ.

        Like

        • 3 câu test bạn phải làm được là
          1) Nam rất đẹp trai
          2) Nam đang học ở thành phố
          3) Nam thích đá bóng

          và những câu mở rộng, tức là trộn lại các từ ra câu mới:
          4) Nam đẹp trai học ở thành phố
          5) Nam thích học ở thành phố
          6) Nam đang đá bóng
          … bạn tự nghĩ ra câu khác chứa những từ trong câu test, nếu trả về đúng thì văn phạm, các quy tắc của bạn đúng.

          Like

          • cảm ơn bạn, vậy là nếu mình làm xong yêu cầu 1 là test được 3 câu kia đúng, rồi tới phần mở rộng mình cần làm gì để các câu test mở rộng trả về đúng văn phạm nhỉ. Bạn nhiệt tình thật 😀

            Like

          • Thay vì nhập 3 câu test vào prolog để truy vấn thì bạn nhập câu mở rộng thui, bạn cần nghiệm lại nha :3

            Like

  4. bạn ơi, mình làm được đúng test 3 câu kia, cơ mà test các câu mở rộng thì sai, vậy làm thế nào để khắc phục nó nhỉ. Help mình với

    Like

  5. Cho mình hỏi câu: “Gia đình của Nam sống ở tỉnh” định nghĩa sao nhỉ ad
    thanks nhiều nhé

    Like

  6. Cho mình hỏi câu: “Gia đình của Nam sống ở tỉnh” định nghĩa sao nhỉ ad
    thanks nhiều nhé

    Like

Cho mình biết cảm nhận của bạn nhé