"c. DATE - DATE BC" 的 SUTime SequenceMatchRules
SUTime SequenceMatchRules for "c. DATE - DATE BC"
我正在与 Stanford 的 SequenceMatchRules 斗争,以将以下输入识别为两个日期:
Anaximander (c. 610 – c. 546 BC) was a pre-Socratic Greek philosopher
who lived in Miletus, a city of Ionia (in modern-day Turkey).
(取自 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([=13=], "YEAR_ERA",
:case {
[=13=] =~ ( $INT /a\.?d\.?/ ) => ERA_AD,
[=13=] =~ ( $INT /b\.?c\.?/ ) => ERA_BC,
:else => ERA_UNKNOWN
}
)
至
Tag([=14=], "YEAR_ERA",
:case {
[=14=] =~ ( $INT /a\.?d\.?/ ) => ERA_AD,
[=14=] =~ ( /c\.\ / $INT ) => ERA_BC,
[=14=] =~ ( $INT /b\.?c\.?/ ) => ERA_BC,
:else => ERA_UNKNOWN
}
)
首先它很丑,其次它根本不起作用。
我应该从哪里开始做对?
我正在使用 stanford-corenlp-full-2018-10-05
。
我应该提到 Pantheon 没有完全规范化,所以我必须稍后处理其他内容,例如 CE/BCE、日期周围缺少空格等。因此,可扩展的方法会很棒。
我认为这条规则会匹配 c. 610
... 如果它看到模式,它会将相应的 IsoDate 附加到它。请让我知道这是否可行...如果不行,我可以找出问题所在。
{ (/c\./ (/[0-9]{3,4}/)) => IsoDate([0].numcompvalue, NIL, NIL, 0, FALSE) }
这里是 IsoDate 的构造函数,以 era 为参考:
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 规则列表中,一旦您掌握了该基本规则,您就可以扩展它以匹配您想要的情况。我还可以在某个时候将处理这些案例的一些规则添加到正式版本中。
我正在与 Stanford 的 SequenceMatchRules 斗争,以将以下输入识别为两个日期:
Anaximander (c. 610 – c. 546 BC) was a pre-Socratic Greek philosopher who lived in Miletus, a city of Ionia (in modern-day Turkey).
(取自 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([=13=], "YEAR_ERA",
:case {
[=13=] =~ ( $INT /a\.?d\.?/ ) => ERA_AD,
[=13=] =~ ( $INT /b\.?c\.?/ ) => ERA_BC,
:else => ERA_UNKNOWN
}
)
至
Tag([=14=], "YEAR_ERA",
:case {
[=14=] =~ ( $INT /a\.?d\.?/ ) => ERA_AD,
[=14=] =~ ( /c\.\ / $INT ) => ERA_BC,
[=14=] =~ ( $INT /b\.?c\.?/ ) => ERA_BC,
:else => ERA_UNKNOWN
}
)
首先它很丑,其次它根本不起作用。
我应该从哪里开始做对?
我正在使用 stanford-corenlp-full-2018-10-05
。
我应该提到 Pantheon 没有完全规范化,所以我必须稍后处理其他内容,例如 CE/BCE、日期周围缺少空格等。因此,可扩展的方法会很棒。
我认为这条规则会匹配 c. 610
... 如果它看到模式,它会将相应的 IsoDate 附加到它。请让我知道这是否可行...如果不行,我可以找出问题所在。
{ (/c\./ (/[0-9]{3,4}/)) => IsoDate([0].numcompvalue, NIL, NIL, 0, FALSE) }
这里是 IsoDate 的构造函数,以 era 为参考:
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 规则列表中,一旦您掌握了该基本规则,您就可以扩展它以匹配您想要的情况。我还可以在某个时候将处理这些案例的一些规则添加到正式版本中。