UIMA Ruta 3 中如何使用支持同义词和特征的 Dictionary?
可以先把字典展开成“每个匹配词一行”,再用 WORDTABLE 和 MARKTABLE 创建标注并填充概念特征。同义词有多少个,就生成相应数量的行,无须增加字典列或 Ruta 规则。
WORDTABLE 不会自动把 hands|handA|handB|handC 拆成多个候选词,单元格里的 | 只会被当作普通字符。
1. 将同义词展开为独立词条
保留原文件用于维护,在处理文档前生成供 Ruta 使用的 concepts.csv:
hand;hand;true;5
hands;hand;true;5
handA;hand;true;5
handB;hand;true;5
handC;hand;true;5
liver;liver;true;8
livers;liver;true;8
hepatic organ;liver;true;8
四列依次是:
| 列号 | 含义 |
|---|---|
| 1 | 用于匹配文本的词或短语 |
| 2 | 规范名称,即原始 word |
| 3 | specific |
| 4 | parts |
展开时,先把规范名称本身加入匹配词集合,再按 | 拆分同义词,清理首尾空白并去重。每次更新字典后执行一次转换即可。
供 Ruta 加载的文件不要保留表头。标准 CSVTable 加载实现会将每一行作为数据读取,不会自动跳过表头,默认列分隔符是分号。CSVTable 源码
2. 用 MARKTABLE 匹配并填充特征
示例中先将 specific 列读为字符串,再显式设置布尔特征,便于看清输入值的处理方式:
WORDTABLE concepts = 'concepts.csv';
DECLARE Annotation Concept(
STRING word,
STRING specificText,
BOOLEAN specific,
INT parts
);
Document{-> MARKTABLE(
Concept, 1, concepts,
"word" = 2,
"specificText" = 3,
"parts" = 4
)};
Concept{FEATURE("specificText", "true")
-> SETFEATURE("specific", true)};
Concept{FEATURE("specificText", "false")
-> SETFEATURE("specific", false)};
MARKTABLE 的第二个参数 1 表示用第一列匹配文本,后面的映射指定各特征值从哪一列读取。列号从 1 开始,具体用法见 Ruta 3.2.0 参考手册的 MARKTABLE 说明。
例如,匹配到 hepatic organ 时,标注会覆盖文本中的这段短语,并保存以下特征值:
word = "liver"
specificText = "true"
specific = true
parts = 8
标注的覆盖范围保留了原文中的实际写法,word 则保存规范名称。如果可能出现同名概念,建议另加一个稳定的 conceptId 列。
3. 匹配时需要确认的细节
多词同义词可以作为完整词条放在第一列,例如 hepatic organ。空白如何处理,取决于字典配置和 Ruta 的过滤设置。Ruta 3.2.0 手册说明,默认配置会通过 dictRemoveWS 在加载字典时移除空白。如果业务要求严格区分空格、换行等形式,需要调整配置,并验证实际匹配结果。WORDTABLE 与空白处理说明
还需要提前确定以下规则:
specific只允许使用约定好的true、false,parts必须是合法整数。建议在生成字典时校验。- 需要忽略大小写时,使用
MARKTABLE的相应参数。可选参数还包括长度阈值等设置,配置时应遵循所用版本的参数顺序。 - 同一个同义词如果指向多个概念,不要依赖重复行消除歧义。链接中的
CSVTable.getRowWhere实现只返回首个匹配行,不能指望它返回全部候选概念。CSVTable 查行实现
4. 性能要求较高时如何选择
第一版可以先采用展开字典的方式:规则数量固定,更新词条也不需要修改脚本。整个过程的查询复杂度仍需结合具体实现判断。
评估性能时,要分别看词条匹配和特征回填。链接中的 CSVTable 实现会为匹配列构建并缓存 TreeWordList,但 getRowWhere 回查特征行时仍会遍历列数据。词条很多、命中密集时,特征回填也可能带来较大开销,需要在实际使用的 Ruta 版本和语料上测量。CSVTable 实现
如果压测确认这部分是瓶颈,可以编写自定义 Java UIMA Analysis Engine,在初始化时建立同义词匹配索引,以及同义词到概念记录的映射,匹配后直接创建标注并赋值。遇到歧义时,在映射值中保存候选概念列表,再由后续 Ruta 规则根据上下文筛选。Ruta 支持在流水线中使用外部 Analysis Engine。Ruta 与外部组件集成说明
备注:内容仅供参考。
