Распознать дату прописью
Мне необходимо обеспечить распознавание дат прописью с помощью ner-системы (сейчас используется natasha).
То есть, есть текст даты "двадцать восьмое февраля две тысячи первого года" и нужно извлечь эту дату. Как это можно сделать?
Пример, который не дает нужный результат (блок кода не находит данных):
matches = dates_extractor(doc.text)
v_dt_cnt = 0
for val in matches:
obj_t = val.fact
print(' Date', v_dt_cnt)
Update: пример кода, который можно запустить
from natasha import (
MorphVocab,
DatesExtractor
)
morph_vocab = MorphVocab()
dates_extractor = DatesExtractor(morph_vocab)
for text in ("28 февраля 2001 года",
"двадцать восьмое февраля 2001",
"28 февраля две тысячи первого года",
"двадцать восьмое февраля две тысячи первого года"):
print(text)
for date in dates_extractor(text):
print(date)
print('---')
Вывод:
28 февраля 2001 года
Match(start=0, stop=20, fact=Date(year=2001, month=2, day=28))
---
двадцать восьмое февраля 2001
Match(start=17, stop=29, fact=Date(year=2001, month=2, day=None))
---
28 февраля две тысячи первого года
Match(start=0, stop=10, fact=Date(year=None, month=2, day=28))
---
двадцать восьмое февраля две тысячи первого года
---
Ответы (1 шт):
Автор решения: Алексей Сундеев
→ Ссылка
from natasha import MorphVocab, DatesExtractor
from word2number import w2n
import re
# Функция для замены чисел прописью на числовые значения
def replace_words_with_numbers(text):
words = text.split()
for i, word in enumerate(words):
try:
# Преобразуем число прописью в числовое значение
words[i] = str(w2n.word_to_num(word))
except ValueError:
# Если слово не число, просто оставляем его как есть
pass
return " ".join(words)
morph_vocab = MorphVocab()
dates_extractor = DatesExtractor(morph_vocab)
for text in ("28 февраля 2001 года",
"двадцать восьмое февраля 2001",
"28 февраля две тысячи первого года",
"двадцать восьмое февраля две тысячи первого года"):
# Преобразуем текст с числами прописью в числовые значения
text_with_numbers = replace_words_with_numbers(text)
print(f"Исходный текст: {text}")
print(f"Текст с числовыми значениями: {text_with_numbers}")
for date in dates_extractor(text_with_numbers):
print(date)
print('---')
Функция replace_words_with_numbers()
заменяет числа, написанные прописью, на их числовые эквиваленты:
Исходный текст: 28 февраля 2001 года
Текст с числовыми значениями: 28 февраля 2001 года
Match(start=0, stop=20, fact=Date(year=2001, month=2, day=28))
---
Исходный текст: двадцать восьмое февраля 2001
Текст с числовыми значениями: 28 февраля 2001
Match(start=0, stop=20, fact=Date(year=2001, month=2, day=28))
---
Исходный текст: 28 февраля две тысячи первого года
Текст с числовыми значениями: 28 февраля 2001 года
Match(start=0, stop=20, fact=Date(year=2001, month=2, day=28))
---
Исходный текст: двадцать восьмое февраля две тысячи первого года
Текст с числовыми значениями: 28 февраля 2001 года
Match(start=0, stop=20, fact=Date(year=2001, month=2, day=28))
---