“ c。DATE-DATE BC”的SUTime SequenceMatchRules

时间:2018-12-17 19:20:19

标签: regex date stanford-nlp sutime

我正在与斯坦福的SequenceMatchRules进行斗争,以将以下输入识别为两个日期:

  

Anaximander(约610年–前546年)是前苏格拉底希腊哲学家   他住在爱奥尼亚州(现代土耳其)市米利都(Miletus)。

(摘自Pantheon数据集,例如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

我应该提到万神殿没有被完全规范化,因此我不得不在以后处理诸如CE / BCE,日期周围缺少空格等其他内容。因此,可扩展的方法将是很好的。

1 个答案:

答案 0 :(得分:0)

我认为该规则将与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规则列表中,这可能是最简单的,一旦掌握了该基本规则,便可以对其进行扩展以匹配所需的情况。我还可以在某些时候将一些处理这些案件的规则添加到正式版本中。