Появилась вторая идея — искать в переписке даты и вставлять их в техническое задание, документы, автоматически.
Однако, люди редко пишут в чатах и мессенджерах даты так, чтобы их легко мог распознать алгоритм.
“We start next week”, «this friday» — если менеджеры сравнительно легко могут нучиться писать даты в правильном формате, то к клиентам ты не можешь предъявить таких требований.
Я пишу на python и на помощь сразу пришла python NLP-библиотека spaCy* — NER (name entity recognition) модуль которой легко извлекал даты из переписки с англоязычными клиентами. В результате мы получили кучу относительных дат: «in two weeks»,«friday», «this friday», «this noon», «wensday noon».
Но как перевести эти даты в объекты, которые воспринимает сервис (datetime object)?
Началось длительное путешествие в область “human readable dates parsing”. Обозревая окрестности я нашел только три python библиотеки, которые заработали сразу и без мучений: это timefhuman**, dateparser*** и datefinder***.
На картинке сравнение трех библиотек:
В целом видно, что не избалованная вниманием timefhuman оказалась более удобной, хотя и с большим количеством ложных срабатываний, чем dateparser которым пользуется большинство.
Интересна логика разработчиков парсинг “пятницы” дал будущую пятницу в случае timefhuman и прошлую пятницу в dateparser.
В целом timefhuman оказался более живым и был выбран для дальнейшей разработки и тестирования прототипа.
* spacy.io
** github.com/alvinwan/timefhuman
*** github.com/scrapinghub/dateparser
**** github.com/akoumjian/datefinder
Комментарии (9)
samodum
23.04.2019 17:59"Wednesday" специально с ошибкой написано? Зачем?
MutuLawyer Автор
23.04.2019 19:25Это токены которые спарсил из текста реальной переписки SpaCy, без правок и редакции. Люди ошибаются.
StriganovSergey
25.04.2019 13:29n-грамный поиск по тексту и сопоставление со словарем с правильным написанием тех слов, которые набрали высокий балл «похожести». И не надо будет цитировать ошибки. Вообще, меня поразил масштаб задачи. то, что можно сделать «врукопашную» на любом языке за день -два, без всяких там библиотек и сервисов, вряд-ли стоит и статьи об этом.
iroln
23.04.2019 20:39Не на python есть duckling, который прекрасно работает с датами на английском языке, в том числе распознаёт интервалы. Эта библиотека используется в том числе в сервисе wit.ai. Для duckling есть обертки на python.
BekoBou
24.04.2019 00:45А кто-то пробовал сделать то же, но с русским языком? Скажем так, есть какой-то алгоритм портирование на другие языки — немецкий, например?
iroln
24.04.2019 12:27dateparser и duckling мультиязычные, но для других языков поддержка сейчас как всегда хуже чем для английского. Почти все решения для парсинга дат на естественном языке, начиная от древнего SUTime, основаны на правилах и контекстно-свободных грамматиках. NER, основанные на классификации чаще всего очень ограничено извлекают даты и в любом случае требуется их нормализация.
Можно взять готовый томита-парсер от Яндекса и написать правила и грамматики для извлечения дат на любом языке. Но с написанием грамматик придется повозиться, конечно.
Refridgerator
24.04.2019 05:47Существует ещё сортируемый формат времени — год, месяц, день. Как его отличить от год, день, месяц?
diomas
надо еще порядок день/месяц с оглядкой на локаль (территорию) учитывать
1/2/2019
— будет разной датой вen-US
и вen-GB