yargy
yargy copied to clipboard
Проблема даты прописью
В примерах есть правило для распознавание дат 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'))) # < Какая здесь должна быть интерпретация чтобы получить число?
)
Как написать интерпретацию для двухзначных чисел в числовую форму? Или это только постобработкой?
Я бы просто выписал все двузначные числа:
DAYS = {
...
'двадцать первый': 21,
'двадцать второй': 22,
...
}
DAY = morph_pipeline(
DAYS.keys()
).interpretation(Date.day.normalized().custom(DAYS.get))
А с годом как быть - тоже все выписать?