【问题标题】:Is there a way to convert TIMEX3 words to their actual values?有没有办法将 TIMEX3 单词转换为它们的实际值?
【发布时间】:2016-02-18 21:12:18
【问题描述】:

例如,对于 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

有没有办法做到这一点?

【问题讨论】:

    标签: java temporal heideltime


    【解决方案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 并没有这样做。

    但是,对于某些类型的表达式,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

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2014-11-06
      • 2017-03-25
      相关资源
      最近更新 更多