Відновлення лісу розбору з аналізатора Ерлі?


25

Я нещодавно читав про парсер Earley і думаю, що це один з найелегантніших алгоритмів, які я бачив на сьогоднішній день. Однак алгоритм у його традиційному розумінні є розпізнавачем, а не парсером, це означає, що він може виявити, чи відповідає рядок відповідно до певного CFG, але не створити для нього розбір дерева. Моє запитання полягає в тому, як відновити не дерево розбору , а швидше ліс розбору всіх можливих синтаксисів даного вхідного рядка.

У "Гріні та Якобі" "Техніка розбору: практичний посібник" вони ілюструють алгоритм, який може бути використаний для відновлення лісу розбору з результату розпізнавача Ерлі, але він заснований на методі розбору Унгера, час виконання якого становить O (n k + 1 ), де k - тривалість найдовшого виробництва в граматиці. Це означає, що час виконання не є поліномом за розміром граматики. Більше того, оригінальний документ Ерлі про алгоритм, який пропонує алгоритм відновлення лісів розбору, є неправильним (див., Наприклад, сторінка 762 цієї статті від Tomita), хоча багато джерел досі цитують це як відповідний спосіб відновити ліс розбору .

Моє запитання - чи можна за полиномний час відновити ліс розбору для заданого вхідного рядка. Я знайшов документ тут , який забезпечує алгоритм для отримання кубічного розміру розбору лісового уявлення для будь-якого синтаксичного аналізу з допомогою моделювання КПК, так що здається , що це має бути можливо, але я до сих пір знайти спосіб зробити це. В ідеалі я хотів би це зробити, не перетворюючи вхідну граматику в CNF (що дійсно вирішило б проблему), оскільки отриманий розбір лісу був би досить безладним.

Дякуємо за будь-яку допомогу, яку Ви можете запропонувати!


Чи повинен це бути алгоритм, заснований на синтаксичному розборі Earley, чи ви не заперечуєте проти використання іншого загального аналізатора CFG?
Алекс десять Бринк

1
Я вважаю за краще алгоритм, заснований на аналізаторі Ерлі. Я викладав курс компіляторів і витратив кілька днів, намагаючись знайти відповідь на це запитання, і це насправді клопоче мене.
templatetypedef

Експоненціальні періоди виконання не дивно, оскільки слова можуть мати експоненціально багато дерев розбору. Насправді їх навіть може бути нескінченно багато, якщо дозволити довільні CFG.
Рафаель

3
@Raphael Роль розбору лісів полягає саме в тому, щоб мати механізм спільного використання, який дозволить представляти всі дерева, навіть нескінченно багато, з кінцевою структурою, з невеликою космічною складністю. Звичайно, це може залишити певну роботу для дроворубів.
бабу

Можливо, ви захочете подивитися на Марпу . Це модуль Perl та бібліотека C, який реалізує парсер Earley і має повну підтримку розбору лісу.
hippietrail

Відповіді:


14

Це, звичайно, залежатиме від правильного подання для "упакованого лісу", який представляє всі дерева розбору для заданого речення.

Я думаю, що місце, яке ви хочете почати шукати, - це дисертація Джошуа Гудмена (розбір зсередини, Гарвард, 1999). В основному ідея полягає в тому, що можна визначити алгоритм розбору під певним семіруванням. Залежно від семірування, ви могли б обчислити всі види величин і структур замість голого дерева розбору (як розпізнавач або як аналізатор). Одне семірування, яке ви могли б визначити (що Гудман робить у своїй дисертації), - це семірінг, де значеннями є набори синтаксичних аналізів. Коли ви врешті-решт закінчите розбір речення, ви отримаєте всі дерева розбору в головному вузлі розбору.

Знову ж таки, ви повинні бути обережними, щоб зробити це можливим через правильне представлення.


Дякую за довідку! Це виглядає як чудовий ресурс, і я збираюся витратити деякий час на його перегляд.
templatetypedef

