top-down vs. bottom-up

Apr 21, 2013 11:42


Сделал в нисходящем парсере экспериментальное расширение, которое вплотную приближает его возможности в плане устойчивости к появлению неразбираемых фрагментов в предложении к восходящему алгоритму.

Расширение полностью интегрировано в основной алгоритм, поэтому никаких переписываний набора правил не требуется. Достаточно добавлять в набор новые правила с особым флагом, и парсер начнет делать следующее.

Допустим, на входе у нас есть предложение с большим количеством "мусора":

w1 w2 я w3 w4 w5 вижу w6 w7 w8 книжку

Обход "лишних" слов выходит за обычные возможности правил пропуска токенов, так как каждое применение такого правила автоматически порождает ветвление процесса разбора на 2 ветки, и для нескольких пропусков число вариантов становится слишком большим. А расширенный алгоритм сопоставления умеет работать с такими контекстами за счет того, что он ищет все возможные комбинации сопоставлений аргументов, автоматически пропуская непонятные фрагменты.

Вот что получается в простейшем (тестовом) случае:




С выделенными ключевыми моментами:



Текущая реализация просто выкидывает пропускаемые слова, даже не привязывая их в дерево. Возможно, этот момент надо будет изменить, чтобы, к примеру, постпроцессором допривязывать оторванные атрибуты существительных в таких предложениях:

какие же это приятные вечера!

Второе расширение, которое прямо вытекает из вышеописанного - теперь можно писать правила, которые будут сами проверять все возможные перестановки своих аргументов при сопоставлении с контекстов. Другими словами, написав правило

сказуемое := подлежащее глагол дополнение

теперь можно поставить флажок и правило будет сопоставляться с

книгу я вижу

вижу книгу я

и так далее

top-down parsing, синтаксический анализатор

Previous post Next post
Up