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