Вы можете использовать библиотеку dateparser .
import dateparser
nl_dates = ["last week of july", " in june", "last month", "last n days"]
for nl_date in nl_dates:
res = dateparser.parse(nl_date)
if res:
print('"{}"": {}'.format(nl_date,res.date()))
" in june": 2019-06-12
"last month": 2019-05-12
Эта библиотека сможет правильно адресовать 2 из 4 ваших примеров. Кроме того, вам может оказаться полезным использование модели NER (распознавания именованных сущностей), spacy предлагает одну:
import spacy
nlp = spacy.load("en_core_web_sm")
nl_dates = ["last week of july", " in june", "last month", "last 7 days"]
for nl_date in nl_dates:
doc = nlp(nl_date)
for entity in doc.ents:
print('{}: {}'.format(entity.label_, entity.text))
"DATE: last week"
"DATE: last month"
"DATE: last 7 days"
Как правило, вы можете попросить своего чат-бота специально запрашивать дату в формате, который легче обнаружить, когда он не может извлечь ее из текста.