8

Існує документ, в якому описано, як це зробити:

Розбір у стилі SPPF від Early Recognisers від Елізабет Скотт

У ньому описано, як побудувати ліс з двоканальним розбором за кубічний час.


2
Здається, ця ланка зараз зламана. Чи є у вас посилання (назва статті, де публікується, список авторів) та / або оновлене посилання?
DW

1
Дивіться web.archive.org/web/20130508170633/http://thor.info.uaic.ro/… : "SPPF-стиль, який проходить від визнавальників Earley", Елізабет Скотт. Ще одне посилання: dinhe.net/~redridel/.notmine/PDFs/… .
a3nm

Це правильна відповідь на питання "як отримати ліс розбору від визнання Ерлі".
тобто

Тут є приємна реалізація цього в JS: joshuagrams.github.io/pep
tjvr

Що розуміється під бінарнізацією в цьому контексті?
Брюс Адамс

6

Вам ніколи не потрібен CNF. У нього є недолік зміни граматичної структури. Але вам потрібно ввести проміжні нетермінали, щоб жодна права частина не була довшою 2 (2-форми), оскільки довжина RHS визначає складність. Найкраща спроба пояснити, що інтуїтивно - якщо пам'ять слугує, - це документ Боу Шіела, «Спостереження за контекстом, вільним розбором», опублікований у 1976 році на конференції з комп'ютерної лінгвістики. Алгоритм Ерлі неявно використовує 2-форму. Це просто приховано в алгоритмі. Що стосується відновлення та обробки лісу розбору, вам слід подивитися в Інтернеті "розбір лісу перехрестя". Це насправді дуже прямо. Багато паперів є в Інтернеті, якщо ви отримуєте (із цитат або змістовних таблиць) заголовки або авторів, щоб безпосередньо шукати їх.

Насправді, ти можеш зробити набагато більше, ніж CF, і все-таки отримати розбір лісів за багаточлен. Іноді виникає питання: що ти можеш зробити з цим, як тільки маєш?

Однією метою останньої статті, яку ви згадуєте, є показати, що складні алгоритми (наприклад, GLR) не обов'язково купують щось у часі чи в просторі, і можуть змінити ваш ліс розбору.

Одне зауваження щодо викладання. Я вважаю, що Ерлі, як і раніше, був надто складним для викладання, і його можна було б замінити більш простими алгоритмами з по суті однаковим навчальним змістом. Навчання - це поняття чи технології. В алгоритмі Ерлі істотні поняття приховані в складності деталей, а з технологічної точки зору вона застаріла. Це був чудовий документ, але це не означає, що це найкращий педагогічний підхід.

У літературі з обчислювальної лінгвістики може бути більше інформації, ніж у звичайних каналах інформатики. У мене немає книги Ceriel-Grune-Jacobs, але я був би здивований, якби у них не було всіх належних посилань (хоча я не впевнений у їхніх критеріях відбору).


Доповнення після запиту в коментарі (7 липня 2013 р.)

Це доповнення зміцнює існування більш простих алгоритмів, ніж Ерлі.

Як я вже говорив, пошук в Інтернеті за «лісом розбиття перехрестя» повинен швидко дати вам посилання, з яких ви зможете викопати далі.

Основна ідея полягає в тому, що всі шляхи, що розбиваються на будівництво спільного лісу, є не що інше, як стара конструкція перехрестя Бар Гіллеля, Перлеса і Шаміра для звичайної мови та без контекстної мови, використовуючи кінцевий автомат і без граматики, що не стосується контексту. Враховуючи граматику CF, ви застосовуєте конструкцію до тривіального автомата, який розпізнає лише ваш вхідний рядок. Це все. Спільний ліс - лише граматика для перехрестя. Він пов'язаний з початковою граматикою через гомоморфізм, розпізнає лише заданий рядок, але з усіма деревами розбору оригінальної граматики аж до цього гомоморфізму (тобто простого перейменування нетерміналів).

