注意:这似乎与将特征值设置为 UIMA Ruta 中包含注释的计数密切相关。但我不能完全将答案应用于我的情况。
我正在分析假定以下结构的纯文本文档:
- 文件(当然是一份)
- 部分(许多)
- 标题(每节一个)
- 部分(许多)
我被要求通过检查它们的标题是否满足条件来识别部分。一个有用且明显的条件是:标题是否与给定的正则表达式匹配?一个不太有用但可能更容易实现的条件是:标题是否包含给定的文本?
我可以并且已经通过获取正则表达式和节标题的元组列表以及在设计时为列表中的每个成员来实现这一点,如下所示:
BLOCK(forEach) SECTION{} {
...
HEADING{REGEXP(".*table.*contents.*", true) ->
SETFEATURE("value", "Table of Contents")};
...
}
SECTION{ -> SETFEATURE("value", "Table of Contents")}
<- { HEADING.headingValue == "Table of Contents"; };
这种方法相当简单,但有一些很大的缺点:
- 它严重违反了 DRY 原则
- 即使只为一个部分编写规则来识别,规则作者也必须将部分标题复制两次(应该只需要指定一次)
- 它使脚本不必要地冗长和笨拙
- 它给规则作者带来了很大的负担,在理想情况下,他们只需要知道 Regex - 而不是 Ruta
所以我想重构以实现以下目标:
- 一个文本文件用于存储正则表达式和相应的标题,并且规则迭代这些对
- 特征,而不是类型,用于区分不同的部分/标题(即像上面一样,使用
SECTION.value=="Table of Contents"
和不TableOfContentsSection
)
在查看 UIMA Ruta 参考以了解哪些选项可用于实现这些目标后,我确定了以下内容:
- 使用 a
WORDTABLE
来存储section title, words to find / regex if possible, lookup type
- 例如,Table of Contents,contents,sectiontitles
- 用于
MARKTABLE
标记一个中间注释类型LookupMatch
,其hint
特征包含节标题,其lookup
特征包含我们正在谈论的查找类型 - 对于每个
HEADING
,查看 aLookupMatch.lookup == "sectiontitle"
是否在内部,如果是,则将 复制LookupMatch.hint
到标题value
字段。 - 对于每个
SECTION
,看看 aHEADING
和 avalue
是否在里面;如果是这样,请将 复制value
到该SECTION.value
字段。
发现实施第 3 步和第 4 步并不那么容易,这并不奇怪。这就是我所在的地方,也是我寻求帮助的原因。
// STEP 1
WORDTABLE Structure_Heading_WordTable =
'/uima/resource/structure/Structure_Heading_WordTable.csv';
// STEP 2
Document.docType == "Contract"{
-> MARKTABLE(LookupMatch, // annotation
2, // lookup column #
Structure_Heading_WordTable, // word table to lookup
true, // case-insensitivity
0, // length before case-insensitivity
"", // characters to ignore
0, // matches to ignore
"hint" = 1, "lookup" = 3 // features
)
};
// STEPS 3 AND 4 ... ???
BLOCK(ForEach) LookupMatch.lookup == "sectiontitle"{} {
???
}
HEADING{ -> SETFEATURE("value", ???)} <- {
???
};
这是我第一次真正的尝试:
HEADING{ -> SETFEATURE("value", lookupMatchHint)} <- {
LookupMatch.lookup == "HeadingWords"{ -> GETFEATURE("hint", lookupMatchHint)};
};
TL; 博士
如何有条件地将特征值从一个注释复制到另一个注释?GETFEATURE
有点假设你只得到 1...