我正在创建一个TokensRegex注释器来提取建筑物的楼层数(仅举例说明我的问题)。我有一个简单的模式,将“4层”和“4层”识别为我的自定义实体“FLOORS”的实例。 我还想添加一个NormalizedNER注释,使用表达式中使用的数字实体的规范化值,但我无法按照我想要的方式工作:
ner = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" }
normalized = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NormalizedNamedEntityTagAnnotation" }
tokens = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$TokensAnnotation" }
ENV.defaults["ruleType"] = "tokens"
{
pattern: ( ( [ { ner:NUMBER } ] ) /floor(s?)/ ),
action: ( Annotate($0, ner, "FLOORS"), Annotate($0, normalized, $$1.text) )
}
上述规则仅将输出中的NormalizedNER字段分别设置为上述示例的数字“4”和“4”的文本值。有没有办法使用NUMBER实体的规范化值(“4”和“4”都是“4.0”)作为我的“FLOORS”实体的规范化值?
提前致谢。
答案 0 :(得分:1)
尝试更改
action: ( Annotate($0, ner, "FLOORS"), Annotate($0, normalized, $$1.text) )
到
action: ( Annotate($0, ner, "FLOORS"), Annotate($0, normalized, $$1.normalized) )
Annotate需要三个参数
答案 1 :(得分:0)
按照你的建议使用$$ 1. normalized,运行输入" The 建筑有七层楼#34;产生以下错误消息: 注释文件test.txt {从七中提取注释时出错 楼层}
可能是因为NamedEntityTagAnnotation
所代表的令牌尚未存在$$1
密钥。我想,在运行TokensRegex之前,你要确保你的数字代币 - 要么是"四"或" 4"在这种情况下 - 具有相应的标准化值 - " 4.0"在这种情况下 - 设置为NamedEntityTagAnnotation
密钥。
另外,请你指点我到哪里可以找到更多信息 关于Annotate()可能的第三个参数?你的Javadoc页面 TokensRegex表达式没有列出$$ n.normalized(也许它需要 更新?)
我相信,$$n.normalized
将会做的是检索在Java代码中等于coreLabel.get(edu.stanford.nlp.ling.CoreAnnotations$NormalizedNamedEntityTagAnnotation.class)
coreLabel
CoreLabel
类型{{1}的值的值与TokensRegex中的$$n
对应。
这是因为TokensRegex中的以下行:normalized = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NormalizedNamedEntityTagAnnotation" }
答案 2 :(得分:0)
正确的答案是基于@AngelChang的回答和评论,我只是为了ordeliness而在这里张贴。
必须修改规则,以便第二个Annotate()动作的第三个参数是$1[0].normalized
:
{
pattern: ( ( [ { ner:NUMBER } ] ) /floor(s?)/ ),
action: ( Annotate($0, ner, "FLOORS"), Annotate($0, normalized, $1[0].normalized) )
}
根据@Angel的评论:
$ 1 [0]。normalized是"标准化"第1个第0个标记的字段 捕获组(作为CoreLabel)。 $$ 1让你回来了 MatchedGroupInfo具有"文本"字段但不是规范化的 字段(因为它在实际令牌上)