Есть ли способ преобразовать слова TIMEX3 в их фактические значения?

Например, для PRESENT_REF мне нужно получить "Понедельник, 27 апреля 2015 г., 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 ответ

HeidelTime [1] пытается извлечь и нормализовать временные выражения, следуя рекомендациям TimeML [2], с упором на атрибуты "тип" и "значение".

Что касается вашего первого примера: выражения, такие как "сейчас", должны быть аннотированы как "PRESENT_REF" после TimeML, чтобы аннотация HeidelTime не была неправильной - хотя, вероятно, бесполезна в вашем случае. Ты говоришь:

для PRESENT_REF мне нужно получить "Понедельник, 27 апреля 2015 г., 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

Другие вопросы по тегам