SUTime от Stanford NLP: невозможно зафиксировать определенные форматы даты

Я использую оболочку python для SUTime NLP Stanford. До сих пор сравнивая результаты с другими парсерами дат, такими как утенок, search_dates dateparser, parsedatetime и natty, SUTime дает самые надежные результаты.

Однако он не может зафиксировать некоторые очевидные даты из документов. Ниже приведены 2 типа документов, с которыми у меня возникают трудности при анализе дат с помощью SUTime.

  1. Меня нет, и я не буду доступен до 19 сентября.
  2. Я отсутствую и не буду доступен с 18 по 20 сентября.

Это не дает результатов в случае первого документа. Однако для второго документа фиксируется только месяц, но не дата или диапазон дат.

Я попытался обдумать код Java, чтобы посмотреть, могу ли я изменить или добавить некоторые правила, чтобы это работало, но не смог понять.

Если кто-то может предложить способ заставить это работать с SUTime, это было бы очень полезно.

Кроме того, я попробовал search_dates dateparser, и он ненадежен, поскольку фиксирует все и вся. Как и в случае с первым документом, он будет анализировать дату в тексте "am out" (что необязательно) и "9/19" ( что нормально). Так что, если есть способ контролировать это поведение, он тоже будет работать.


person Afsan Abdulali Gujarati    schedule 06.10.2018    source источник


Ответы (1)


Вопрос: невозможно зафиксировать определенные форматы даты

В этом решении используется datetime вместо SUTime

import datetime

def datetime_from_string(datestring):
    rules = [('(\d{1,2}\/\d{1,2})', '%m/%d', {'year': 2018}), ('(\w+ \d{1,2})-(\w+ \d{1,2})', '%B %d', {'year': 2018})]
    result = None
    for rule in rules:
        match = re.match(rule[0], datestring)
        if match:
            result = []
            for part in match.groups():
                try:
                    date = datetime.strptime(part, rule[1])
                    if rule[2]:
                        for key in rule[2]:
                            if key == 'year':
                                date = datetime(rule[2][key], date.month, date.day)

                    result.append(date)
                except ValueError:
                    pass
            return result

    # If you reach heare, NO matching rule
    raise ValueError("Datestring '{}', does not match any rule!".format(datestring))

# Usage

for datestring in ['9/19', 'September 18-September 20', '2018-09-01']:
    result = datetime_from_string(datestring)
    print("str:{} result:{}".format(datestring, result))

Вывод:

str:'9/19' result:[datetime.datetime(2018, 9, 19, 0, 0)]
str:'September 18-September 20' result:[datetime.datetime(2018, 9, 18, 0, 0), datetime.datetime(2018, 9, 20, 0, 0)
ValueError: Datestring '2018-09-01', does not match any rule!

Проверено с Python: 3.4.2

person stovfl    schedule 06.10.2018
comment
Спасибо за ответ, но два предложения, которые я предложил, — это всего лишь пара сценариев, которые SUTime не может зафиксировать. Использование системы, основанной на правилах, как предложено в вашем ответе, будет охватывать только эти два формата дат. Если вы не предлагаете вам это поверх фактического SUTime. - person Afsan Abdulali Gujarati; 07.10.2018
comment
Да, в качестве запасного варианта, если SUTime не сработает. SUTime также основан на правилах и не обрабатывает ключевые слова until и between. Простой обходной путь, выполните replace('between', 'from'). Так как SUTime записаны в Java, вы должны расширить это в исходном коде Java. Я удаляю этот ответ. - person stovfl; 07.10.2018