斯坦福NLP的SUTime:无法捕获某些日期格式

2024-06-02 06:56:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是NLP斯坦福的SUTime的python wrapper。 到目前为止,将结果与其他日期分析器(如duckling、dateparser的搜索日期、parsedatetime和natty)进行比较,SUTime给出了最可靠的结果。

但是,它未能从文档中捕获一些明显的日期。 下面是两种类型的文档,我很难用SUTime解析日期。

  1. 我出去了,我要到9月19日才有空
  2. 我出去了,我在9月18日到9月20日之间不到

如果是第一个文件,它不会给出结果。 但是,对于第二个文档,它只捕获月份,而不是日期或日期范围。

我试着用头绕着java的代码,看看是否可以修改或添加一些规则来实现这一点,但无法确定。

如果有人能建议一种方法使这一工作与SUTime,这将是真正的帮助。

此外,我尝试了dateparser的搜索日期,它不可靠,因为它捕获任何东西和所有内容。与第一个文档一样,它将分析文本“am out”(不需要)和“9/19”(这是正常的)。所以如果有办法控制这种行为,它也会起作用。


Tags: 文件代码文档分析器类型nlpjavawrapper
1条回答
网友
1楼 · 发布于 2024-06-02 06:56:02

Question: Unable to capture certain date formats

此解决方案确实使用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))

Output:

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测试

相关问题 更多 >