natasha / yargy

Rule-based facts extraction for Russian language
MIT License
315 stars 40 forks source link

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

Closed dveselov closed 4 years ago

dveselov commented 7 years ago

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

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

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

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

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

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')]
​