# Accident Report Analysis

> 从 Word/PDF 事故报告文档中提取事故时间、客户名称、问题现象、问题原因、解决措施等信息，输出到 Excel 供分析汇报。 支持多模板章节映射（事件影响/事件原因/整改建议等）、表格按行提取、MinerU PDF 缓存、英文 Incident Report。 当用户需要分析事故报告、提取事件文档结构化数据、汇总事故说明文档，或提到 accident-report-analysis 时使用。

- Skill: `yangchen91/accident-report-analysis` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add yangchen91/accident-report-analysis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yangchen91/accident-report-analysis/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: YangChen91 (https://skillmd.com/u/yangchen91)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/yangchen91/accident-report-analysis

---


# 事故报告分析 (Accident Report Analysis)

从 Word（.docx/.docm）和 PDF 事故报告中提取结构化信息，合并重复报告，按时间排序后输出 Excel。

## 工作流程

1. 确认输入文件夹（含 `.docx`、`.docm`、`.pdf`）和输出 Excel 路径。
2. 运行提取脚本（见下方）。
3. 检查输出列：事故时间、客户名称、**问题类型**、问题现象、问题原因、解决及优化措施、文件名。
4. 若识别有误，查阅 [reference.md](reference.md) 中的提取规则与客户列表。

## 推荐执行方式

```bash
python scripts/extract_accident_info.py --input "D:\Cursor_WorkSpace\质量加固\事故报告原始文档" --output "D:\Cursor_WorkSpace\质量加固\事故报告汇总.xlsx"
```

工作区默认目录结构：

| 路径 | 说明 |
|------|------|
| `质量加固/事故报告原始文档/` | 原始 Word/PDF 事故报告（MinerU 缓存在其下 `.mineru_cache/`） |
| `质量加固/事故报告汇总.xlsx` | 提取结果 Excel |
| `质量加固/事故报告Dashboard.html` | 统计 Dashboard（由 `generate_dashboard.py` 生成） |

通用命令（路径可替换）：

```bash
python scripts/extract_accident_info.py --input "事故报告文件夹路径" --output "输出.xlsx"
```

依赖安装：

```bash
pip install pandas openpyxl
npm i -g mineru-open-api
```

PDF 解析使用 [pdf-converter-mineru](../pdf-converter-mineru/SKILL.md) 的 `mineru-open-api flash-extract`（无需 API Key，单文件 ≤10MB / ≤20页）。

**首次运行较慢**（约 69 个 PDF × 10 秒/份 ≈ 10～15 分钟），结果缓存在输入目录 `.mineru_cache/`。**再次生成 Excel 会直接读缓存，速度与 pdfplumber 方案接近。**

## 核心能力

| 能力 | 说明 |
|------|------|
| 文档解析 | DOCX/DOCM 按 body 顺序读段落+表格；PDF 用 MinerU flash-extract + HTML 表格提取 |
| 信息提取 | 多标题映射到各列；**问题类型**按现象关键词自动多选分类（顿号分隔） |
| 重复合并 | 按 `(客户名称, 归一化文件名)` 合并 `(1)`、`- 副本` 等同事故多份报告 |
| 空值填充 | 各列为空时从全文二次解析；事故时间优先落款与中文数字日期 |
| 排序 | 事故时间倒序，客户名称正序 |

## 脚本说明

| 脚本 | 用途 |
|------|------|
| `scripts/extract_accident_info.py` | CLI 入口，批量处理文件夹并输出 Excel |
| `scripts/core_functions.py` | 核心解析、提取、合并逻辑（供脚本 import） |

核心函数见 [reference.md](reference.md#核心函数)。

## 文档命名建议

推荐格式：`YYYY年MM月DD日客户名称问题描述.docx` 或 `.pdf`

章节标题使用标准关键词（问题现象、原因分析、解决及优化措施等），并在文档开头附近写明事故时间。

## 故障排除

| 问题 | 处理 |
|------|------|
| DOCM 解析失败 | 脚本已用 zipfile 直接读 `word/document.xml` |
| 重复报告未合并 | 检查文件名是否含 `(1)`、`- 副本` 等，见 reference.md 归一化规则 |
| 客户名称识别错误 | 更新 `core_functions.py` 中 `CLIENTS` 列表 |
| 事故时间为空 | 确保文档含可识别日期格式；优先查落款时间、中文数字日期 |
| PDF 解析失败 | 确认已安装 `mineru-open-api`；大文件（>10MB 或 >20页）需改用 `extract` 模式 |
| PDF 文本乱码/空格 | MinerU 输出 Markdown，脚本会清理多余空格，保留日期时间间空格 |
| 某行三列全空或部分空 | 见下方「迭代经验」与 reference.md「解析陷阱与调优经验」 |

## 迭代经验（维护必读）

以下为实际批量提取 200+ 份报告后沉淀的规则，**新增章节关键词或改解析逻辑时请先对照**。

### 1. 章节映射：同一列可对应多种标题

报告模板不统一，**不要假设只有「问题现象 / 原因分析 / 解决及优化措施」三个标准标题**：

| Excel 列 | 常见文档标题（均应归入此列） |
|----------|------------------------------|
| 问题现象 | 问题现象、故障经过、事件经过、**事件影响**、**事件内容**、**事件处理流程**、**事件过程描述**、事故内容/事故內容 |
| 问题原因 | 原因分析、**事件原因** |
| 解决及优化措施 | 调整方案、优化建议、**整改建议**、**事件责任建议**、整改措施、Resolution |

**英文报告**（如 `Incident Report 20210705(HTAI).pdf`）：**事件 = 问题**。事故內容 / Incident Description → 问题现象；Root Cause → 问题原因；Corrective Action / Resolution → 解决及优化措施。华泰 HTAI 报告多为繁体，关键词需同时覆盖简繁。

同一文档内多个现象/措施章节（如「事件过程描述 + 事件影响」「整改建议 + 事件责任建议」）**合并写入同一列**，Excel 单元格内用换行分隔。

### 2. 表格内容：顺序拼接 + 按行换行

不少 Word 报告用表格承载核心信息（如事件处理流程、整改建议表）：

- DOCX 必须按 `w:body` **子节点顺序**交替读取段落与表格，不能先抽全部段落再抽全部表格。
- 表格每一行：从左到右拼接单元格 → `_beautify_table_row` 美化（补标点、去多余空格）→ 作为独立一行文本。
- 跳过表头行（时间、发生事件、处理方法、日期和時間 等）。
- PDF 经 MinerU 转 Markdown 后可能含 HTML `<table>`，需 `_parse_html_tables` 同样按行提取。
- 写入 Excel 时，同一章节的多行内容用 `\n` 连接，**一行表格数据对应单元格内一行**。

### 3. 页脚/截断规则：避免误杀正文

**不要用宽泛关键词截断正文**。典型踩坑：

- 正文写「处理人：恒云科技」时，若规则匹配任意含「恒云科技」的行，会导致**整段现象/措施被丢弃**（如广发 WMC 对账事件 docx 第 65 行曾因此三列全空）。
- 正确做法：仅匹配独立落款行（如 `^恒云科技$`）或含「特此说明 / ---完-- / 本文档为 / 文档编号」的行。

### 4. 段落合并与序号

- `normalize_section_items`：前一条以句号类标点结尾时，**下一条应新开一项**，不能无脑拼接到上一条（否则「整改建议」与「事件责任建议」会合成一段）。
- `add_line_numbers`：列表序号用 `^[1-9]\d?[、.]`，**不要把 `2025.1.27` 这类日期当成已有编号**。

### 5. 标题用词变体

实际文档标题常有细微差异，需一并注册到 `SECTION_HEADERS`：

- 「事件处理流程」vs「**事件过程描述**」（同一语义，不同写法）
- 繁体：問題現象、事故內容、解決方案、處理措施

新增空列案例时，先用调试方式打印 `extract_text_from_docx` / MinerU 文本的逐行输出，并对每行调用 `_match_section`，确认是**未识别标题**还是**被页脚规则跳过**。

### 6. PDF 与性能

- 首次全量 PDF 解析慢（MinerU 逐份转换），结果缓存在输入目录 `.mineru_cache/*.md`。
- 调整章节规则或表格逻辑后，**DOCX 改动即时生效**；PDF 若缓存未过期则直接读 `.md`，无需重跑 MinerU。
- 强制重转某 PDF：删除对应 `.mineru_cache/xxx.md` 后再跑脚本。

### 7. 空列回填

合并去重后若仍有空列，`fill_missing_fields` 会基于 `原始文本` 二次解析 + 关键词启发式回填。但**首选仍应修章节映射与表格解析**，回填仅作兜底。

详细函数说明、关键词完整列表与调试步骤见 [reference.md](reference.md)。

