Для многих задач всё активнее применяются нейросети, вытесняя другие решения. Однако у нейросетей как инструмента есть свои погрешности — дороговизна вычислительных ресурсов, необходимость в качественном большом датасете для обучения, долгий цикл изменений с зачастую нестабильными результатами, высокий latency.
Порой перед нами стоят задачи на высокоскоростную работу с большим потоком семантически и грамматически обогащённых данных. Как в моем случае, выделение структурированных NER-сущностей с возможностью корректирования правил их построения. И здесь на помощь приходят старые добрые парсеры грамматик. Благодаря наличию структуры у сущностей Rust и его trait-ы и дженерики отлично сочетаются с мета-правилами двухуровневых грамматик и помогают создавать лаконичное и высокопроизводительное решение.
И даже больше, такая система может быть не только самостоятельным обработчиком, но и стать дополнительным слоем постобработки для небольшой нейромодели, сокращая погрешности. На небольшом количестве параметров можно выделить границы общей сущности, а данному парсеру остаётся лишь сосредоточиться на филигранной обработке подсущностей.