Phục hồi một khu rừng phân tích từ một trình phân tích cú pháp Earley?


25

Gần đây tôi đã đọc về trình phân tích cú pháp Earley và nghĩ rằng đó là một trong những thuật toán thanh lịch nhất mà tôi thấy cho đến nay. Tuy nhiên, thuật toán theo nghĩa truyền thống của nó là một trình nhận dạng và không phải là trình phân tích cú pháp, có nghĩa là nó có thể phát hiện xem một chuỗi có khớp với một CFG cụ thể không nhưng không tạo ra một cây phân tích cho nó. Câu hỏi của tôi là làm thế nào để phục hồi không phải là một cây phân tích , mà là rừng phân tích cú pháp của tất cả các phân tích cú pháp có thể có của chuỗi đầu vào đã cho.

Trong "Kỹ thuật phân tích cú pháp: Hướng dẫn thực hành" của Grune và Jacob, họ minh họa một thuật toán có thể được sử dụng để khôi phục một khu rừng phân tích từ kết quả của trình nhận dạng Earley, nhưng nó dựa trên phương pháp phân tích cú pháp của Unger, có thời gian chạy là O (n k + 1 ), trong đó k là độ dài của sản xuất dài nhất trong ngữ pháp. Điều này có nghĩa là thời gian chạy không phải là một đa thức về kích thước của ngữ pháp. Hơn nữa, bài báo gốc về thuật toán của Earley, trong đó đề xuất thuật toán phục hồi rừng phân tích, là không chính xác (xem, ví dụ, trang 762 của bài viết này của Tomita), mặc dù nhiều nguồn vẫn trích dẫn nó là cách thích hợp để phục hồi rừng phân tích .

Câu hỏi của tôi là liệu có thể, trong thời gian đa thức, để phục hồi một khu rừng phân tích cho một chuỗi đầu vào nhất định. Tôi đã tìm thấy một bài báo ở đây cung cấp một thuật toán để tạo ra các biểu diễn rừng phân tích kích thước khối cho bất kỳ phân tích cú pháp nào bằng cách sử dụng một mô phỏng của một chiếc PDA, vì vậy điều này có vẻ như là có thể, nhưng tôi vẫn chưa tìm ra cách nào để làm điều này. Lý tưởng nhất là tôi muốn làm điều này mà không cần chuyển đổi ngữ pháp đầu vào sang CNF (điều này thực sự sẽ giải quyết được vấn đề), vì rừng phân tích kết quả sẽ khá lộn xộn.

Cảm ơn vì những giúp đỡ của bạn!


Liệu nó có phải là một thuật toán dựa trên phân tích cú pháp Earley, hoặc bạn sẽ không phiền khi sử dụng một trình phân tích cú pháp CFG chung khác?
Alex ten Brink

1
Tôi muốn một thuật toán dựa trên trình phân tích cú pháp Earley. Tôi đã dạy một khóa học trình biên dịch và đã dành vài ngày để cố gắng tìm ra câu trả lời cho câu hỏi này và nó thực sự làm tôi khó chịu.
templatetypedef

Thời gian chạy theo cấp số nhân không đáng ngạc nhiên vì các từ có thể có nhiều cây phân tích theo cấp số nhân. Trên thực tế, họ thậm chí có thể có vô số nếu bạn cho phép CFG tùy ý.
Raphael

3
@Raphael Vai trò của các khu rừng phân tích chính xác là có một cơ chế chia sẻ cho phép đại diện cho tất cả các cây, thậm chí vô số cây, với cấu trúc hữu hạn, với độ phức tạp không gian nhỏ. Tất nhiên, điều này có thể để lại một số công việc cho lumberjacks.
babou

Bạn có thể muốn nhìn vào Marpa . Đó là mô-đun Perl và thư viện C thực hiện trình phân tích cú pháp Earley và có hỗ trợ rừng phân tích cú pháp đầy đủ.
hà mã

Câu trả lời:


14

Làm điều đó tất nhiên sẽ phụ thuộc vào đại diện phù hợp cho một "khu rừng đóng gói" đại diện cho tất cả các cây phân tích cho một câu nhất định.

