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
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 工具链的一部分提供,可以通过 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数据)来创建一个MmiOutput
或AaOutput
类型。函数parse_record
将决定记录属于哪种类型,并为您组装类型。😃
完整的API文档可以在docs.rs上找到。
支持
如果您遇到任何问题或需要支持,请联系@nanthony007或创建一个问题。
贡献
欢迎提交拉取请求。对于重大更改,请先创建一个问题来讨论您想要更改的内容。
请确保根据需要更新测试。
有关更多详细信息,请参阅CONTRIBUTING.md。😃
MIT 许可证
依赖关系
~6–19MB
~205K SLoC