natasha / yargy

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

Как задать rule с ограничением все кроме... #68

Closed edgar2597 closed 5 years ago

edgar2597 commented 5 years ago

Как задать rule с ограничением все кроме... То есть если в тексте есть дата "06.12.2018" и время "07.20" и нужно извлекать время , как можно в rule для парсера настроить ограничение что наличие последующей точки после минуты означало бы что вариант не подходит? Я не нашел подобного в справочнике

kuk commented 5 years ago

Написать 2 правила: для даты и для времени. Извлекать обе сущности, для "06.12.2018" сработает правило для даты потому что у него выше покрытие (метч длиннее). Дальше метчи для даты игнорировать

edgar2597 commented 5 years ago

ок, но разве можно извлекать две сущности одновременно? то есть я создал два отдельных правила для времени и для даты, но как их можно применить одновременно для одного парсера?

kuk commented 5 years ago
A = rule(...)
B = rule(...)
С = or_(A, B)
parser = Parser(C)
parser.findall(...)
edgar2597 commented 5 years ago

но с таким парсером нельзя извлекать факты for match in parser.findall(text): print(match.fact). Выдается ValueError: no .interpretation(...) for root rule

kuk commented 5 years ago

Можно ввести прокси-факт с одним полем:

AFact = fact(...)
BFact = fact(...)
CFact = fact('C', ['value'])

A = rule(...).interpretation(AFact).interpretation(CFact.value)
B = rule(...).interpretation(BFact).interpretation(CFact.value)
С = or_(A, B).interpretation(CFact)

parser = Parser(C)
for match in parser.findall(...):
    print(match.fact.value)