#parser #command-line-tool #cli #mmi #metamap

bin+lib mmi-parser

Fielded MetaMap (MMI) 输出解析器

6 个版本 (稳定版)

2.0.0 2022年4月15日
1.1.0 2022年4月13日
1.0.1 2022年4月13日
0.1.2 2022年4月11日
0.1.0 2022年4月4日

#932 in #command-line-tool

MIT 许可证

53KB
931

mmi-parser

mmi-parser 是一个用于从美国国立卫生研究院(NLM)的 MetaMap 工具 解析 Fielded MetaMap Indexing (MMI) 输出到 jsonlines 数据的 Rust 命令行工具(crate)。

Fielded MMI 输出的主要参考可以在 这里 找到。

! 由于 MMI 格式的变化,需要 MetaMap 2016 (或更高版本)

描述

理由

由于运行 MetaMap 程序(本地需要熟悉命令行)的(相对)技术性质,假设用户也能够安装和使用其他命令行工具(例如 cargo)。

此项目使用 Rust 将 Fielded MMI 输出解析为 jsonlines 注释数据。虽然结构并不完全不同,但选择 MMI 作为输入和 jsonlines 作为输出有以下原因。

MMI 是 MetaMap 输出中压缩密度最高的可读版本,因此将其用作解析器的输入是有逻辑的。

MMI 输出通常将每个通过 MetaMap 运行的记录放入单独的 .txt 文件中。MMI 输出还包含每个找到的概念的一行。Jsonlines 允许我们保持这种 1:1 的比率。每个输入 .txt 文件将有一个 恰好一个 jsonlines 输出文件,文件名后缀为 _parsed 以明确它是解析输出。Jsonlines 还具有保持原始 MMI 输出具有的 1:1(概念:行)比率的额外好处。因此,每个 jsonline 都可以追溯到源(MMI 输出)文本文件中的一行。这有助于跟踪结果。与传统的 json 相比,Jsonlines 还允许文件缓冲区读取,这在扫描大文件时可能是有益的。最后,虽然 MMI 已经具有与文本的各个部分相关联的字段,但 jsonlines 使这些 隐式 关联在字段名中变得 明确

例如

  • data/sample.txt --> data/sample_parsed.jsonl 其中 data/sample_parsed.jsonl 的第一行将代表源文本文档中找到的第一个(或根据 MetaMap 的结果可能是最后一个)结构,但 始终data/sample.txt 的第一行相匹配。

值得注意的是,某些 MetaMap 管道会生成包含标题行的 .txt 文件,表示文件何时被写入。请在运行此工具之前删除这些行。

如果您需要替代输出,可能用于非技术研究人员,我建议查看 jq

要求

  • cargo 包管理器(Rust 工具链的一部分)
  • just(如果克隆此存储库,则为可选的开发依赖项)

安装

Cargo 作为 Rust 工具链的一部分提供,可以通过 curl + sh 组合轻松获得(见 此处)。

要安装 mmi-parser 应用程序,请使用 cargo

cargo install mmi-parser

如果您还需要安装 MetaMap,您可以在 这里 找到相应的说明。

在 crates.io 上也提供了一个 API 这里。该 API 的范围有限,以减轻维护负担,因为该项目的主要目标是可执行解析器。

您可以通过将包添加到您的 Cargo.toml 来在本地 Rust 项目中安装 API。

mmi-parser = "1.1.0"

用法

MetaMap 简介概述

MetaMap 的用法在 NLM 的网站上得到了广泛记录,或更直接地在本文档中 此处

对于我们的用例,我们将假设您使用了一个类似以下功能的命令

echo lung cancer | metamap -N > metamap_results.txt

此处 -N 标志很重要,因为它指示 MetaMap 使用 MMI 输出。

这将导致以下类似的输出

