SUTime SequenceMatchRules для "c. DATE - DATE BC"
Я борюсь с Stanford's SequenceMatchRules за распознавание следующего ввода как двух дат:
Анаксимандр (ок. 610 - ок. 546 г. до н.э.) был греческим философом-досократиком, который жил в Милете, городе Ионии (в современной Турции).
(взято из набора данных Пантеона, например, http://pantheon.media.mit.edu/)
"546 г. до н.э." работает просто отлично, но я также хочу признать "610" как "610 г. до н.э." (желательно НЕ как продолжительность).
То, что я сделал до сих пор только для того, чтобы все заработало:
модифицированный english.sutime.txt
:
Изменено
$POSSIBLE_YEAR = ( $YEAR /a\.?d\.?|b\.?c\.?/? | $INT /a\.?d\.?|b\.?c\.?/ | $INT1000TO3000 );
в
$POSSIBLE_YEAR = ( $YEAR /a\.?d\.?|b\.?c\.?/? | $INT /a\.?d\.?|b\.?c\.?/ | /c\.\ / $INT | $INT1000TO3000 );
И в pattern: ( $POSSIBLE_YEAR)...
правило извлечения:
Tag($0, "YEAR_ERA",
:case {
$0 =~ ( $INT /a\.?d\.?/ ) => ERA_AD,
$0 =~ ( $INT /b\.?c\.?/ ) => ERA_BC,
:else => ERA_UNKNOWN
}
)
в
Tag($0, "YEAR_ERA",
:case {
$0 =~ ( $INT /a\.?d\.?/ ) => ERA_AD,
$0 =~ ( /c\.\ / $INT ) => ERA_BC,
$0 =~ ( $INT /b\.?c\.?/ ) => ERA_BC,
:else => ERA_UNKNOWN
}
)
Во-первых, это ужасно, во-вторых, это не сработало.
Где я должен начать понимать это правильно?
Я использую stanford-corenlp-full-2018-10-05
,
Я должен отметить, что Пантеон не совсем нормализован, поэтому мне придется иметь дело с дополнительными вещами, такими как CE/BCE, пропусками вокруг дат и т. Д. Позже. Поэтому расширяемый подход был бы великолепен.
1 ответ
Я думаю, что это правило будет соответствовать c. 610
... если он увидит шаблон, он присоединит к нему соответствующую IsoDate. Пожалуйста, дайте мне знать, если это работает или нет... если нет, я могу выяснить, что сломалось.
{ (/c\./ (/[0-9]{3,4}/)) => IsoDate($1[0].numcompvalue, NIL, NIL, 0, FALSE) }
Вот конструктор для IsoDate, который используется в эпоху для справки:
public IsoDate(Number y, Number m, Number d, Number era, Boolean yearEraAdjustNeeded) {
this.year = (y != null)? y.intValue():-1;
this.month = (m != null)? m.intValue():-1;
this.day = (d != null)? d.intValue():-1;
this.era = (era != null)? era.intValue():ERA_UNKNOWN;
if (yearEraAdjustNeeded != null && yearEraAdjustNeeded && this.era == ERA_BC) {
if (this.year > 0) {
this.year--;
}
}
initBase();
}
Если это правило работает, оно должно продемонстрировать, как сопоставить текстовый шаблон и прикрепить нужный год. Это может быть проще всего написать pantheon_rules.txt
файл и добавьте в него свой список правил SUTime, который охватывает все, что вы хотите, как только у вас есть это основное правило, вы можете расширить его, чтобы соответствовать нужным вам случаям. Я также мог бы в какой-то момент добавить некоторые правила для обработки этих случаев в официальный релиз.