SUTime SequenceMatchRules для "c. DATE - DATE BC" - PullRequest
0 голосов
/ 17 декабря 2018

Я борюсь с 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 Ответ

0 голосов
/ 18 декабря 2018

Я думаю, что это правило будет соответствовать 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, который охватывает все, что вы хотите, как только у вас будет это базовое правило, вы можете расширить его в соответствии с вашими желаниями.Я также мог бы в какой-то момент добавить некоторые правила обработки этих случаев в официальный релиз.

...