Отримана граматика містить безліч непотрібних речей, нетерміналів і правил, які є недосяжними від аксіоми (їх не можна знайти в рядку, похідних від початкового символу), або непродуктивними (не можуть бути виведені в термінал рядок).

Тоді або вам доведеться чистити її гарною щіткою в кінці (можливо, довгою, але алгоритмічно простою), або ви можете спробувати вдосконалити конструкцію, щоб в кінцевому підсумку було менше корисного пуху.

Наприклад, конструкція CYK саме така, але організована так, що всі створені правила та нетермінали є продуктивними, хоча багато хто може бути недосяжним. Цього можна очікувати від техніки знизу вгору.

Методики зверху вниз (такі як LR (k)) дозволять уникнути недосяжних правил та нетерміналів, але створять непродуктивні.

Дуже багато чищення зусиль можна досягти за рахунок адекватного використання покажчиків, я думаю, але на це я довго не дивився.

Усі існуючі алгоритми фактично дотримуються цієї моделі. Отже, це справді суть справи, і це дуже просто. Тоді навіщо закопувати його в складності?

У літературі пропонується багато "оптимізацій", які часто базуються на сімействі парсерних конструкцій LR (k), LL (k), можливо, з деяким статичним фактором цих конструкцій (Ерлі не має статичного факторингу). Він фактично може бути застосований до всіх відомих методик, включаючи старі аналізатори пріоритету. Я ставлю "оптимізацію" між цитатами, тому що зазвичай не зрозуміло, що ви оптимізуєте, або навіть, чи оптимізуєте ви насправді, чи вигода від поліпшення варте додаткової складності вашого аналізатора. Ви знайдете мало об’єктивних даних, формальних або експериментальних, щодо цього (є деякі), але багато інших претензій. Я не кажу, що нічого цікавого немає. Є кілька розумних ідей.

Тепер, коли ви знаєте основну ідею, "оптимізацію" або вдосконалення часто можна запровадити статично (можливо, поступово), побудувавши граматичний автомат із граматики, дотримуючись цікавого типу побудови парсера, а потім застосувати конструкція перехресного продукту для перетину до цього автомата (майже те саме, що робити з граматикою) або до граматики, отриманої з цього автомата.

Потім можна ввести дзвіночки, але це переважно технологічні деталі.

Як повідомляється, "Philosophiæ Naturalis Principia Mathematica" Ісаака Ньютона є чудовим предметом фізики та математики. Я не думаю, що це є у списку читання багатьох студентів. За інших рівних речей я не вважаю дуже корисним вчити алгоритм Ерлі, хоча це важливий історичний фрагмент. Студентам достатньо навчитися так, як це є. Загрожуючи збитими багатьма людьми, я думаю, що це так само і для паперу Knuth LR (k). Це чудовий фрагмент теоретичного аналізу і, мабуть, важливе читання для теоретика. Я сильно сумніваюся, що це так важливо для побудови аналізаторів, враховуючи сучасний стан технології, як апаратного, так і програмного забезпечення. Минули часи, коли синтаксичний аналіз був важливою частиною часу складання, або коли швидкість компіляторів була критичною проблемою (я знав одну корпорацію, яка померла від складання витрат приблизно 30 років тому). Фахівець з розбору може захотіти дізнатися, що спеціалізовані знання в якийсь момент, але пересічному студенту з інформатики, програмування чи інженерії цього не потрібно.

Якщо учням потрібно витратити більше часу на розбір, є інші розширення, які можуть бути кориснішими та більш формувальними, наприклад, такі, які використовуються в обчислювальній лінгвістиці. Перша роль викладання - це витягнути прості ідеї, що структурують наукові знання, а не змушувати студентів страждати від того, що мусили зазнати науковці (докторанти виняткували: це обряд проходження :-).

