Не практике редко нужно повторение бесконечное число раз. Также .repeatable может приводить к "взрывам" по памяти и времени выполнения. Также пользователи уже несколько раз просили возможность ограничить число повторений .repeable
Раньше такую функциональность можно было получить вручную:
Иногда грамматика бывает неоднозначной. Когда пользователь вызывает .match возвращается, на самом деле, какой-то один случайный разбор. Когда пользователь вызывает .findall возвращается самый длинный метч, но когда метчи одного размера из них опять выбирается один случайный. Например есть грамматика
Строчка a b a b может иметь разборы (a b) (a b), (a) (b) (a b), (a b) (a) (b), (a) (b) (a) (b). Раньше нельзя было гарантировать какой вернётся первым. Сейчас возвращается самый левый разор (a b) (a b)
Если бы было
ITEM = or_(
rule('a'),
rule('b')
rule('a', 'b')
)
вернулся бы (a) (b) (a) (b)
То есть теперь порядок аргументов в or_ влияет на результат.
Аргумент tagger в Parser
Раньше CRF-теггер предлагалось использовать через токенизатор. Делать TagMorphTokenizer(CrfTagger(...)). Это не очень удобно и неочевидно. Теперь предлагается задавать теггер отдельным аргументом Parser(RULE, tagger=CrfTagger(...))
Более оптимальная реализация match. Парсер не пытается начать применять правило с каждого токена, применяет только к первому
.repeatable
можно указывать аргументыmin
,max
Не практике редко нужно повторение бесконечное число раз. Также
.repeatable
может приводить к "взрывам" по памяти и времени выполнения. Также пользователи уже несколько раз просили возможность ограничить число повторений.repeable
Раньше такую функциональность можно было получить вручную:
Сейчас можно написать
.repeatable(max=3)
. Какой-то низкоуровневой поддрежки в парсере нет. Выражение просто разворачивается вИногда грамматика бывает неоднозначной. Когда пользователь вызывает
.match
возвращается, на самом деле, какой-то один случайный разбор. Когда пользователь вызывает.findall
возвращается самый длинный метч, но когда метчи одного размера из них опять выбирается один случайный. Например есть грамматикаСтрочка
a b a b
может иметь разборы(a b) (a b)
,(a) (b) (a b)
,(a b) (a) (b)
,(a) (b) (a) (b)
. Раньше нельзя было гарантировать какой вернётся первым. Сейчас возвращается самый левый разор(a b) (a b)
Если бы было
вернулся бы
(a) (b) (a) (b)
То есть теперь порядок аргументов в
or_
влияет на результат.tagger
вParser
Раньше CRF-теггер предлагалось использовать через токенизатор. Делать
TagMorphTokenizer(CrfTagger(...))
. Это не очень удобно и неочевидно. Теперь предлагается задавать теггер отдельным аргументомParser(RULE, tagger=CrfTagger(...))
match
. Парсер не пытается начать применять правило с каждого токена, применяет только к первому