PAYATHON 2026

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
3specific
4parts

展开时,先把规范名称本身加入匹配词集合,再按 | 拆分同义词,清理首尾空白并去重。每次更新字典后执行一次转换即可。

供 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 与外部组件集成说明

备注:内容仅供参考。