natasha / yargy

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

Из документации не понял как пропускать некоторые части предложения при разборе #44

Closed arturgspb closed 7 years ago

arturgspb commented 7 years ago

Например у меня есть:

"Привет! Вышлите плиз отчет по клиенту Трололо за июль 2017"

Структура у меня такая

EntityFact = fact(
    'EntityFact',
    ['do', 'action', 'entity', 'name', 'date']
)

Т.е. do = вышлите action = отчет entity = по клиенту name = Трололо date = июль 2017

Часть кода, который разбирает это

class DoPipeline(MorphPipeline):
    grammemes = {'Do'}
    keys = [
        'скиньте',
        'вышлите',
        'дайте',
        'сделайте',
        'пришлите'
    ]

class ActionPipeline(MorphPipeline):
    grammemes = {'Action'}
    keys = [
        'статистика',
        'отчет',
        'закрывающие документы',
        'закрывашки',
        'акты'
    ]

Как мне сделать так, чтобы парсер не учитывал неизвестные ему части предложения между "do" и "action". Т.е. чтобы он фактически не воспринимал ничего лишнего между "Вышлите" и "отчет", сейчас всякие "плиз", "быстрее" и пр делают так, что парсер отказывается парсить. Тоже самое с датами - люди пишут "... Трололо за ДАТА" или просто "... Трололо ДАТА" при этом не хочется вести список разрешенных предлогов.

Есть варианты?

kuk commented 7 years ago
from yargy import rule, not_
from yargy.predicates import gram

DO = gram('Do')
ACTION = gram('Action')
RULE = rule(
    DO.interpretation(
        EntityFact.do
    ),
    not_(ACTION).repeatable().optional(),
    ACTION.interpretation(
        EntityFact.action
    )
)
arturgspb commented 7 years ago

Спасибо большое!