有没有办法将TIMEX3单词转换为实际值?

时间:2016-02-18 21:12:19

标签: java temporal heideltime

例如,对于 PRESENT_REF ,我需要得到 “2015年4月27日星期一下午14:22”

我在简单的句子上试验过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

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

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

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

  

对于PRESENT_REF我需要得到“2015年4月27日星期一下午14:22”

如果要将“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可以为非标准TIMEX3添加注释,特别是如果两个表达式需要时间间隔,例如,对于短语“从1910年到1950年”,标准TIMEX3注释是:< / p>

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),这会增加原始时间的三个小时角

如果你写了一个扩展并希望将其添加到HeidelTime,请告诉我们; - )

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

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