python - 斯坦福 NLP 的 SUTime:无法捕获某些日期格式
问题描述
我正在使用NLP 斯坦福大学的 SUTime的python 包装器。到目前为止,将结果与其他日期解析器(如小鸭、dateparser 的 search_dates、parsedatetime 和 natty)进行比较,SUTime 给出了最可靠的结果。
但是,它无法从文档中捕获一些明显的日期。以下是我使用 SUTime 难以解析日期的两种类型的文档。
- 我出去了,我要到 9/19 才能有空
- 我出去了,在(9 月 18 日至 9 月 20 日)之间我将无法使用
如果是第一个文档,它不会给出任何结果。但是,对于第二个文档,它仅捕获月份,而不捕获日期或日期范围。
我试着绕着java的代码转,看看我是否可以改变或添加一些规则来完成这项工作,但无法弄清楚。
如果有人可以建议一种使用 SUTime 进行这项工作的方法,那将非常有帮助。
另外,我尝试了 dateparser 的 search_dates,它不可靠,因为它捕获了任何东西。就像第一个文档一样,它会解析文本“am out”(不是必需的)和“9/19”(没关系)上的日期。因此,如果有办法控制这种行为,它也会起作用。
解决方案
问题:无法捕获某些日期格式
该解决方案确实使用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
推荐阅读
- r - 对 R 中的多个特定列使用相同的正则表达式
- php - 如何在 Laravel 查询选择中添加 2 个别名值?
- hive - 当 hive.exec.parallel 设置为 True 时,直线 (HiveServer2) 不写入控制台日志
- python - 良好的训练/验证准确度,但测试准确度差
- php - AWS EC2:从jmeter同时调用大量api时发生内部服务器错误
- matlab - 如何制作具有来自其他两个矩阵的独占值的第三个矩阵,具有多列?
- python - 未找到 PPTX 包
- reactjs - 尝试根据枚举值动态设置接口
- python - Python:async/await 可以模仿这个基于生成器的解决方案吗?
- visual-studio-code - 从 VS Code 导出笔记本返回损坏的 pdf 或空白 HTML