Чи може Ерлі Парсер перетворитись у нечіткий аналізатор, подібний до Algo Levenshtein Automata для DFA?


10

Існує спосіб виконати нечіткий синтаксичний аналіз (приймає рядки навіть з помилками помилок на певну відстань редагування), з DFA та автоматизованими автоматами Levenshtein, введеними під час введення слова. Чи можна зробити щось подібне з аналізатором Ерлі? Мені важко зрозуміти алгоритм, не кажучи вже про відповідь на це питання.


1
Добре, що КПК закрито проти багатьох операцій з NFA, тому це повинно бути можливим в принципі. Адаптація Ерлі, здається, є вправою на ротацію, оскільки нам дозволяється використовувати лічильники в предметах. Я щось пропускаю?
Рафаель

@Raphael Так. Це загальна ідея. Моя відповідь довша, оскільки важко оцінити, що знають або не знають користувачі.
бабу

plz цитуйте ref / sketch defn для "Levenshtein Automata". знаєте одного, який може бути кваліфікованим, але до якого ви звертаєтесь?
vzn

Відповіді:


8

Відповідь - так. Однак я б не робив цього з аналізатором Ерлі, оскільки є більш прості з тими ж можливостями.

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

Є два способи (принаймні) розуміння цих парсерів:

  • як інтерпретація динамічного програмування автоматичного віджимання, що відповідає граматиці вхідного рядка;

  • як побудова перетину граматики з автоматикою скінченного стану.

Під час розбору одного рядка розглянутий автомат з кінцевим станом є лінійним автоматом, який розпізнає лише рядок що підлягає розбору, по одному символу за один раз (кількість стану дорівнює ). Якщо застосувати конструкцію крос-продукт FA і CF garmmar (Bar Гилеля, Перлис, Шамір 1961), ви отримаєте нову граматику CF , яка є новою граматиці , який генерує . Цікавим моментом зазвичай є те, що зберігає дерева розбору, використовувані , аж до нетермінальних перейменувань (за рахунок перехресного продукту).w|w|+1AGFL(A)L(G)FG

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

Ця граматика - це те, що зазвичай називають лісом спільного розбору , а всі загальні алгоритми розбору CF - це більш-менш оптимізована версія конструкції перехресних продуктів, будь то CYK, Earley, узагальнений LR або LL або інші. Тому все, що я говорю, стосується і них.F

Але, як бачите, це узагальнює аналіз цілого регулярного набору, якщо хтось зацікавлений у цьому.

Це саме ваше питання. У вас є рядок . Ви хочете , щоб розібрати його до деяких варіацій , які визначаються кінцевим числом станів перетворювача, який у вашому випадку є перетворювач , який виробляє всі рядки в межах деякого заданого Левенштейн редагування відстані від (але походження датчика не має значення). Набір цих рядків - це звичайний набір, який можна визначити FA, із зваженим переходом, який може обчислити відстань редагування кожного рядка.ww

Якщо ви робите перехресний добуток зі своєю граматикою , ви отримаєте загальну лісову граматику розбору яка генерує всі рядки в перетині. Крім того, ви отримуєте ваги за деякими правилами, щоб ви могли обчислити відстань редагування кожної з прийнятих рядків.GF

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

Однак це можна трохи покращити, оскільки композиція з машинами з кінцевим станом є асоціативною.

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

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


думаю, що це корисно, але також, можливо, "занадто багато читати" у запитанні, тому сказати щось на кшталт "це саме ваше питання" насправді не може бути точним. ви взяли досить розпливчасте запитання, яке не суворо формалізоване, і (намагалися?) формалізувати його самостійно. мабуть, існує більше ніж один спосіб формалізувати оригінальну дещо розпливчасту ідею. думаю, може бути корисним перше ретельно визначити, що роблять конструкції Levenshtein DFA (є деякі відомі / досліджені, але про які ми говоримо?), а потім пояснити, як цю концепцію можна узагальнити до CFL.
vzn

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