Мне нужен синтаксический анализ небольшого подмножества английского языка для одного из моих проектов, который описывается как контекстно-свободная грамматика с (1-уровневыми) структурами функций (example), и мне нужно сделать это эффективно.
Сейчас я использую парсер NLTK, который производит правильный вывод, но очень медленный. Для моей грамматики ~ 450 довольно двусмысленных правил без лексики и полмиллиона лексических записей разбор простых предложений может занимать от 2 до 30 секунд, в зависимости от количества полученных деревьев. Лексические записи практически не влияют на производительность.
Другая проблема заключается в том, что загрузка (25 МБ) грамматики + лексика в начале может занять до минуты.
Из того, что я могу найти в литературе, время работы алгоритма, используемого для синтаксического анализа такой грамматики (Earley или CKY), должно быть линейным по размеру грамматики и кубика до размера списка входных токенов. Мой опыт работы с NLTK показывает, что двусмысленность - это то, что больше всего влияет на производительность, а не на абсолютный размер грамматики.
Итак, теперь я ищу парсер CFG для замены NLTK. Я рассматривал PLY, но не могу сказать, поддерживает ли он функциональные структуры в CFG, которые требуются в моем случае, и примеры, которые я видел похоже, делают много процедурного анализа, а не просто определяют грамматику. Может ли кто-нибудь показать мне пример PLY как с поддержкой структур функций, так и с помощью декларативной грамматики?
Я тоже хорошо разбираюсь в любом другом синтаксическом анализаторе, который может делать то, что мне нужно. Интерфейс Python является предпочтительным, но не абсолютно необходимым.