Tôi nghĩ rằng nơi bạn muốn bắt đầu tìm kiếm là ở luận án của Joshua Goodman (phân tích từ trong ra ngoài, Harvard, 1999). Về cơ bản, ý tưởng là bạn có thể xác định một thuật toán phân tích cú pháp theo một ngữ nghĩa nhất định. Tùy thuộc vào semires, bạn sẽ có thể tính toán tất cả các loại số lượng và cấu trúc thay vì cây phân tích trần (như một trình nhận dạng hoặc như một trình phân tích cú pháp). Một semires mà bạn có thể định nghĩa (mà Goodman thực hiện trong luận án của mình) là một semires trong đó các giá trị là các bộ phân tích cú pháp. Cuối cùng, khi bạn hoàn thành phân tích cú pháp một câu, bạn sẽ nhận được tất cả các cây phân tích cú pháp trong nút phân tích cú pháp chính.

Một lần nữa, bạn phải cẩn thận về việc làm cho nó có thể thông qua việc thể hiện đúng.


Cảm ơn đã tham khảo! Đây có vẻ là một nguồn tài nguyên tuyệt vời và tôi sẽ dành thời gian để xem qua nó.
templatetypedef

8

Có một bài viết mô tả cách thực hiện:

Phân tích cú pháp kiểu SPPF từ Earley Recognisers của Elisabeth Scott

Nó mô tả làm thế nào để xây dựng một khu rừng phân tích nhị phân trong thời gian khối.


2
Liên kết đó dường như bị phá vỡ ngay bây giờ. Bạn có một tài liệu tham khảo (tiêu đề giấy, nơi xuất bản, danh sách các tác giả) và / hoặc một liên kết cập nhật?
DW

1
Xem web.archive.org/web/20130508170633/http://thor.info.uaic.ro/... : "SPPF-Style Parsing Từ Earley Recognisers", Elizabeth Scott. Một liên kết khác: dinhe.net/~aredridel/.notmine/PDFs/ ,.
a3nm

Đây là câu trả lời chính xác cho câu hỏi "làm thế nào để có được một khu rừng phân tích từ một người nhận biết Earley".
tjvr

Có một triển khai tốt về điều này trong JS ở đây: joshuagrams.github.io/pep
tjvr 17/2/2017

Có nghĩa là gì của binarized trong bối cảnh này?
Bruce Adams

6

Bạn không bao giờ cần CNF. Nó có nhược điểm là thay đổi cấu trúc ngữ pháp. Nhưng bạn cần phải giới thiệu các thiết bị đầu cuối trung gian để không có phía bên phải dài hơn 2 (dạng 2) vì độ dài RHS xác định độ phức tạp. Nỗ lực tốt nhất để giải thích điều đó bằng trực giác là, nếu bộ nhớ phục vụ, một bài báo của Beau Shiel, "Quan sát về phân tích cú pháp tự do bối cảnh", được xuất bản năm 1976 trong một hội nghị ngôn ngữ học tính toán. Thuật toán của Earley sử dụng 2 hình thức ngầm. Nó chỉ được ẩn trong thuật toán. Về phục hồi và xử lý rừng phân tích, bạn nên xem web tại "phân tích rừng giao cắt". Nó thực sự rất đơn giản. Nhiều bài viết trên web, nếu bạn nhận được (từ trích dẫn hoặc bảng nội dung) các tiêu đề hoặc tác giả để tìm kiếm chúng trực tiếp.

Trên thực tế, bạn có thể làm được nhiều hơn CF và vẫn có được các khu rừng phân tích trong thời gian đa thức. Câu hỏi là, đôi khi: bạn có thể làm gì với nó một khi bạn có nó?

Một mục đích của bài viết cuối cùng mà bạn đề cập là chỉ ra rằng các thuật toán phức tạp (như GLR) không nhất thiết phải mua bất cứ thứ gì trong thời gian hoặc không gian và có thể thay đổi khu rừng phân tích của bạn.

Một nhận xét về giảng dạy. Tôi nghĩ Earley, như vậy, rất phức tạp cho việc giảng dạy và có thể được thay thế bằng các thuật toán đơn giản hơn với cùng một nội dung giáo dục. Dạy là về khái niệm hoặc công nghệ. Trong thuật toán của Earley, các khái niệm thiết yếu được ẩn giấu trong sự phức tạp của các chi tiết và theo quan điểm công nghệ, nó đã lỗi thời. Đó là một bài báo tuyệt vời, nhưng điều đó không có nghĩa đó là cách tiếp cận sư phạm tốt nhất.

