Làm cách nào để tôi xây dựng lại rừng cây cú pháp từ vector Earley?


9

Sử dụng vectơ Earley làm công cụ nhận dạng khá đơn giản: khi kết thúc chuỗi, bạn chỉ cần kiểm tra sản xuất tiên đề đã hoàn thành bắt đầu ở vị trí 0. Nếu bạn có ít nhất một, thì chuỗi được chấp nhận.

Sử dụng vectơ Earley để xây dựng lại (các) cây phân tích cú pháp là ít rõ ràng. Trên thực tế, tôi không thể tìm ra cách một thủ tục thuật toán sẽ hoạt động, hơn nữa các tài liệu tham khảo duy nhất tôi tìm thấy là mơ hồ hoặc siêu kỹ thuật. Bất cứ ai có thể làm sáng tỏ về nó?


2
Nó sẽ giúp ích nếu bạn liệt kê các tài liệu tham khảo bạn tìm thấy, và những gì bạn nghĩ là mơ hồ, và những gì bạn nghĩ là quá kỹ thuật. Nếu không, câu trả lời có thể là một con trỏ đến các tài liệu tham khảo bạn đã tìm thấy.
Logic lang thang

1
Nó có thể là những gì bạn gọi vector không phải là những gì Earley gọi vector trong bài báo gốc của mình. Hoặc có thể là nó không đóng vai trò chính xác. Các tác giả giới thiệu các biến thể trong thuật toán. Không có cách nào để biết vì bạn không cung cấp bất kỳ tài liệu tham khảo nào cho các tài liệu bạn đang sử dụng ... và dù sao chúng tôi có thể không có quyền truy cập vào chúng. Những gì có thể giúp là rõ ràng hơn về định nghĩa. Khi trả lời, tôi chỉ cho rằng bạn đã sử dụng các định nghĩa tương tự như của Earley.
babou

@babou, cái mà tôi gọi là "Earley vector" là biểu diễn dạng bảng của cấu trúc dữ liệu được xây dựng bởi trình phân tích cú pháp. Đó là thuật ngữ được sử dụng bởi giáo sư Ngôn ngữ chính thức của tôi trong khi đề cập đến nó. Cần lưu ý rằng ngôn ngữ chính của tôi không phải là tiếng Anh, vì vậy đây có thể chỉ là một nỗ lực xấu trong việc dịch thuật ngữ. Tài liệu tham khảo kỹ thuật tôi đã đề cập là chính bài báo của Earley. Tôi đã tiếp cận nó, nhưng nó có một chút đáng sợ đối với một người mới bắt đầu thực sự như tôi.
Stefano Sanfilippo

Bạn có thể muốn kiểm tra xem "vectơ Earley" được giáo sư của bạn sử dụng có nghĩa là cấu trúc giống như cái mà Earley gọi là "vectơ" trong bài báo của mình. Có thể hữu ích cho việc giao tiếp. Đối với phần còn lại, như bạn có thể thấy, bạn phải giữ thêm thông tin để có thể phục hồi các cây phân tích, nhưng Earley không thực sự đi sâu vào chi tiết. Hiện tại có các thuật toán khác và tôi e rằng sự phức tạp của thuật toán Earley ẩn giấu phần nào những ý tưởng chính của loại kỹ thuật này. Chúc may mắn.
babou

Là lời giải thích của tôi hữu ích, hay bạn cần một mô tả chi tiết hơn về phần kỹ thuật?
babou

Câu trả lời:


9

Tôi đang sử dụng thuật ngữ và ký hiệu từ bài báo của Earley . Có thể là mô tả bạn đọc là khác nhau.

Dường như các thuật toán phân tích cú pháp CF nói chung được trình bày trước tiên dưới dạng một trình nhận dạng, và sau đó việc quản lý thông tin cần thiết để thực sự xây dựng các cây phân tích và các phân tích cú pháp được thêm vào như một suy nghĩ sau. Một lý do có thể là việc giữ thông tin cần thiết để xây dựng khu rừng chung đòi hỏi không gian khối trong đó là độ dài của chuỗi đầu vào được phân tích cú pháp, nhưng yêu cầu không gian chỉ là hình vuông để nhận dạng , khi thông tin này không được bảo tồn. Lý do cho sự gia tăng độ phức tạp không gian này khá đơn giản: kích thước rừng phân tích có thể là hình khối.O(n3)nO(n2)

Độ phức tạp thời gian trường hợp xấu nhất là , như đã biết.O(n3)

Tài liệu tham khảo tốt nhất cho thuật toán của Earley dĩ nhiên là bài báo của Earley , nhưng nó không rõ ràng lắm về việc xây dựng khu rừng phân tích. Đây thực sự có thể là một doanh nghiệp lộn xộn, nhiều hơn so với cuộc nói chuyện nhanh của phần 7 trang 101 sẽ xuất hiện. Thành thật mà nói, Earley không nói về rừng phân tích, hay rừng, mà là " một đại diện bao gồm tất cả các cây phân tích có thể ". Và có một lý do chính đáng cho điều đó: nếu anh ta cố gắng tạo ra một khu rừng theo ngữ pháp của mình, thì độ phức tạp không gian (do đó là thời gian) của anh ta sẽ leo lên trong đó là kích thước dài nhất quy tắc bên tay phải. Đây là lý do tại sao các thuật toán khác sử dụng ngữ pháp ở dạng nhị phân (không nhất thiết phải là Chomsky Bình thường (CNF)).O(ns+1)s

