yargy icon indicating copy to clipboard operation
yargy copied to clipboard

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

Open tonal opened this issue 1 year ago • 2 comments

В примерах есть правило для распознавание дат 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'))) # < Какая здесь должна быть интерпретация чтобы получить число?
)

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

tonal avatar Aug 12 '23 09:08 tonal

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

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

kuk avatar Aug 21 '23 05:08 kuk

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

tonal avatar Aug 22 '23 07:08 tonal