Có thể có nhiều thông tin trong tài liệu ngôn ngữ học tính toán hơn trong các kênh khoa học máy tính thông thường. Tôi không có cuốn sách Ceriel-Grune-Jacobs, nhưng tôi sẽ ngạc nhiên nếu họ không có tất cả các tài liệu tham khảo phù hợp (mặc dù tôi không chắc về tiêu chí lựa chọn của họ).


Bổ sung sau một yêu cầu trong một bình luận (tháng 7, 2013)

Điều này bổ sung cho thấy sự tồn tại của các thuật toán đơn giản hơn Earley.

Như tôi đã nói, tìm kiếm trang web tại "phân tích rừng giao lộ" sẽ nhanh chóng cung cấp cho bạn các tài liệu tham khảo, từ đó bạn có thể đào sâu hơn.

Ý tưởng cơ bản là tất cả các con đường phân tích cú pháp với việc xây dựng một khu rừng chung không gì khác ngoài việc xây dựng giao lộ cũ của Bar Hillel, Perles và Shamir cho một ngôn ngữ thông thường và ngôn ngữ không ngữ cảnh, sử dụng một máy tự động hữu hạn và ngữ pháp không ngữ cảnh. Đưa ra ngữ pháp CF, bạn áp dụng cấu trúc cho một máy tự động tầm thường chỉ nhận ra chuỗi đầu vào của bạn. Đó là tất cả. Khu rừng được chia sẻ chỉ là ngữ pháp cho giao lộ. Nó có liên quan đến ngữ pháp gốc thông qua một phép đồng hình, chỉ nhận ra chuỗi đã cho, nhưng với tất cả các cây phân tích của ngữ pháp gốc cho đến sự đồng hình đó (nghĩa là đổi tên đơn giản của các đầu cuối không).

Ngữ pháp kết quả chứa rất nhiều nội dung vô dụng, không phải là thiết bị đầu cuối và quy tắc, không thể truy cập được từ tiên đề (không được tìm thấy trong một chuỗi có nguồn gốc từ ký hiệu ban đầu) hoặc không có năng suất (không thể xuất phát từ thiết bị đầu cuối chuỗi).

Sau đó, hoặc bạn phải làm sạch nó bằng một bàn chải tốt ở cuối (có thể dài nhưng đơn giản về mặt thuật toán), hoặc bạn có thể cố gắng cải thiện cấu trúc để cuối cùng có ít lông tơ vô dụng hơn.

Ví dụ, cấu trúc CYK chính xác là như vậy, nhưng được tổ chức sao cho tất cả các quy tắc và các thiết bị đầu cuối được tạo ra đều có hiệu quả, mặc dù nhiều quy tắc có thể không truy cập được. Điều này được mong đợi từ một kỹ thuật từ dưới lên.

Các kỹ thuật từ trên xuống (chẳng hạn như các kỹ thuật dựa trên LR (k)) sẽ tránh các quy tắc không thể truy cập và các thiết bị đầu cuối, nhưng sẽ tạo ra các quy tắc không hiệu quả.

Tôi nghĩ rằng rất nhiều việc đánh răng có thể đạt được bằng cách sử dụng đầy đủ các con trỏ, nhưng tôi đã không xem xét điều này trong một thời gian dài.

Tất cả các thuật toán hiện có thực sự theo mô hình đó. Vì vậy, đó thực sự là trung tâm của vấn đề, và nó rất đơn giản. Vậy thì tại sao lại chôn nó trong sự phức tạp?

Nhiều "tối ưu hóa" được đề xuất trong phân vùng thường dựa trên gia đình trình phân tích cú pháp LR (k), LL (k), có thể với một số bao thanh toán tĩnh của các công trình này (Earley không có bao thanh toán tĩnh). Nó thực sự có thể được áp dụng cho tất cả các kỹ thuật đã biết, bao gồm các trình phân tích cú pháp ưu tiên cũ. Tôi đặt "tối ưu hóa" giữa các trích dẫn bởi vì nó thường không rõ ràng những gì bạn đang tối ưu hóa, hoặc thậm chí liệu bạn có thực sự tối ưu hóa nó hay không, liệu lợi ích của việc cải thiện có đáng để tăng độ phức tạp của trình phân tích cú pháp của bạn hay không. Bạn sẽ tìm thấy ít dữ liệu khách quan, chính thức hoặc thử nghiệm, về điều này (có một số), nhưng nhiều tuyên bố khác. Tôi không nói rằng không có gì quan tâm. Có một số ý tưởng thông minh.

