1

我正在与斯坦福大学的 SequenceMatchRules 争夺将以下输入识别为两个日期:

阿那克西曼德(约公元前 610 年 - 约 546 年)是一位前苏格拉底时代的希腊哲学家,居住在爱奥尼亚(现代土耳其)的一座城市米利都。

(取自万神殿数据集,例如http://pantheon.media.mit.edu

'546 BC'工作得很好,但我也想将'610'识别为'610 BC'(最好不是持续时间)。

到目前为止,我所做的只是为了让事情顺利进行:

修改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.

我应该提一下 Pantheon 并没有完全标准化,所以我必须稍后处理诸如 CE/BCE 之类的额外内容,日期周围缺少空格等。因此,可扩展的方法会很棒。

4

1 回答 1

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 规则列表可能是最简单的,一旦您有了基本规则,您就可以扩展它以匹配您想要的情况。我还可以在某个时候将一些处理这些案例的规则添加到官方版本中。

于 2018-12-18T08:05:34.603 回答