Распознавание дат, написанных естественным языком, средствами Python3

Мы в компании создаем сервис, который извлекает юридические факты из переписки клиента и заказчика. Сервис вырос из одной простой идеи — мои постоянные клиенты из решили упросить работу менеджерам и создать “генератор договоров”. Первую задачу — подтягивать в договор реквизиты клиента и заказчика мы решили легко.

Появилась вторая идея — искать в переписке даты и вставлять их в техническое задание, документы, автоматически.

Однако, люди редко пишут в чатах и мессенджерах даты так, чтобы их легко мог распознать алгоритм.

“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***.

На картинке сравнение трех библиотек:

image

В целом видно, что не избалованная вниманием timefhuman оказалась более удобной, хотя и с большим количеством ложных срабатываний, чем dateparser которым пользуется большинство.
Интересна логика разработчиков парсинг “пятницы” дал будущую пятницу в случае timefhuman и прошлую пятницу в dateparser.

В целом timefhuman оказался более живым и был выбран для дальнейшей разработки и тестирования прототипа.

* spacy.io
** github.com/alvinwan/timefhuman
*** github.com/scrapinghub/dateparser
**** github.com/akoumjian/datefinder
Поделиться публикацией

Похожие публикации

Комментарии 9

    0

    надо еще порядок день/месяц с оглядкой на локаль (территорию) учитывать 1/2/2019 — будет разной датой в en-US и в en-GB

      0

      "Wednesday" специально с ошибкой написано? Зачем?

        0
        Это токены которые спарсил из текста реальной переписки SpaCy, без правок и редакции. Люди ошибаются.
          0
          n-грамный поиск по тексту и сопоставление со словарем с правильным написанием тех слов, которые набрали высокий балл «похожести». И не надо будет цитировать ошибки. Вообще, меня поразил масштаб задачи. то, что можно сделать «врукопашную» на любом языке за день -два, без всяких там библиотек и сервисов, вряд-ли стоит и статьи об этом.
        0

        Не на python есть duckling, который прекрасно работает с датами на английском языке, в том числе распознаёт интервалы. Эта библиотека используется в том числе в сервисе wit.ai. Для duckling есть обертки на python.

          0

          А кто-то пробовал сделать то же, но с русским языком? Скажем так, есть какой-то алгоритм портирование на другие языки — немецкий, например?

            –1
            алгоритм портированиЯ
              +1

              dateparser и duckling мультиязычные, но для других языков поддержка сейчас как всегда хуже чем для английского. Почти все решения для парсинга дат на естественном языке, начиная от древнего SUTime, основаны на правилах и контекстно-свободных грамматиках. NER, основанные на классификации чаще всего очень ограничено извлекают даты и в любом случае требуется их нормализация.


              Можно взять готовый томита-парсер от Яндекса и написать правила и грамматики для извлечения дат на любом языке. Но с написанием грамматик придется повозиться, конечно.

              0
              Существует ещё сортируемый формат времени — год, месяц, день. Как его отличить от год, день, месяц?

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое