例如,对于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
有办法实现吗?
最佳答案
HeidelTime [1]尝试遵循TimeML准则[2]提取并规范化时间表达式,重点是属性“类型”和“值”。
关于第一个示例:在TimeML之后将诸如“ now”之类的表达式注释为“ 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不会不幸地这样做。
但是,对于某些类型的表达式,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
关于java - 有没有办法将TIMEX3单词转换为它们的实际值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35492509/