Создание машины вывода на Python
-
18-09-2019 - |
Вопрос
Я ищу направление и пытаюсь этикетка Эта проблема:
Я пытаюсь создать простую машину вывода (есть ли лучшее имя?) на Python, которая будет принимать строку и -
1 — создать список токенов, просто создав список значений, разделенных пробелами.
2 — классифицировать эти токены, используя регулярные выражения
3. Используйте набор правил более высокого уровня для принятия решений на основе категоризации.
Пример:
«90001» — один токен, соответствует регулярному выражению почтового индекса, существует правило для строка, содержащая только почтовый индекс вызывает определенное поведение
«30 + 14» — три токена, регулярные выражения для числового значения и математические операторы совпадают, существует правило для числовое значение, за которым следует математический оператор, за которым следует другое числовое значение вызывает определенное поведение
Я пытаюсь понять, как лучше всего выполнить шаг №3 — набор правил более высокого уровня.Я уверен, что какие-то рамки должны существовать.Есть идеи?И как бы вы охарактеризовали эту проблему?Система, основанная на правилах, экспертная система, машина вывода или что-то еще?
Спасибо!
Решение
Я очень удивлен, что шаг №3 доставляет вам неприятности...
Предполагая, что вы можете правильно пометить/классифицировать каждый токен (и что перед категоризацией вы можете найти правильные токены, поскольку может быть много неоднозначных случаев...), проблема «Шаг №3», кажется, может быть легко решена с помощью контекстно-свободной грамматики. где каждое из желаемых действий (например, поиск почтового индекса или вычисление математического выражения...) будет символом, а само его производственное правило состоит из возможных категорий токенов.Чтобы проиллюстрировать это в нотации BNF, мы могли бы иметь что-то вроде
<SimpleMathOperation> ::= <NumericalValue><Operator><NumericalValue>
Возможно, вас беспокоит то, что когда ситуация усложнится, вам станет трудно выразить все требование в терминах непротиворечивых грамматических правил.Или, может быть, вас беспокоит то, что можно добавлять правила динамически, тем самым заставляя логику «компиляции» грамматики интегрироваться с программой?Что бы вас ни беспокоило, я думаю, что этот третий шаг будет сравнительно тривиальным.
С другой стороны, если различные категории (и основной входной текст) не таковы, что их можно описать и на обычном языке (как вы, кажется, намекаете в вопросе), анализатор и классификатор текста (шаги № 1 и #2...), как правило, нетривиальное дело..
Некоторые примеры библиотек Python, которые упрощают написание и оценку грамматик:
Другие советы
Похоже, вы ищете библиотеку «грамматического вывода» (грамматической индукции).