- name
- reaction-data-extraction
- description
- 从 PDF 文献中提取化学反应数据,特别是反应条件优化信息。支持提取反应物、产物、催化剂、溶剂、温度、时间、产率等,并输出结构化 CSV 文件。使用 MinerU + NLP + 规则匹配进行精确提取。
- trigger
- ["反应数据提取","提取反应条件","reaction extraction","extract reaction conditions","从文献提取反应","反应优化数据","reaction optimization","提取产率","extract yield","反应表格","reaction table"]
# 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 偶联反应的条件
```
### 命令行使用
```bash
# 基本提取(自动模式)
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` |
## 输出示例
### 基本提取
```bash
$ 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 输出示例
```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 输出示例
```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
}
]
}
```
## 依赖安装
```bash
# 安装 MinerU(命令行工具)
pip install 'mineru[all]'
# 如果遇到 numpy 版本问题
pip install 'numpy<2.0' 'pandas<3.0'
# 检查安装
mineru --version
```
### 检查安装
```bash
# 检查 MinerU 命令行工具
mineru --help
# 测试 PDF 解析
mineru -p test.pdf -o ./test_output -m txt
```
## 工作流程
### 1. PDF 解析(使用 MinerU 命令行)
```python
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. 表格检测与提取
```python
import re
# 从 Markdown 中提取表格
table_pattern = r'\|.*?\|.*?\|.*?\n\|[-\| ]+\|\n((?:\|.*?\|\n)+)'
tables = re.findall(table_pattern, text_content, re.MULTILINE)
```
### 3. 反应数据解析
```python
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. 文本数据提取
```python
# 反应条件模式
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 配合
```bash
# 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 配合
```bash
# 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: 单篇文献提取
```bash
# 提取所有反应数据
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: 批量提取
```bash
# 批量处理整个目录
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: 只提取最优条件
```bash
# 提取并过滤高产率条件
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 \
View on GitHub