Bây giờ, khi bạn đã biết ý tưởng cơ bản, "tối ưu hóa" hoặc cải tiến thường có thể được giới thiệu tĩnh (có thể tăng dần) bằng cách xây dựng một máy tự động đẩy xuống từ ngữ pháp, theo loại kỹ thuật xây dựng trình phân tích cú pháp mà bạn quan tâm, sau đó áp dụng cấu trúc sản phẩm chéo cho giao điểm với máy tự động đó (gần giống như thực hiện với ngữ pháp) hoặc với ngữ pháp bắt nguồn từ máy tự động đó.

Sau đó, bạn có thể giới thiệu chuông và còi, nhưng đó chủ yếu là các chi tiết công nghệ.

Philosophiæ Naturalis Principia Mathematica của Isaac Newton được cho là một phần lớn của vật lý và toán học. Tôi không nghĩ nó nằm trong danh sách đọc của nhiều sinh viên. Tất cả những thứ khác đều bằng nhau, tôi không nghĩ rằng nó rất hữu ích để dạy thuật toán của Earley, mặc dù nó là một phần lịch sử quan trọng. Học sinh có đủ để học như nó là. Có nguy cơ bị nhiều người bắn hạ, tôi nghĩ rất giống với bài báo Knuth LR (k). Nó là một phần tuyệt vời của phân tích lý thuyết, và có lẽ là một bài đọc quan trọng cho một nhà lý luận. Tôi hoàn toàn nghi ngờ rằng nó rất cần thiết cho việc xây dựng các trình phân tích cú pháp với tình trạng hiện tại của công nghệ, cả phần cứng và phần mềm. Thời gian đã qua khi phân tích cú pháp là một phần quan trọng của thời gian biên dịch, hoặc khi tốc độ của trình biên dịch là một vấn đề quan trọng (tôi biết một tập đoàn đã chết vì biên dịch chi phí khoảng 30 năm trước). Chuyên gia phân tích cú pháp có thể muốn học kiến ​​thức chuyên ngành đó tại một số điểm, nhưng sinh viên trung bình về khoa học máy tính, lập trình hoặc kỹ thuật không cần nó.

Nếu sinh viên phải dành nhiều thời gian hơn cho việc phân tích cú pháp, có những phần mở rộng khác có thể hữu ích hơn và có tính hình thức hơn, chẳng hạn như những phần mở rộng được sử dụng trong ngôn ngữ học tính toán. Vai trò đầu tiên của việc dạy học là trích xuất những ý tưởng đơn giản cấu trúc kiến ​​thức khoa học, không buộc sinh viên phải chịu đựng những gì các nhà khoa học nghiên cứu phải chịu (sinh viên tiến sĩ ngoại trừ: đó là một nghi thức của đoạn văn :-).

Giấy phép CC BY-SA 3.0 từ tác giả


2
"Earley ... quá phức tạp cho việc giảng dạy và có thể được thay thế bằng các thuật toán đơn giản hơn ...". Bạn có thể cung cấp một ví dụ về một thuật toán đơn giản như vậy?
wjl

@wjl Tôi trả lời bạn trong phần phụ lục cho câu trả lời ở trên. Tôi không chỉ ra một thuật toán cụ thể mặc dù bạn có thể tìm thấy một số trong phạm vi nếu bạn thực hiện một số tìm kiếm như tôi đề xuất. Tôi đã cố gắng giải thích tại sao rất dễ dàng để thực hiện các thuật toán đơn giản nhưng hiệu quả. Earley's có lẽ là phức tạp nhất trong tất cả. Giải thích về Bar Hillel et al. xây dựng là khoảng một nửa trang sách giáo khoa, nói một trang với bằng chứng.
babou

