natasha/yargy

Добавить возможность разбивать совпадение на несколько фактов

dveselov opened this issue · 1 comments

Например, есть такой текст:

Смольный определит победителей конкурса на оформление Дворцового, Троицкого, Большеохтинского, Первого Инженерного и Первого Садового, Пантелеймоновского и Нижнего Лебяжьего мостов в Санкт-Петербурге к Новому 2018 году и Рождеству

Хотелось бы иметь возможность извлекать название каждого моста по отдельности:

Location(name='дворцовый мост'),
Location(name='троицкий мост'),
Location(name='большеохтинский мост'),
...
kuk commented

Такое предполагается делать на пост обработке.

from yargy import Parser, rule
from yargy.interpretation import fact, attribute


Objs = fact('Objs', [attribute('names').repeatable(), 'type'])


class Objs(Objs):
    def unfold(self):
        for name in self.names:
            yield name, self.type


OBJS = rule(
    rule('name').interpretation(Objs.names).repeatable(),
    rule('type').interpretation(Objs.type)
).interpretation(Objs)


parser = Parser(OBJS)
text = 'name name name type'
match = parser.match(text)
list(match.fact.unfold())

[('name', 'type'), ('name', 'type'), ('name', 'type')]
​