
OpenMed 零样本 NER 实战GLiNER 模型索引、领域感知标签与本地推理全流程【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmedOpenMed 的零样本 NER 工具链基于 GLiNER 系列模型构建提供从模型目录扫描索引、领域感知标签默认值到统一推理入口和 token 级标注转换的完整能力全部可在本地离线运行。本文覆盖.[gliner]依赖安装、build_index/write_index索引构建、领域标签解析优先级、infer推理调用、BIO/BILOU 适配器以及冒烟测试与单元测试的运行方式读完即可在自己的环境中跑通端到端的零样本命名实体识别。若只需要一份任务导向的速查流程可参考 Zero-shot NER How-to。安装与运行前提零样本工具链依赖 GLiNER 可选依赖组使用 uv 安装uv pip install .[gliner]该 extra 在 pyproject.toml 中定义为gliner[tokenizers]0.2.0底层还要求torch与transformers可导入。运行冒烟测试或推理前需要保证 GLiNER 检查点已存在于本地——工具链默认在仓库根目录的models/index.json位置查找索引文件这一默认路径在 indexing.py 中由DEFAULT_INDEX_PATH PACKAGE_ROOT / models / index.json确定。依赖缺失时不会静默失败families/gliner.py 中的ensure_gliner_available()会依次检查gliner、torch、transformers三个模块缺失时抛出MissingDependencyError并附带pip install openmed[gliner]的修复提示对应 exceptions.py。模型索引扫描模型目录并生成 index.json索引器会遍历一个存放模型工件GLiNER 检查点、Hugging Face 导出目录等的目录树为每个候选模型目录生成一条结构化元数据记录并持久化为统一的index.json。Python API 用法from pathlib import Path from openmed.ner import build_index, write_index models_dir Path(/path/to/models) index build_index(models_dir) write_index(index, Path(models/index.json), prettyTrue)生成的索引包含metagenerated_at、source_dir、model_count、domain_count与models列表两部分。结合 indexing.py 源码可以明确以下几点实现细节模型目录识别启发式目录内包含config.json、tokenizer.json、model.safetensors、pytorch_model.bin等核心文件MODEL_CORE_FILES集合或存在分片.safetensors或带metadata.json/config.yaml的目录会被视为模型目录。家族识别路径 token 匹配FAMILY_HINTS表——gliner、zero-shot、zeroshot、biomed归入 GLiNER 家族gliner2、fastino、fastgliner、v2归入 GLiNER2 家族未命中则标记为OTHER。这个家族字段后续直接决定推理走哪条执行路径。领域与语言推断DOMAIN_TOKENS表把路径中的关键词如biomed→biomedical、genomics→genomic、cyber→cybersecurity归一到规范领域名识别不到时落入genericLANGUAGE_HINTS表类似地推断en、es、multi等语言标签推断不到时默认en。去重与稳定性_deduplicate按模型标识符去重并按 id 排序模型 id 由相对路径各段以连字符拼接并转小写生成保证跨次运行稳定便于下游组件确定性引用。原子写入write_index先写.tmp再os.replace覆盖避免半截 JSON 损坏索引。build_index对输入有严格校验目录不存在抛FileNotFoundError不是目录抛NotADirectoryError。生成的索引可由load_index(path)重新加载索引文件中的notes字段来自模型目录内metadata.json的notes或description字段。领域感知标签默认值不同医学子领域需要不同的实体类型集合。工具链内置一份精选的领域 → 标签列表映射默认数据打包在 defaults.json资源路径openmed.zero_shot.data.label_maps加载逻辑位于 labels.py。查看可用领域与默认标签from openmed.ner import available_domains, get_default_labels print(available_domains()) print(get_default_labels(biomedical)) print(get_default_labels(endocrinology))打包的defaults.json覆盖了大量领域例如领域默认标签biomedicalDisease, Drug, Gene, OrganismclinicalProblem, Treatment, Test, BodyPartendocrinologyGlycemicMeasure, ThyroidFunctionMeasure, HormoneLevel, InsulinRegimen, MetabolicFinding, EndocrineGlandoncologySimpleChemical, Cancer, GeneOrGeneProduct, Organ, Tissue, PathologicalFormation 等 18 个radiologyFinding, ImagingModality, Anatomy, Laterality, Measurement, ImpressiongenericPerson, Organization, Location, Date完整的 40 余个领域含麻醉、营养、儿保、接种、过敏、肺科、护理观察等临床子领域可直接阅读上述 JSON 文件。从 labels.py 的实现看加载过程有几个值得注意的机制load_default_label_map(overrides_pathNone)支持传入自定义路径覆盖打包默认值——文档中测试或部署中可通过向高层 API 提供自定义路径来覆盖即指此参数领域名会经过strip().lower().replace( , _)归一化标签按小写去重因此get_default_labels(Endocrinology )与endocrinology等价资源读取使用lru_cache缓存reload_default_label_map()可清缓存强制重载领域缺失时get_default_labels默认回退到generic集合inherit_genericTrue保证推理总能拿到一组标签。推理 APINerRequest 与 infer统一推理入口是 infer.py 中的infer()from openmed.ner import NerRequest, infer req NerRequest( model_idgliner-biomed-tiny, textImatinib inhibits BCR-ABL in chronic myeloid leukaemia., threshold0.55, domainbiomedical, ) resp infer(req) for entity in resp.entities: print(entity.label, entity.text, entity.score)NerRequest字段model_id必填须匹配索引中的模型标识、text必填、threshold默认0.5、labels显式标签列表可选、domain可选。标签解析优先级与_resolve_labels实现逐条对应显式传入的request.labels去除空字符串后直接使用此时domain字段仅作为元数据记录request.domain对应的默认标签请求未指定领域时取索引条目record.domains[0]仍解析不出时回退generic标签集。执行路径按索引中的家族字段分派GLiNER 家族经load_gliner_handle加载模型lru_cache(maxsize4)缓存实例hf_token、cache_dir、device均取自全局OpenMedConfig调用predict_entities(text, labels, threshold, flat_nerTrue)GLiNER2 家族走load_gliner2_handle调用方式相同其他家族降级到 Hugging Face 风格 pipelinetasktoken-classificationaggregation_strategysimple。无论走哪条路径_apply_threshold会再按request.threshold做一遍score threshold过滤最终实体以Entitytext、start、end、label、score、group、extras统一表示。NerResponse.meta会记录实际使用的labels_used、domain_used与threshold便于审计这次推理到底用了哪组标签。注意model_id未命中索引时抛ValueError因此先建索引再推理是必要前置步骤。Token 分类适配器span 实体转 BIO/BILOU 标签当结果需要喂给 token 级分类器或做训练数据准备时可用 adapter.py 中的to_token_classification把 span 实体投影到 token 级标注from openmed.ner import to_token_classification tokens to_token_classification(resp.entities, req.text, schemeBILOU) print(tokens.labels())从源码实现看该适配器有三个关键行为方案校验仅支持BIO与BILOU大小写不敏感非法 scheme 抛ValueError重叠 span 按分数优先_assign_entities_to_tokens先把实体按score降序排列再逐一定位 token同一 token 被多个实体覆盖时保留分数更高者分词回退策略优先使用传入 tokenizer 的offset_mapping支持TokenClassifier风格的get_tokenizer()协议对象若 tokenizer 缺失、调用失败或不返回 offset回退到基于正则\S的空白分词_simple_tokenize保证无 tokenizer 环境也能出标注。BILOU 模式下单 token 实体标记为U-Label多 token 实体首尾为B-/L-、中间为I-返回的TokenClassificationResult通过labels()返回标签序列metadata.groups记录实体group对应的 token 索引方便下游按组聚合。冒烟测试端到端快速验证仓库内置 smoke_gliner.py 用于轻量端到端验证python scripts/smoke_gliner.py --limit 2 --threshold 0.4 --adapter脚本参数与默认值对照源码_build_parser参数默认值说明--index打包的默认索引指定models/index.json路径--limit3最多测试前 N 个 GLiNER 家族模型--threshold0.4置信度阈值--adapter关闭推理后追加打印 token 级标签脚本逻辑先检查 GLiNER 依赖可用性缺失时parser.error直接中止并提示安装命令→ 从索引中筛出 GLiNER 家族模型 → 按模型第一个领域选取内置示例文本DEFAULT_SAMPLE_TEXTS覆盖 biomedical、clinical、genomic、finance 等 15 个领域的短句→ 调用infer并打印label: span [start-end] scorexxx格式的结果--adapter时额外打印逐 token 标注。该脚本是索引 → 标签解析 → 推理 → 适配整条链路的最小验证工具。单元测试在 tests/unit/ner 目录下运行单元测试排除慢速冒烟检查python3 -m pytest tests/unit/ner -m not slow需要完整覆盖时包含慢速测试python3 -m pytest -m slow测试套件对 GLiNER API 使用 mock单元测试过程中不会触发任何模型下载。套件按模块拆分分别覆盖本文涉及的各个能力test_indexing.py 验证索引构建与去重test_labels.py 与 test_domain_label_maps.py 验证领域标签解析与覆盖路径test_infer.py 验证标签优先级与阈值过滤test_adapter.py 验证 BIO/BILOU 投影与重叠处理test_gliner_loader.py 验证依赖检查与句柄缓存test_smoke.py 覆盖冒烟脚本参数解析。小结OpenMed 零样本 NER 工具链的设计核心是索引驱动 领域感知先由build_index把本地模型目录扫描成稳定的元数据索引再由infer依据索引中的家族与领域字段完成标签解析和推理分派最后由 token 分类适配器衔接 token 级下游任务。所有环节均围绕本地检查点与打包的领域标签映射工作依赖缺失会显式报错而非静默降级配合冒烟脚本与 mock 化的测试套件可以在无网络下载的前提下完成能力验证。【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考