@wjl Trả lời yêu cầu của bạn đã làm tôi mất một thời gian. Nó có giúp bạn không? . . . . . Nếu bạn muốn có một thuật toán thực tế, có một liên kết cuối cùng của câu hỏi ban đầu.
babou

Vâng, cảm ơn; Tôi đánh giá cao các chi tiết bổ sung. Tôi đang làm việc trên một thư viện phân tích cú pháp tổng quát cho một số công việc tôi đang làm và đã thực hiện rất nhiều nghiên cứu về các thuật toán khác nhau. Tôi hiện đang nghiêng về triển khai kiểu sớm vì đối với tôi, nó dường như là một thuật toán rất dễ hiểu và rất dễ mở rộng sang các ngữ pháp kết hợp và các thiết bị đầu cuối "hộp đen" (có thể nhạy cảm với ngữ cảnh). Tôi đọc lướt qua và in ra một số giấy tờ mà bạn đã chỉ; nhưng tôi chưa đọc chúng một cách nghiêm túc.
wjl

@wjl Nếu đó là những gì bạn đang làm, bạn nên xem các chủ đề sau: ngôn ngữ nhạy cảm ngữ cảnh nhẹ, hệ thống viết lại không ngữ cảnh tuyến tính (LCFRS) và ngữ pháp ghép nối phạm vi. Không chắc chắn tôi hiểu thiết bị đầu cuối "hộp đen" là gì. - - email: babou tại inbox.com. - -
babou

5

Bài viết mô tả cách xây dựng một khu rừng phân tích nhị phân theo thời gian khối (được đề cập trong bài đăng của Angelo Borsotti) là: "Phân tích cú pháp theo kiểu SPPF từ Earley Recognators" của Elizabeth Scott. Bạn có thể tìm thấy nó ở đây: http://dx.doi.org/10.1016/j.entcs.2008.03.044

Trong bài viết này, việc xây dựng một khu rừng phân tích đóng gói chung (SPPF) được mô tả đại diện cho tất cả các cây phân tích có thể. Các cây con được chia sẻ bất cứ khi nào có thể và các nút tương ứng với các dẫn xuất khác nhau của cùng một chuỗi con từ cùng một nonterminal được kết hợp.


Cảm ơn con trỏ. Xây dựng rừng phân tích nhị phân trong thời gian khối là tiêu chuẩn. Binarization là cách duy nhất để có được thời gian khối, do đó, nhận xét của OP về kích thước ngữ pháp wrt phức tạp là không liên quan. Một vấn đề khác là để hiểu cách mà parse-Forest được tạo thành. Đó có thể là thuật toán phụ thuộc. Các vấn đề khác là số lượng chia sẻ trong rừng chia sẻ và hiệu quả thực tế của chiến lược phân tích cú pháp (Earley có thể là một ý tưởng tồi). Tất cả điều này được phát triển trong tài liệu tham khảo cuối cùng của OP. Một cái nhìn chính thức chung về vấn đề được phác họa trong câu trả lời của tôi.
babou

1

Tôi muốn lặp lại câu trả lời ở trên bằng cách đề nghị bạn đọc bài viết này:

http://dx.doi.org/10.1016/j.entcs.2008.03.044

Tôi muốn đủ điều kiện mặc dù bằng cách nói rằng tôi đã thực hiện thuật toán trong bài viết này và tôi tin rằng có lỗi. Cụ thể, câu đầu tiên của đoạn thứ hai của phần 4. Các nhãn tiền thân mà bạn tạo ra cho những gì Earley sẽ làm dịu giai đoạn "quét" nên chỉ từ p đến q chứ không phải ngược lại.

Cụ thể, dòng sau:

Đặt E0 là các mục (S :: = · α, 0). Với i> 0 khởi tạo Ei bằng cách thêm mục p = (A :: = αai · β, j) cho mỗi q = (A :: = α · aiβ, j) Ei − 1 và, nếu α =, tạo ra một con trỏ tiền nhiệm có nhãn i - 1 từ q đến p

Nên đọc "từ p đến q" chứ không phải "từ q đến p"

Tôi đã triển khai thuật toán như đã nêu ban đầu, nó đã cho tôi lỗi trên một số trường hợp thử nghiệm được xây dựng bằng tay, đã được sửa khi tôi thay đổi hướng của con trỏ ở đây.

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.