SUTime из Stanford NLP: невозможно записать определенные форматы даты
Я использую оболочку Python из SUTime НЛП Стэнфорда. Пока что сравнивая результаты с другими синтаксическими анализаторами дат, такими как утенок, date_arser search_dates, parsedatetime и natty, SUTime дает наиболее надежные результаты.
Тем не менее, он не может захватить некоторые очевидные даты из документов. Ниже приведены 2 типа документов, которые у меня возникают с трудностями при разборе дат с использованием SUTime.
- Я вышел и не буду доступен до 9/19
- Я ухожу и не буду доступен с 18 сентября по 20 сентября
Это не дает результатов в случае первого документа. Однако для второго документа он фиксирует только месяц, но не диапазон дат или дат.
Я попытался обернуть голову вокруг кода Java, чтобы посмотреть, смогу ли я изменить или добавить некоторые правила, чтобы сделать эту работу, но не смог понять это.
Если кто-то может предложить способ сделать эту работу с SUTime, это было бы очень полезно.
Кроме того, я пробовал date_artes dateparser, и это ненадежно, поскольку он захватывает все и вся. Как и в случае с первым документом, он будет анализировать дату по тексту "я вышел" (что не обязательно) и "9/19" (что нормально). Так что, если есть способ контролировать это поведение, оно также будет работать.
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