Ліцензія CC BY-SA 3.0 від автора


2
"Ерлі ... є занадто складним для викладання, і його можна буде замінити більш простими алгоритмами ...". Чи можете ви навести приклад такого більш простого алгоритму?
wjl

@wjl Я відповідаю вам у додатку до відповіді вище. Я не вказую на конкретний алгоритм, хоча ви можете знайти його в літературі, якщо здійснити пошук, як я рекомендую. Я швидше намагався пояснити, чому зробити простіші, але ефективні алгоритми дуже просто. Ерлі, мабуть, найскладніший з них. Пояснення адвоката Bar Hillel та ін. конструкція - це близько половини сторінки підручника, скажімо, сторінка з доказом.
babou

@wjl Відповідь на ваш запит у мене зайняла деякий час. Вам це допомогло? . . . . . Якщо вам потрібен власне алгоритм, в останньому посиланні початкового питання є одне .
бабу

Так дякую; Я ціную додаткову деталь. Я працюю над узагальненою бібліотекою парсера над деякою роботою, яку я роблю, і роблю багато досліджень різних алгоритмів. В даний час я схиляюсь до реалізації в ранньому стилі, оскільки, як мені здалося, алгоритм дуже легко зрозуміти, і його легко поширити на кон'юнктивні граматики та термінали "чорної скриньки" (можливо, залежно від контексту). Я знімав і роздруковував деякі папери, на які ви вказували; але я їх ще не начитався серйозно.
wjl

@wjl Якщо ви цим займаєтесь, вам слід переглянути наступні теми: м'яко залежні від контексту мови, лінійні системи безперебійного переписування (LCFRS) та граматики конкатенації діапазону. Не впевнений, що я розумію, що таке термінал "чорний ящик". - - email: babou на inbox.com. - -
бабу

5

Документ, що описує, як побудувати бінарний розбір лісу за кубічний час (згадується у дописі Анджело Борсотті): Ви можете знайти його тут: http://dx.doi.org/10.1016/j.entcs.2008.03.044

У цьому документі описана побудова загального упакованого лісу розбору (SPPF), який представляє всі можливі дерева розбору. Піддерева діляться, коли це можливо, і вузли, що відповідають різним похідним одного і того ж підрядка з одного і того ж нетерміналу, поєднуються.


Дякуємо за вказівник. Будівництво бінарних розбірних лісів у кубічний час є стандартним. Бінаризація - єдиний спосіб отримати кубічний час, так що зауваження ОП щодо складності розміру граматики wrt не має значення. Інше питання полягає в тому, щоб зрозуміти, яким способом розбирається ліс розбору. Це може залежати від алгоритму. Інші питання - кількість спільного використання в спільному лісі та практична ефективність стратегії розбору (Ерлі може бути поганою ідеєю). Все це розроблено в останній довідці ОП. Загальний офіційний погляд на це накреслений у моїй відповіді.
бабу

1

Я хотів би повторити відповіді вище, пропонуючи вам прочитати цей документ:

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

Я хотів би кваліфікуватись, сказавши, що я реалізував алгоритм у цій роботі, і я вважаю, що є помилка. Зокрема, перше речення другого пункту розділу 4. Мітки попередників, які ви робите для того, що Ерлі назвав би фазою "сканування", повинен вказувати від p до q, а не навпаки.

Зокрема, наступний рядок:

Встановіть E0 як елементи (S :: = · α, 0). Для i> 0 ініціалізуйте Ei шляхом додавання елемента p = (A :: = αai · β, j) для кожного q = (A :: = α · aiβ, j) ∈ Ei − 1 і, якщо α =, створимо a попередник покажчика з позначкою i - 1 від q до p

Слід читати "від p до q", а не "від q до p"

Я реалізував алгоритм так, як це було зазначено спочатку, що дав мені помилки на деяких ручних побудованих тестових випадках, які були виправлені, коли я змінив напрямок вказівника тут.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.