当前位置: 首页 > 知识库问答 >
问题:

如何使用tokensregex将规则链接起来?

乜烨霖
2023-03-14



首先,感谢Angel Chang编写了像TokensRegex这样伟大的工具!

我的用例如下:
我的测试规则集中有两个提取规则。它们都有指定为结果的“action”字段,并且在action列表中都有“annotate”。当要匹配的第二个规则的表达式与第一个规则的结果无关时,它们就可以正常工作。但是当第二个规则的执行依赖于第一个规则的结果时,事情就崩溃了。

一个具体的例子:
我有以下句子:“共识估计每股收益为3.55美元,收入为305.1亿美元。”
“每股收益”和“收入”已经由更基本的RegexNER注释器注释。TokensRegex注释器的目标是在满足某些条件的情况下增加NER注释。
在这个简化的示例中,如果我们看到术语“EPS”之前出现了术语“Estimate(s)”,我们希望用“DN-EPS_EST”NER注释重新标记标记“EPS”。这是我的第一个规则。
第二个规则依赖于第一个规则的结果--如果标记“收入”前面有一个NER注释为“DN-EPS_EST”的标记(这只能是第一个规则的结果),则重新注释该标记。

所以我的TokensRegex规则如下:

{
ruleType:   "tokens",
pattern:    ( /[Ee]stimates?/ []{0,3} [{ner:"DN-EPS"}] ),
action:     ( Annotate($0[-1], "ner", "DN-EPS_EST") ) }
{
ruleType:   "tokens",
pattern:    ( [{ner:"DN-EPS_EST"}] /of/ [{ner:"MONEY"}]{1,3} /on/ [{ner:"DN-REVENUE"}] ),
action:     ( Annotate($0[-1], "ner", "DN-REVENUE_EST") ) }

第一条规则有效,但第二条不行。会有什么问题?规则是否以错误的顺序执行?第一个规则的结果是否没有在第二个表达式中被匹配?我是否使用了错误的字段或操作类型?我有意简化了本例中的模式匹配表达式,但也许我在第二个规则的“模式”字段中仍然有一个错误?

任何帮助都将不胜感激!我被难倒了。阅读网站上的所有文档,甚至Javadocs和幻灯片,但就是找不到一个具体的答案。

共有1个答案

哈栋
2023-03-14

好的,经过一些额外的修补和研究,我终于找到了我自己的问题的答案:
您必须分阶段应用链接规则,仅仅在规则文件中“正确”排序是不够的。TokensRegexAnnotator将不会基于依赖规则执行任何操作,如果它的模式提到一个被上游规则修改的令牌属性,并且阶段是相同的(或未指定的)。它既不匹配“在第一条规则执行之前”的状态,也不匹配“在第一条规则执行之后”的状态。
我通过将第一条规则完全从等式中取出来测试第二条规则本身--它起作用了。这对于确保模式表达式在第二个规则中没有错误是必要的。
然后我重新引入了第一个规则,并用两个表达式测试了第二个规则:“在第一个规则执行之前”状态和“在第一个规则执行之后”状态--在这两种情况下都没有发生任何事情。不确定为什么TokensRegexAnnotator是以这种方式实现的,也许创建者认为没有什么行为比某些默认行为更好...至少,在我深入阅读了“SequenceMatchRules”Javadoc之后,我找到了“stage”字段并试图应用它(尽管它没有明确地说如果您有一个使用其他规则的输出注释的规则,就必须应用它)。下面是工作示例的样子:

{   ruleType:   "tokens",
pattern:    ( /[Ee]stimates?/ []{0,3} [{ner:"DN-EPS"}] ),
action:     ( Annotate($0[-1], "ner", "DN-EPS_EST") ),
stage:      1   }

{   ruleType:   "tokens",
pattern:    ( [{ner:"DN-EPS_EST"}] /of/ [{ner:"MONEY"}]{1,3} /on/ [{ner:"DN-REVENUE"}] ),
action:     ( Annotate($0[-1], "ner", "DN-REVENUE_EST") ),
stage:      2   }

正如您所看到的,第二个规则的模式对NER注释有一个条件,只有在执行第一个规则并提交结果之后才能满足这个条件。在本例中,如预期的那样,触发了第2条规则。

 类似资料:
  • 问题内容: 例子不好: 好例子: 我有大量的CSS规则占用太多行。而且我无法弄清楚要使用的命令。 问题答案: 这里是单线: 匹配任何字符,包括换行符,并且是的非贪婪版本,因此匹配匹配的一对花括号之间的所有字符(包括首尾)。 在允许替换Vim表达式,我们在这里用它来去掉所有换行符的结果从匹配的文本(在使用)功能。 逆运算(将单行版本转换为多行版本)也可以作为一个衬套来完成:

  • 问题内容: 我正在使用ASP.NET,我的某些按钮只是进行重定向。我希望它们是普通的链接,但是我不希望我的用户注意到外观上的很大差异。我考虑了用锚(即标签)包裹的图像,但我不想每次更改按钮上的文本时都必须启动图像编辑器。 问题答案: 将课程应用于

  • 如果安装vuejs eslint插件并将其配置为使用“强烈推荐”规则集,linter将告诉您更改以下代码: 进入这个 问题是,当您这样做时,您的

  • 问题内容: 我需要使按钮看起来像使用CSS的链接。所做的更改已经完成,但是当我单击它时,它显示的效果就像按按钮一样。任何想法如何删除它,以便即使单击该按钮也可以用作链接? 问题答案:

  • 1. 接口通用规则设置 1.1. 请求 所有API接口使用HTTP(s)协议访问,交互过程中请求和响应格式均为JSON类型。Content-Type 为 application/json;charset=utf-8。 所有请求需要携带 Header头进行身份验证: 字段名 含义 access_id 身份ID,由cc视频提供给客户 timestamp 时间戳(当前时间毫秒数,如java:System

  • 更新: 如果我使用注释和路径:/*和/api/*-site可以很好地工作。但是因为我使用全局静态IP,所以我不能为每个IP创建一个以上的入口。如果我使用-site返回错误: