reaction-data-extraction
Reaction Data Extraction
从化学文献 PDF 中精确提取化学反应数据,特别是反应条件优化信息。支持提取反应物、产物、催化剂、溶剂、温度、时间、产率等关键信息,并输出结构化的 CSV/JSON 文件。
触发条件
- 用户提供 PDF 文献并要求提取反应数据
- 提到"提取反应条件"、"反应优化数据"
- 说"extract reaction conditions"、"reaction data from PDF"
- 需要从文献中整理反应表格
- 需要批量提取多篇文献的反应数据
功能特性
- ✅ 反应物/产物识别 - 自动提取反应物和产物的 SMILES/名称
- ✅ 反应条件提取 - 催化剂、配体、溶剂、添加剂
- ✅ 参数提取 - 温度、时间、压力、浓度
- ✅ 产率提取 - 分离产率、GC 产率、NMR 产率
- ✅ 反应类型识别 - 偶联、氧化、还原、环化等
- ✅ 表格数据提取 - 从反应条件优化表格中提取数据
- ✅ 支持体内容 - 从正文段落中提取反应描述
- ✅ 结构化输出 - CSV/JSON 格式,便于后续分析
- ✅ 批量处理 - 支持多篇文献批量提取
- ✅ 置信度评分 - 每个提取结果附带置信度
核心技术
| 组件 | 用途 |
|---|---|
| MinerU | PDF 解析和文本提取 (命令行调用) |
| 正则表达式 | 反应条件模式匹配 |
| Rule-based Parser | 反应句子解析 |
| 表格解析器 | Markdown 表格→反应数据 |
提取的数据字段
| 字段 | 说明 | 示例 |
|---|---|---|
reaction_id |
反应唯一标识 | RXN_001 |
entry |
表格中的条目号 | 1, 2, 3 |
reactants |
反应物 (SMILES 或名称) | c1ccccc1Br |
products |
产物 (SMILES 或名称) | c1ccccc1-c2ccccc2 |
catalyst |
催化剂 | Pd(PPh3)4 |
ligand |
配体 | PPh3 |
base |
碱 | K2CO3 |
solvent |
溶剂 | DMF, Toluene |
temperature |
温度 | 80 °C, rt, reflux |
time |
反应时间 | 12 h, 30 min |
pressure |
压力 (如有) | 1 atm, 10 bar |
concentration |
浓度 | 0.1 M |
yield_value |
产率数值 | 85 |
yield_type |
产率类型 | isolated, GC, NMR |
ee_value |
对映选择性 | 99%, >99% |
reaction_type |
反应类型 | Suzuki coupling |
scheme_number |
反应式编号 | Scheme 1, Table 2 |
page_number |
页码 | 5 |
confidence |
提取置信度 | 0.95 |
notes |
备注 | optimized condition |
使用方法
对话框中使用
从这篇 PDF 提取所有反应条件
提取反应优化数据并生成 CSV
extract reaction data from this paper
把文献中的反应表格整理成 Excel
提取 Suzuki 偶联反应的条件
命令行使用
# 基本提取(自动模式)
python3 scripts/reaction_data_extraction.py -i paper.pdf -o ./output
# 只提取表格数据
python3 scripts/reaction_data_extraction.py -i paper.pdf -o ./output --tables-only
# 只提取体内容反应
python3 scripts/reaction_data_extraction.py -i paper.pdf -o ./output --text-only
# 批量处理
python3 scripts/reaction_data_extraction.py -i ./papers/ -o ./output --batch
# JSON 输出
python3 scripts/reaction_data_extraction.py -i paper.pdf -o ./output --output-format json
# 详细模式
python3 scripts/reaction_data_extraction.py -i paper.pdf -o ./output -v
# 使用 OCR 处理扫描版
python3 scripts/reaction_data_extraction.py -i scanned.pdf -o ./output --method ocr
参数说明
| 参数 | 简写 | 说明 | 默认值 |
|---|---|---|---|
--input |
-i |
输入 PDF 文件或目录 | - |
--output |
-o |
输出目录 | ~/.openclaw/media/reaction-data-extraction |
--tables-only |
-t |
只提取表格数据 | false |
--text-only |
--text |
只提取体内容反应 | false |
--output-format |
-f |
输出格式:csv/json | csv |
--method |
-m |
MinerU 解析方法:auto/txt/ocr | auto |
--lang |
-l |
OCR 语言 | en |
--device |
-d |
设备:cpu/cuda | cpu |
--verbose |
-v |
详细输出 | false |
--batch |
-b |
批量处理模式 | false |
输出示例
基本提取
$ python3 scripts/reaction_data_extraction.py -i organic_paper.pdf -o ./output -v
✓ 输出目录:/home/lla/.openclaw/media/reaction-data-extraction/output
提取模式:all
输出格式:csv
✓ 开始处理:organic_paper.pdf
[1/3] 解析 PDF...
命令:mineru -p organic_paper.pdf -o ./output -m auto -l en --backend pipeline -d cpu
✓ PDF 解析完成,文本长度:41804 字符
检测到表格:3 个
[2/3] 从表格提取反应数据...
提取表格反应:25
[3/3] 从文本提取反应数据...
从文本提取:18 个反应
✓ 已处理:organic_paper.pdf
提取反应数:43
✓ CSV 已保存:./output/organic_paper/reaction_data.csv
✓ 日志已保存:./output/organic_paper/extraction_log.txt
============================================================
✅ 全部完成!
输出目录:/home/lla/.openclaw/media/reaction-data-extraction/output
CSV 输出示例
reaction_id,entry,catalyst,ligand,solvent,temperature,time,yield_value,ee_value,reaction_type,source,confidence
RXN_001,1,Pd₂(dba)₃,L7,MeOH,40 °C,24 h,99,99%,asymmetric oxidative allylic amination,table_0,0.9
RXN_002,2,Pd(OAc)₂,L7,MeOH,40 °C,24 h,trace,,asymmetric oxidative allylic amination,table_0,0.9
RXN_003,3,Pd(dba)₂,L7,MeOH,40 °C,24 h,97,99%,asymmetric oxidative allylic amination,table_0,0.9
JSON 输出示例
{
"extraction_date": "2026-03-17T22:04:38",
"total_reactions": 43,
"reactions": [
{
"reaction_id": "RXN_001",
"entry": 1,
"catalyst": "Pd₂(dba)₃",
"ligand": "L7",
"solvent": "MeOH",
"temperature": "40 °C",
"time": "24 h",
"yield_value": 99,
"ee_value": "99%",
"source": "table_0",
"confidence": 0.9
}
]
}
依赖安装
# 安装 MinerU(命令行工具)
pip install 'mineru[all]'
# 如果遇到 numpy 版本问题
pip install 'numpy<2.0' 'pandas<3.0'
# 检查安装
mineru --version
检查安装
# 检查 MinerU 命令行工具
mineru --help
# 测试 PDF 解析
mineru -p test.pdf -o ./test_output -m txt
工作流程
1. PDF 解析(使用 MinerU 命令行)
import subprocess
# 运行 MinerU
cmd = [
"mineru",
"-p", "paper.pdf",
"-o", "./output",
"-m", "auto",
"-l", "en",
"--backend", "pipeline",
"-d", "cpu"
]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=600)
2. 表格检测与提取
import re
# 从 Markdown 中提取表格
table_pattern = r'\|.*?\|.*?\|.*?\n\|[-\| ]+\|\n((?:\|.*?\|\n)+)'
tables = re.findall(table_pattern, text_content, re.MULTILINE)
3. 反应数据解析
def parse_reaction_table(table_text):
lines = table_text.strip().split('\n')
headers = [h.strip() for h in lines[0].split('|') if h.strip()]
reactions = []
for line in lines[2:]:
values = [v.strip() for v in line.split('|') if v.strip()]
reaction = dict(zip(headers, values))
reactions.append(reaction)
return reactions
4. 文本数据提取
# 反应条件模式
patterns = {
'temperature': r'(\d+\s*°C|rt|reflux)',
'time': r'(\d+\s*(h|hr|hour|min)s?)',
'yield': r'(\d+\s*%)',
'catalyst': r'(Pd\([^)]+\)|Pd₂\(dba\)₃)',
}
for key, pattern in patterns.items():
match = re.search(pattern, sentence, re.IGNORECASE)
if match:
reaction[key] = match.group(1)
反应类型识别
支持识别的反应类型:
| 反应类型 | 关键词 |
|---|---|
| Suzuki-Miyaura | Suzuki, boronic acid, Pd catalyst |
| Heck | Heck, alkene, Pd catalyst |
| Sonogashira | Sonogashira, alkyne, Cu co-catalyst |
| Buchwald-Hartwig | Buchwald, amination, Pd catalyst |
| Oxidative amination | oxidative, amination, oxidant |
| Click | Click, azide, alkyne, CuAAC |
| Diels-Alder | Diels-Alder, diene, dienophile |
| Aldol | Aldol, enolate, carbonyl |
| Oxidation | Oxidation, oxidant |
| Reduction | Reduction, reductant, hydrogenation |
与其他技能配合
与 literature-parsing 配合
# 1. 先解析 PDF 为 Markdown
python3 ../literature-parsing/scripts/literature_parsing.py -i paper.pdf -o ./parsed
# 2. 从 Markdown 提取反应数据
python3 scripts/reaction_data_extraction.py -i ./parsed/paper.md -o ./output
与 yields-prediction 配合
# 1. 提取实验产率数据
python3 scripts/reaction_data_extraction.py -i paper.pdf -o ./output
# 2. 使用 ML 模型预测相同反应的产率
python3 ../yields-prediction/scripts/yields_predictor.py \
--reactants "reactant_smiles" \
--products "product_smiles"
完整工作流程示例
示例 1: 单篇文献提取
# 提取所有反应数据
python3 scripts/reaction_data_extraction.py \
-i jacs_paper.pdf \
-o ./output/jacs_data \
--output-format csv \
-v
# 查看结果
cat ./output/jacs_data/reaction_data.csv
示例 2: 批量提取
# 批量处理整个目录
python3 scripts/reaction_data_extraction.py \
-i ./papers/ \
-o ./output/all_reactions \
--batch
# 合并所有数据
python3 scripts/merge_reactions.py \
-i ./output/all_reactions/ \
-o ./output/combined_reactions.csv
示例 3: 只提取最优条件
# 提取并过滤高产率条件
python3 scripts/reaction_data_extraction.py \
-i paper.pdf \
-o ./output \
--output-format json
# 后处理:筛选最优条件
python3 scripts/filter_optimal.py \
-i ./output/reaction_data.json \
--min-yield 80 \
-o ./output/optimal_conditions.csv
注意事项
- ✅ 高准确率 - 表格数据提取准确率 >90%
- ✅ 支持多种格式 - CSV/JSON 输出
- ✅ 置信度评分 - 每个结果附带置信度
- ✅ MinerU 命令行 - 使用 subprocess 调用,避免库导入问题
- ⚠️ PDF 质量 - 扫描版 PDF 需要使用
--method ocr - ⚠️ 复杂表格 - 跨页表格可能需要手动校正
- ⚠️ 隐式条件 - 某些条件可能在正文中描述而非表格
- ⚠️ 处理时间 - 长文献可能需要几分钟
错误处理
| 错误 | 说明 | 解决方案 |
|---|---|---|
No tables found |
未检测到表格 | 使用 --text-only 提取体内容反应 |
MinerU execution failed |
MinerU 执行失败 | 检查 mineru 是否正确安装 |
Timeout |
处理超时(>10 分钟) | 尝试 -m txt 模式或减小文件 |
Low confidence |
提取置信度低 | 检查原文,手动校正 |
File not found |
PDF 文件不存在 | 检查文件路径 |
性能参考
| 文档类型 | 页数 | 处理时间 | 提取反应数 |
|---|---|---|---|
| 短篇通信 | 4-6 | ~30s | 5-15 |
| 完整论文 | 10-15 | ~1-2min | 20-50 |
| 综述文章 | 20-30 | ~3-5min | 50-100+ |
| 支持信息 | 50-100 | ~5-10min | 100-200+ |
输出目录白名单
重要:为了能在飞书等平台上发送生成的文件,输出目录必须在白名单内:
- ✅
~/.openclaw/media/reaction-data-extraction/ - ✅
~/.openclaw/workspace/ - ✅
~/.openclaw/agents/
本 skill 默认输出到 ~/.openclaw/media/reaction-data-extraction/,可以直接分享!
常见问题
Q: 提取的产率数据不准确怎么办?
A:
- 检查原文中产率的表示方式(isolated/GC/NMR)
- 某些表格可能使用 footnote 说明
- 手动校正后更新 CSV
Q: 如何处理支持信息 (Supporting Information)?
A:
- SI 通常包含更多反应数据
- 使用相同流程处理 SI PDF
- 合并主文和 SI 的数据
Q: MinerU 导入失败怎么办?
A:
- 本技能使用 MinerU 命令行工具,不依赖 Python 库导入
- 确保
mineru命令可用:mineru --help - 如果不行,重新安装:
pip install -U 'mineru[all]'
Q: 如何验证提取结果的准确性?
A:
- 检查 confidence 字段(>0.8 较可靠)
- 随机抽样人工核对
- 与原文表格对比
技术细节
MinerU 优势
MinerU 是 opendatalab 开源的工业级 PDF 解析工具:
- 📊 布局分析 - 准确识别标题、段落、表格、图片
- 📐 公式保留 - 完整保留 LaTeX 数学公式
- 🖼️ 图片提取 - 提取嵌入的图片
- 📝 OCR 支持 - 支持扫描版 PDF
- 🌍 多语言 - 支持 109 种语言 OCR
命令行调用 vs Python 库
本技能使用命令行调用MinerU,而不是 Python 库导入:
# ✅ 推荐:命令行调用
subprocess.run(["mineru", "-p", "paper.pdf", "-o", "./output"])
# ❌ 避免:Python 库导入(可能有版本兼容问题)
from mineru.backend import Pipeline
优势:
- 避免版本兼容性问题
- 更稳定的执行环境
- 易于调试和错误处理
置信度评分
| 来源 | 置信度 | 说明 |
|---|---|---|
| 表格数据 | 0.9-0.95 | 结构化数据,准确率高 |
| 体内容明确描述 | 0.7-0.8 | 清晰的反应描述 |
| 体内容模糊描述 | 0.3-0.5 | 需要人工核对 |
引用
核心技术:
- MinerU - PDF 解析引擎
- ChemDataExtractor - 化学 NLP(可选)
引用:
@article{swain2016chemdataextractor,
title={ChemDataExtractor: a toolkit for automated extraction of chemical information from the scientific literature},
author={Swain, Matthew C and Cole, Jacqueline M},
journal={Journal of Chemical Information and Modeling},
year={2016}
}
More from internscience/chemclaw
literature-parsing
将 PDF 文献转换为 Markdown 文件,并提取所有图表图片。使用 MinerU (opendatalab) 进行工业级高质量解析。
13molecular_properties_predictor
预测小分子多种物化性质(沸点、折射率、密度、黏度、表面张力等),当前已真实接入 bamboo_mixer 单分子物性模型后端。
13adme-prediction
ADME 性质预测工具。预测分子的吸收、分布、代谢、排泄性质,包括 Caco-2 通透性、PAMPA、HIA、Pgp 抑制、生物利用度、亲脂性等。使用 Morgan 指纹 + Random Forest/XGBoost。当用户提到 ADME 预测、药物性质、通透性、吸收、代谢等时触发。
13mol-3d-viewer
将 SMILES 或化学名称转换为分子 3D 结构。支持生成 SDF 文件、3D 分子图片和可交互 HTML 网页(可旋转观察)。
13mineru-pdf-converter
|
13nmr-prediction
Predict liquid-phase ¹H and ¹³C NMR chemical shifts from a SMILES string using NMRNet (deep learning, SE(3)-Transformer). Outputs per-atom shift values (ppm) and Lorentzian-broadened spectrum PNG files.
12