Trên thực tế, Earley sử dụng hình thức nhị phân ngầm , bởi vì điều đó là cần thiết cho sự phức tạp thời gian khối. Đây là một trong những vai trò chính của dấu chấm quy tắc ở các tiểu bang. Nhưng dạng nhị phân ngầm này tạo ra các phân tích cú pháp và các khu rừng theo ngữ pháp nhị phân, chứ không phải ở dạng nguyên bản, mà tôi sợ, là một nguồn che khuất chính. Đây là chi tiết dưới đây.

Một cách tốt để hiểu cách thu được rừng có lẽ là xem xét nó trong một trường hợp đơn giản hơn, thuật toán CYK . Nó cũng thường được mô tả như một trình nhận dạng và khía cạnh trình phân tích cú pháp được thêm vào cuối. Bạn có thể nhìn vào mô tả trong wikipedia. Thông tin cần thiết để xây dựng khu rừng là những gì họ lưu trữ trong bảng "backpointers". Backpointers về cơ bản là con trỏ đến các chuỗi con (một ký hiệu liên quan) tạo thành các thành phần của một chuỗi theo một số quy tắc. Họ đưa ra tất cả các cách có thể để phân tích một chuỗi con. Hãy nhớ lại rằng CYK sử dụng dạng nhị phân, thường là CNF, để mọi thứ đơn giản hơn. Trình phân tích cú pháp CYK về cơ bản có cấu trúc lập trình động giống như Earley, nhưng đơn giản hơn nhiều. Vì vậy, hiểu rõ về nó có thể là một trợ giúp đáng kể.

Quay trở lại thuật toán của Earley, tôi không tin rằng bạn cần vector Earley để quyết định chấp nhận hoặc xây dựng các cây và rừng phân tích cú pháp. Những gì Earley gọi vector trong bài báo của mình chỉ xuất hiện ở trang 97, trong đoạn thứ ba thực hiện. Nó chỉ là một thiết bị để tăng tốc độ tìm kiếm các trạng thái quay lại một số vị trí chuỗi đã cho k, để có được độ phức tạp tốt hơn. Nhưng tất cả các thông tin là trong các bộ trạng thái, được thực hiện như danh sách các trạng thái. Tuy nhiên, thông tin này không đủ để xây dựng rừng cây phân tích, bởi vì thuật toán không theo dõi (các) cách mà một trạng thái có thể thu được. Thật vậy, vectơ thậm chí còn được sử dụng để loại bỏ hiệu quả một trạng thái đã được tìm thấy, độc lập với cách nó được tìm thấy.

Trong phần 7 của bài viết của Earley, ông giải thích rằng để "biến trình nhận dạng thành trình phân tích cú pháp", nghĩa là để có thể khôi phục các cây phân tích cú pháp, cần phải theo dõi cách hoàn thành.

Mỗi lần chúng tôi thực hiện thao tác hoàn thành thêm trạng thái (bỏ qua cái nhìn) chúng ta xây dựng một con trỏ từ thể hiện của ở trạng thái đó sang trạng thái khiến chúng tôi phải thực hiện các hoạt động. Điều này chỉ ra rằng đã được phân tích cú pháp là . Trong trường hợp D không rõ ràng, sẽ có một bộ con trỏ từ nó, một cho mỗi thao tác hoàn thành gây ra để được thêm vào tập trạng thái cụ thể. Mỗi biểu tượng trong cũng sẽ có gợi ý từ nó (trừ khi nó là thiết bị đầu cuối), và như vậy, do đó đại diện cho cây nguồn gốc cho .EαD.βgDDγ.fDγEαD.βgγD

