为什么斯坦福 NER 演示将 'this year' 转换为 2017,而我的 CoreNLP 服务器却没有?

Why does the Stanford NER demo convert 'this year' to 2017, whereas my CoreNLP server does not?

我已经设置了一个 CoreNLP 服务器,并且正在使用 Stanford NER 从句子中提取时间段。

如果我使用corenlp.run处的在线交互demo来解析句子

'Last year something happened.'

it shows 'DATE' and '2016'。 但是,我自己的服务器设置了最新版本的 CoreNLP only shows 'DATE'。更重要的是,当我使用 Python 请求以相同的句子查询我服务器的 API 时,响应中的前两个令牌包含字段 'timex': {'type': 'DATE','tid': 't1', 'altValue': 'THIS P1Y OFFSET P-1Y'}'normalizedNER': 'THIS P1Y OFFSET P-1Y'.

如果我只需要处理我的输出不如演示的事实,那么斯坦福 NER 或 timex3 文档在哪里解释 THIS P1Y OFFSET P-1Y 的含义或描述我可能的其他可能响应进入 normalizedNER 字段?

这是完整的 API 回复

[
{'word': 'Last', 'after': ' ', 'originalText': 'Last', 'timex': {'type': 'DATE', 'tid': 't1', 'altValue': 'THIS P1Y OFFSET P-1Y'}, 'pos': 'JJ', 'ner': 'DATE', 'lemma': 'last', 'normalizedNER': 'THIS P1Y OFFSET P-1Y', 'before': '', 'index': 1, 'characterOffsetBegin': 0, 'characterOffsetEnd': 4},
{'word': 'year', 'after': ' ', 'originalText': 'year', 'timex': {'type': 'DATE', 'tid': 't1', 'altValue': 'THIS P1Y OFFSET P-1Y'}, 'pos': 'NN', 'ner': 'DATE', 'lemma': 'year', 'normalizedNER': 'THIS P1Y OFFSET P-1Y', 'before': ' ', 'index': 2, 'characterOffsetBegin': 5, 'characterOffsetEnd': 9},
{'word': 'something', 'before': ' ', 'originalText': 'something', 'ner': 'O', 'lemma': 'something', 'after': ' ', 'characterOffsetEnd': 19, 'index': 3, 'characterOffsetBegin': 10, 'pos': 'NN'},
{'word': 'happened', 'before': ' ', 'originalText': 'happened', 'ner': 'O', 'lemma': 'happen', 'after': '', 'characterOffsetEnd': 28, 'index': 4, 'characterOffsetBegin': 20, 'pos': 'VBD'}, 
{'word': '.', 'before': '', 'originalText': '.', 'ner': 'O', 'lemma': '.', 'after': '', 'characterOffsetEnd': 29, 'index': 5, 'characterOffsetBegin': 28, 'pos': '.'}
]

您好,我添加了一项新功能,允许您告诉管道在 运行 时使用当前日期作为 docDate,这是您问题的主要来源。要获得此功能,您必须使用 GitHub.

上提供的最新版本的 Stanford CoreNLP

此外,当您启动服务器时,您必须使用 -serverProperties 选项并提供具有以下属性的 .properties 文件:

annotators = tokenize,ssplit,pos,lemma,ner,entitymentions
ner.usePresentDateForDocDate = true

如果你这样做,它现在应该可以正常工作并正确列出 2016

如果您仔细查看交互式演示中对 corenlp 服务器发出的请求,您会发现当前日期也作为 "date" 参数随请求一起发送。 例如。如果你的句子是 "I went to school today.",那么 "today" 已经归一化了 ner 是“2017-19-09”(当前日期)。 如果你不传递 "date" 参数,"today" 将不会像规范化的 ner 那样有准确的日期。

希望它有意义。