natasha / yargy

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

Проблема даты прописью #87

Open tonal opened 1 year ago

tonal commented 1 year ago

В примерах есть правило для распознавание дат Getting started - Интерпретация и Нормализация В них день месяца и год записаны числами Как можно добавить распознавание и интерпретацию даты, где день и год может быть записан прописью? Например: Пятнадцатого июля две тысячи двадцать первого года. или Двадцать первого мая две тысяча девятсот восемьдесят первого года Пример для дня:

NUMS = {
  'один': 1, 'первый': 1,
  'два': 2, 'второй': 2,
  'три': 3, 'третий': 3,
  'четыре': 4, 'четвёртый': 4,
  'пять': 5, 'пятый': 5,
  'шесть': 6, 'шестой': 6,
  'семь': 7, 'седьмой': 7,
  'восемь': 8, 'восмой': 8,
  'девять': 9, 'девятый': 9,
  'десять': 10, 'десятый': 10,
  'одиннадцать': 11, 'одиннадцатый': 11,
  'двенадцать': 12, 'двенадцатый': 12,
  'тринадцать': 13, 'тринадцатый': 13,
  'четырнадцать': 14, 'четырнадцатый': 14,
  'пятнадцать': 15, 'пятнадцатый': 15,
  'шестнадцать': 16, 'шестнадцатый': 16,
  'семнадцать': 17, 'семнадцатый': 17,
  'восемнадцать': 18, 'восемнадцатый': 18,
  'девятнадцать': 19, 'девятнадцатый': 19,
  'двадцать': 20, 'двадцатый': 20,
  'тридцать': 30, 'тридцатый': 30,
}

DAY = or_(
  and_(gte(1), lte(31)).interpretation(Date.day.custom(int)),
  and_(gram('ADJF'), gram('Anum')).interpretation(Date.day.normalized().custom(NUMS.get)),
  rule(gram('NUMR'),   and_(gram('ADJF'), gram('Anum'))) # < Какая здесь должна быть интерпретация чтобы получить число?
)

Как написать интерпретацию для двухзначных чисел в числовую форму? Или это только постобработкой?

kuk commented 1 year ago

Я бы просто выписал все двузначные числа:


DAYS = {
    ...
    'двадцать первый': 21,
    'двадцать второй': 22,
    ...
}
DAY = morph_pipeline(
    DAYS.keys()
).interpretation(Date.day.normalized().custom(DAYS.get))
tonal commented 1 year ago

А с годом как быть - тоже все выписать?