/home/nanthony/public_mm/bin/SKRrun.20 /home/nanthony/public_mm/bin/metamap20.BINARY.Linux --lexicon db -Z 2020AA -N
USER|MMI|5.18|Carcinoma of lung|C0684249|[neop]|["LUNG CANCER"-tx-1-"lung cancer"-noun-0]|TX|0/11|
USER|MMI|5.18|Malignant neoplasm of lung|C0242379|[neop]|["Lung Cancer"-tx-1-"lung cancer"-noun-0]|TX|0/11|
USER|MMI|5.18|Primary malignant neoplasm of lung|C1306460|[neop]|["Lung cancer"-tx-1-"lung cancer"-noun-0]|TX|0/1

如您所见,输出以我的 metamap 安装程序的日志行开头。在运行 mmi-parser 之前必须删除此行。

换句话说,我们期望 metamap_results.txt 包含

USER|MMI|5.18|Carcinoma of lung|C0684249|[neop]|["LUNG CANCER"-tx-1-"lung cancer"-noun-0]|TX|0/11|
USER|MMI|5.18|Malignant neoplasm of lung|C0242379|[neop]|["Lung Cancer"-tx-1-"lung cancer"-noun-0]|TX|0/11|
USER|MMI|5.18|Primary malignant neoplasm of lung|C1306460|[neop]|["Lung cancer"-tx-1-"lung cancer"-noun-0]|TX|0/11|

您可以通过将 MetaMap 的输出重定向到这个工具来尝试解决这个问题,但这超出了我们的用例范围。

我建议使用 sed。虽然它不是 高效的选择,但其使用方法很简单。只需

sed -i '1d' <target folder>/*.txt

sed -i '' 删除第一行即可。

mmi-parser (命令行界面)

一旦您有一些 MetaMap 输出,您可以通过指定输出所在的文件夹来将其解析为 jsonlines。运行 mmi-parser 将遍历指定目录中的每个 .txt 文件,并将其解析为 jsonlines。

例如,在这个存储库中提供了一个包含样本 MMI 输出的 data/AA_sample.txt 文件。

您可以在包含该文件的目录中运行 ./mmi-parser

cargo run --example parse_aa

这运行了examples/parse_aa.rs,该文件将data作为目标目录传递给mmi-parser工具。

您可以使用mmi示例对MmiOutput类型行做相同操作。

cargo run --example parse_mmi

该示例加载data/MMI_sample.txt并输出data/MMI_sample_parsed.jsonl

然后您可以在您的data/sample_parsed.jsonl中看到jsonlines输出,该文件也包含在本repo中。

当运行完整程序(即mmi-parser <FOLDER>),将为您自动检测不同的结果类型。

工具还会显示它检测到的任何错误,并提供错误所在的文件名和行号,以及错误本身。虽然这些信息非常有用,但有时它们可能会被终端设置中的进度条所掩盖。因此,建议使用日志文件来运行程序,以捕获日志同时保持进度条可见。例如

mmi-parser data > errors.log

将所有消息/输出重定向到日志文件,您可以在其中扫描/阅读以获取更多关于结果的信息。

输出类型

需要注意的是,尽管源文件描述了三种输出类型,但实际上只有两种不同的输出类型。

明显的主要MMI类型,然后我们将剩余的AA/UA类型合并为一个(AA)。

在jsonlines输出中,您将看到第一个键表示与MetaMap输出行关联的类型。这有助于构建模型/类型来表示每个可能性,并且也便于快速目视检查。

mmi-parser (API)

如果您希望在自己的应用程序中使用mmi-parser crate,最简单、最方便的方法是通过传递字符串引用(很可能是文件中的一行字段化MMI数据)来创建一个MmiOutputAaOutput类型。函数parse_record将决定记录属于哪种类型,并为您组装类型。😃

完整的API文档可以在docs.rs上找到。

支持

如果您遇到任何问题或需要支持,请联系@nanthony007创建一个问题

贡献

欢迎提交拉取请求。对于重大更改,请先创建一个问题来讨论您想要更改的内容。

请确保根据需要更新测试。

有关更多详细信息,请参阅CONTRIBUTING.md。😃

MIT 许可证

授权协议

依赖关系

~6–19MB
~205K SLoC