Lưu ý rằng trong văn bản này, và là các chỉ số trong chuỗi được phân tích cú pháp, chỉ ra nơi nhận biết quy tắc bên trái bắt đầu (như biểu tượng bên phải đã được dự đoán. Vì vậy, là chỉ số chuỗi trong đó nhận dạng bắt đầu và nó kết thúc ở chỉ số . Những "con trỏ hoàn thành" này tương đương với Earley của các backpoint được mô tả (không quá tốt trong wikipedia) cho phiên bản trình phân tích cú pháp của CYK.fgfDγg

Từ một con trỏ như vậy (như được mô tả trong trích dẫn), chúng ta biết rằng trong trường hợp quy tắc có thể tự phát triển thành một cây (hoặc rừng) để phân tích chuỗi đầu vào từ chỉ mục đến chỉ mục , mà chúng tôi lưu ý . Các nút ngay bên dưới được đưa ra theo quy tắc . Bằng cách tìm kiếm sự hoàn thành dẫn đến sau đó chúng ta có thể tìm gợi ý khác như rằng nói như thế nào là biểu tượng cuối cùng củaDEαD.βgwf+1gwf+1:gDDγDγ.fDđã thu được, và do đó có thêm thông tin về các cây phân tích có thể. Ngoài ra, bằng cách nhìn vào sự hoàn thành đã nhận ra biểu tượng trước khi ở trạng thái Earleir, bạn tìm thấy cách nó được lấy, v.v.

Giả sử bạn giữ tất cả các con trỏ cần thiết như được chỉ ra trong bài báo, bạn có thể nhận được tất cả các biểu diễn cây được chia sẻ bắt đầu từ biểu tượng cuối cùng được trình phân tích cú pháp nhận ra, tất nhiên đó là biểu tượng ban đầu của ngữ pháp.

Nhưng tôi cũng bỏ qua phần lộn xộn . Giả sử bạn có một quy tắc , mà tôi chọn với một bên tay phải dài hơn 2 ký hiệu và một quy tắc khác , cho một ngữ pháp mơ hồ.UXYZWUV

Cũng có thể xảy ra việc trình phân tích cú pháp sẽ phân tích thành , thành và cả và thành . Như vậy, với sự cai trị , Cả và parse vào .wf+1:gXwg+1:hYwh+1:iwh+1:jZUXYZwf+1:iwf+1:jU

Sau đó, nó cũng có thể là cả hai và cả hai phân tích cú pháp vào . Sau đó, với quy tắc , chuỗi phân tích thành theo hai cách khác nhau, tương ứng với sự mơ hồ của ngữ pháp. w j + 1 : k V W U V w f + 1 : k Wwi+1:kwj+1:kVWUVwf+1:kW

Tất nhiên, để tránh lặp lại các tính toán, thuật toán của Earley sẽ cố gắng chia sẻ càng nhiều càng tốt trong hai tính toán phân tích cú pháp. Nó sẽ thực sự cổ phiếu rõ ràng là những gì mà công nhận (và phân tích) của và vào và . Nhưng nó thực sự sẽ làm nhiều hơn một chút: nó cũng sẽ chia sẻ phần đầu của hai phân tích cú pháp riêng biệt nhận ra với quy tắc . Ý tôi là trạng thái sẽ chỉ được tìm thấy một lần (đối với những gì tôi đang mô tả), trong trạng thái đặt . Nó sẽ là một phần chung của hai phân tích. Tất nhiên, mọi thứ sẽ tạm thời chuyển hướng trong khi phân tích cú pháp w g + 1 : h X Y U U X Y Z U X Y . Zwf+1:gwg+1:hXYUUXYZS h Z W U V .UXY.ZfShZ vì chúng tương ứng với các chất nền phân biệt, cho đến khi chúng hội tụ lại khi mọi thứ phân tích thành W, khi trạng thái được sản xuất hai lần trong trạng thái thiết lập .S kWUV.fSk

Vì vậy, rừng cây cú pháp có thể là một cây rất lạ, với loại cây con song sinh có thể chia sẻ hai cạnh đầu tiên của một số nút, nhưng không phải là cạnh thứ ba. Nói cách khác, nó có thể là một cấu trúc rất khó xử. Điều này có thể giải thích tại sao Earley gọi nó là " đại diện bao gồm tất cả các cây phân tích có thể ", mà không cụ thể hơn.

Bất kỳ suy giảm để phẫu thuật tách cặp song sinh siamese, mà không thay đổi ngữ pháp sẽ dẫn đến sự phức tạp tăng lên. Cách đúng đắn để làm điều đó là viết sai ngữ pháp.

Tôi hy vọng điều này sẽ giúp bạn. Cho tôi biết. Nhưng tôi nhấn mạnh rằng một sự hiểu biết tốt về phân tích cú pháp CYK có thể giúp đỡ. Có các thuật toán khác, đơn giản hơn Earley, có thể phân tích cú pháp tất cả các ngôn ngữ CF một cách hiệu quả.

Bạn có thể tìm thấy thông tin chung hơn về vấn đề rừng phân tích này trong hai câu trả lời khác mà tôi đã đưa ra: /cstheory/7374#18006https://linguistic.stackexchange.com/questions/4619#6120 . Nhưng họ không đi sâu vào chi tiết cụ thể về thuật toán của Earley.


Cũng như phân tích cú pháp CYK, cũng đáng để xem xét phân tích GLR.
Bút danh

1
@Pseudonymous Biết và hiểu các hình thức phân tích CF chung khác nhau chắc chắn không gây hại, và tôi đề nghị nhiều như vậy với hai tài liệu tham khảo ở cuối câu trả lời. Tuy nhiên, sự lựa chọn CYK của tôi không phải là do tình cờ. Nó chia sẻ với thuật toán của Earley tính chất của việc diễn giải, sử dụng trực tiếp ngữ pháp, thay vì sử dụng các bảng được tạo ra bằng cách biên dịch ngữ pháp thành Máy tự động đẩy xuống (như trong GLR, GLL, GPrec). Do đó, mối quan hệ giữa quá trình nhận biết và thế hệ cây / rừng được thấy rõ hơn. CKY cũng là thuật toán đơn giản nhất, với một ngoại lệ.
babou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.