我正在使用NLP斯坦福大学的SUTime的python wrapper。 到目前为止,将结果与其他日期解析器(如小鸭,dateparser的search_dates,parsedatetime和natty)进行比较,SUTime给出了最可靠的结果。
但是,它无法从文档中捕获一些明显的日期。 以下是我难以使用SUTime解析日期的两种文档类型。
对于第一个文档,没有任何结果。 但是,对于第二个文档,它仅捕获月份,而不捕获日期或日期范围。
我试着用Java的代码缠住我的头,以查看是否可以更改或添加一些规则来完成这项工作,但无法弄清楚。
如果有人可以建议使用SUTime进行此工作的方法,那将非常有帮助。
此外,我尝试使用dateparser的search_dates,它不可靠,因为它可以捕获所有内容。像第一个文档一样,它将解析文本“ am out” (不需要 )和“ 9/19” (没关系)。因此,如果有一种方法可以控制这种行为,那么它也会起作用。
答案 0 :(得分: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