4

例如,对于PRESENT_REF ,我需要获取“2015 年 4 月 27 日星期一 14:22 PM”</p>

我在简单的句子上尝试了 HeidelTime(下面的代码),例如“从现在开始的三个小时内,我将完成这个程序”。

HeidelTimeStandalone heidelTime = new HeidelTimeStandalone(
        Language.ENGLISH,
        DocumentType.NEWS,
        OutputType.TIMEML,
        "C:/heideltime/heideltime-standalone/config.props", 
        POSTagger.TREETAGGER, true);

// Document creation time 
Date dct = new Date();  
String text="In three hours from now I will finish this program.";;
String result = heidelTime.process(text, dct)

对于这个特定的,HeidelTime 生成注释

<?xml version="1.0"?>
<!DOCTYPE TimeML SYSTEM "TimeML.dtd">
<TimeML>
In <TIMEX3 tid="t2" type="DURATION" value="PT3H">three hours</TIMEX3> from <TIMEX3 tid="t1" type="DATE" value="PRESENT_REF">now</TIMEX3> we will finish this program
</TimeML>

虽然我需要得到类似的东西

At <TIMEX3 tid="t6" type="DATE" value="2015-04-27">   <TIMEX3 tid="t8" type="TIME" value="2015-04-27T26:22">17:22 PM</TIMEX3> I will finish this program

有没有办法做到这一点?

4

1 回答 1

4

HeidelTime [1] 尝试按照 TimeML 指南 [2] 提取和规范化时间表达式,重点关注属性“类型”和“值”。

关于您的第一个示例:诸如“now”之类的表达式将在 TimeML 之后注释为“PRESENT_REF”,以便 HeidelTime 的注释不正确 - 尽管在您的情况下可能没有用。你说:

对于 PRESENT_REF,我需要获取“2015 年 4 月 27 日星期一 14:22 PM”</p>

如果您想将“PRESENT_REF”“翻译”为实际值,您可以假设 PRESENT_REF 始终指的是文章的文档创建时间(尽管在某些情况下这可能是不正确的,特别是如果您不处理新闻风格文件)。无论如何,您可以使用 DateFormatter 来获取您想要的信息:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
...
Calendar c = Calendar.getInstance();
String dct = "2015-04-27T14:22";
SimpleDateFormat formatIn = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm");
c.setTime(formatIn.parse(dct));
SimpleDateFormat formatOut = new SimpleDateFormat("EEEE, MMMM dd, yyyy HH:mm a");
String dctText = formatOut.format(c.Time());
System.out.println(dctText);
// prints: Monday, April 27, 2015 14:22 PM

你的第二个例子不那么简单。考虑到时间表达式的范围和属性类型和值,HeidelTime 创建的表达式的注释是正确的,即

<TIMEX3 tid="t1" type="DURATION" value="PT3H">three hours</TIMEX3> 
from
<TIMEX3 tid="t2" type="DATE" value="PRESENT_REF">now</TIMEX3>

有时,需要进一步的注释。例如,在 TimeML 之后,可以锚定持续时间并将“beginPoint”和/或“endPoint”信息分配给持续时间注释。不幸的是,HeidelTime 并没有这样做。

但是,对于某些类型的表达式,HeidelTime 可以为非标准 TIMEX3 添加注释,特别是如果两个表达式描述时间间隔,例如,对于短语“从 1910 到 1950”,标准 TIMEX3 注释是:

from <TIMEX3 tid="t1">1910</TIMEX3> to <TIMEX3 tid="t2">1950</TIMEX3>

如果额外使用 HeidelTime 的区间标注器,则添加一个 TIMEX3INTERVAL,其中包含区间的最早和最晚起点和终点,即

<TIMEX3INTERVAL earliestBegin="1910-01-01T00:00:00" 
                latestBegin="1910-12-31T23:59:59"
                earliestEnd="1950-01-01T00:00:00" 
                latestEnd="1950-12-31T23:59:59">
<TIMEX3 tid="t1" type="DATE" value="1910">1910</TIMEX3> 
to 
<TIMEX3 tid="t2" type="DATE" value="1950">1950</TIMEX3>
</TIMEX3INTERVAL>

因此涵盖了时间间隔,但尚不支持由多个简单 TIMEX3 表达式得出的计算值。

如果你想编写一个扩展,你可以从上面的 DateFormatter 示例开始,解析持续时间值(例如,PT3H)并执行 DateCalculation ,例如c.add(Calendar.HOUR, 3),这会在原始 c 基础上增加三个小时。

如果您编写扩展程序并想将其添加到 HeidelTime,请告诉我们 ;-)

[1] https://github.com/HeidelTime/heideltime

[2] http://timeml.org/publications/timeMLdocs/annguide_1.2.1.pdf

于 2016-02-22T16:44:54.123 回答