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

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

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

“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)


  1. diomas
    23.04.2019 17:58

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


  1. samodum
    23.04.2019 17:59

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


    1. MutuLawyer Автор
      23.04.2019 19:25

      Это токены которые спарсил из текста реальной переписки SpaCy, без правок и редакции. Люди ошибаются.


      1. StriganovSergey
        25.04.2019 13:29

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


  1. iroln
    23.04.2019 20:39

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


  1. BekoBou
    24.04.2019 00:45

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


    1. samodum
      24.04.2019 08:06

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


    1. iroln
      24.04.2019 12:27

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


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


  1. Refridgerator
    24.04.2019 05:47

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