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ồ.U→XYZW→UV
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:jZU→XYZwf+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:kVW→UVwf+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:hXYUU→XYZS h Z W → U V .U→XY.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 kW→UV.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#18006 và https://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.