在 UIMA RUTA 的一行中匹配同一词典中的所有匹配项
Match all occurrences from the same dictionary in one line in UIMA RUTA
我的类型是 Dog,它具有 size
、color
和 other
的特征
尺寸词表:big, medium, small
其他单词表:old, fat, happy, lazy
颜色词表在这种情况下没有任何影响,所以我不会列出它。
我的代码(仅用于主文件):
PACKAGE dog;
SCRIPT dog.Color;
SCRIPT dog.Size;
SCRIPT dog.Other;
TYPESYSTEM dogTypeSystemDescriptor;
ENGINE utils.PlainTextAnnotator;
TYPESYSTEM utils.PlainTextTypeSystem;
Document{-> CALL(Color)};
Document{-> CALL(Size)};
Document{-> CALL(Other)};
Document{-> EXEC(PlainTextAnnotator, {Line})};
Line{-> CREATE(Dog, "color" = Color, "size" = Size, "other" = Other)};
DECLARE Max, Milo;
Dog{Dog.color.ct == "black",
Dog.size.ct == "big" -> Max};
Dog{Dog.color.ct == "white",
Dog.other.ct == "fat" -> Milo};
如图所示,注释"Milo"从未创建(因为它依赖于特征[=39的值"fat" =] 与 "happy" 在同一词典中,但在输入词中 "happy" 排在 "fat" 之前)。如果我们在输入中将 "fat" 放在 "happy" 之前 - 一切都按预期进行。
所以,问题是我如何才能为同一输入中找到的同一字典中的每个单个特征创建注释?
您的案例不需要列表类型(例如 StringList)的功能 "other" 吗?因为在这种情况下,白狗既快乐又懒惰,但由于该特征属于 "Annotation" 类型(我假设),因此它将只包含一个值。至少这就是普通 UIMA 注释器和管道的工作方式。
然后你会检查特征 "other" 是否包含 "fat".
PS:我是 UIMA RUTA 的新手
Rafael 说得对,但我建议使用 FSArray 而不是列表。这是使用 Ruta 2.6.1 测试的示例。注意特征 "others" 中的 "s" 及其类型 FSArray.
ENGINE utils.PlainTextAnnotator;
TYPESYSTEM utils.PlainTextTypeSystem;
// mock dictionary lookup and scripts
DECLARE Color, Size, Other;
"black|white" -> Color;
"big|small" -> Size;
"lazy|happy|fat" -> Other;
DECLARE Dog (Color color, Size size, FSArray others);
Document{-> EXEC(PlainTextAnnotator, {Line})};
Line{-> CREATE(Dog, "color" = Color, "size" = Size, "others" = Other)};
DECLARE Max, Milo;
Dog{Dog.color.ct == "black",
Dog.size.ct == "big" -> Max};
Dog{Dog.color.ct == "white",
Dog.others.ct == "fat" -> Milo};
免责声明:我是 UIMA Ruta 的开发者
我的类型是 Dog,它具有 size
、color
和 other
尺寸词表:big, medium, small
其他单词表:old, fat, happy, lazy
颜色词表在这种情况下没有任何影响,所以我不会列出它。
我的代码(仅用于主文件):
PACKAGE dog;
SCRIPT dog.Color;
SCRIPT dog.Size;
SCRIPT dog.Other;
TYPESYSTEM dogTypeSystemDescriptor;
ENGINE utils.PlainTextAnnotator;
TYPESYSTEM utils.PlainTextTypeSystem;
Document{-> CALL(Color)};
Document{-> CALL(Size)};
Document{-> CALL(Other)};
Document{-> EXEC(PlainTextAnnotator, {Line})};
Line{-> CREATE(Dog, "color" = Color, "size" = Size, "other" = Other)};
DECLARE Max, Milo;
Dog{Dog.color.ct == "black",
Dog.size.ct == "big" -> Max};
Dog{Dog.color.ct == "white",
Dog.other.ct == "fat" -> Milo};
如图所示,注释"Milo"从未创建(因为它依赖于特征[=39的值"fat" =] 与 "happy" 在同一词典中,但在输入词中 "happy" 排在 "fat" 之前)。如果我们在输入中将 "fat" 放在 "happy" 之前 - 一切都按预期进行。
所以,问题是我如何才能为同一输入中找到的同一字典中的每个单个特征创建注释?
您的案例不需要列表类型(例如 StringList)的功能 "other" 吗?因为在这种情况下,白狗既快乐又懒惰,但由于该特征属于 "Annotation" 类型(我假设),因此它将只包含一个值。至少这就是普通 UIMA 注释器和管道的工作方式。
然后你会检查特征 "other" 是否包含 "fat".
PS:我是 UIMA RUTA 的新手
Rafael 说得对,但我建议使用 FSArray 而不是列表。这是使用 Ruta 2.6.1 测试的示例。注意特征 "others" 中的 "s" 及其类型 FSArray.
ENGINE utils.PlainTextAnnotator;
TYPESYSTEM utils.PlainTextTypeSystem;
// mock dictionary lookup and scripts
DECLARE Color, Size, Other;
"black|white" -> Color;
"big|small" -> Size;
"lazy|happy|fat" -> Other;
DECLARE Dog (Color color, Size size, FSArray others);
Document{-> EXEC(PlainTextAnnotator, {Line})};
Line{-> CREATE(Dog, "color" = Color, "size" = Size, "others" = Other)};
DECLARE Max, Milo;
Dog{Dog.color.ct == "black",
Dog.size.ct == "big" -> Max};
Dog{Dog.color.ct == "white",
Dog.others.ct == "fat" -> Milo};
免责声明:我是 UIMA Ruta 的开发者