mcpField
S
sn-da-non-spreadsheet-analysis

sn-da-non-spreadsheet-analysis

github.com/opensensenova文档处理6.0k67 次安装2 天前更新
代码仓库

关于 sn-da-non-spreadsheet-analysis

用于分析 Word、PDF 和 PPT 文档的技能,面向需要提取并核对文档内容的工作流。它按文件格式加载对应子技能,并要求扫描全部页面、表格及图像内容。

主要功能

  1. 01按格式加载解析子技能
  2. 02遍历所有页面、段落和幻灯片
  3. 03提取文档中的全部表格
  4. 04检测图像内容并调用 caption.py
  5. 05核验统计与计算结果

适用场景

  1. 01汇总目录中的多份文档
  2. 02检查 PDF 扫描页的图像内容
  3. 03提取演示文稿和 Word 文件的表格
  4. 04回答需要核验数字的文档问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/opensensenova/sensenova-skills --skill sn-da-non-spreadsheet-analysis

安装后在 Claude Code 中输入/sn-da-non-spreadsheet-analysis确认已加载。

详细介绍

文档分析技能 — Word / PDF / PPT

用于解析 Word、PDF 和 PPT 文档的端到端工作流。每种格式都有特定的解析注意事项——请严格遵循对应格式的子技能。


工作流

步骤 0 — 确定文件类型和输入范围
import os

input_path = "/mnt/data/..."  # from user

# Detect single file vs directory (multi-file scenario)
if os.path.isdir(input_path):
    all_files = [
        os.path.join(input_path, f)
        for f in os.listdir(input_path)
        if f.lower().endswith(('.docx', '.doc', '.pdf', '.pptx', '.ppt'))
    ]
    print(f"Found {len(all_files)} documents: {all_files}")
else:
    all_files = [input_path]

# Route by extension
ext = os.path.splitext(all_files[0])[-1].lower()
print(f"File type: {ext}")

重要规则:当 input_path 是目录,或用户说“这些文件”/“所有文档”时, 处理所有文件并汇总结果。绝不要只处理第一个文件。


步骤 1 — 按格式加载子技能
扩展名要加载的子技能
.docx / .doccapability/word-analysis/SKILL.md
.pdfcapability/pdf-analysis/SKILL.md
.pptx / .pptcapability/ppt-analysis/SKILL.md
read_file(path="<skills_root>/sn-da-non-spreadsheet-analysis/capability/<format>-analysis/SKILL.md")

只加载所需的子技能——不要一次加载全部三个。


步骤 2 — 解析和提取

遵循子技能的提取模式。对于所有格式:

  • 完整扫描:遍历所有页面/幻灯片/段落——绝不要提前停止
  • 表格提取:提取每一个表格,而不只是第一个
  • 图像/图表检测:如果页面/幻灯片未提取到文本,则将其视为基于图像的内容,并调用 caption.py

步骤 3 — 核验后作答

提取数据后,回答前进行核验:

# For count/statistics questions: spot-check 3-5 items
sample = result_list[:3]
print(f"Sample check: {sample}")
print(f"Total count: {len(result_list)}")

# For numeric calculations: print intermediate values
print(f"Max={max_val}, Min={min_val}, Range={max_val - min_val}")

# For unit-sensitive answers: always include the unit
print(f"Answer: {value} {unit}")  # e.g., "475 千港元" not just "475"

通用规则

必须执行
  • 始终遍历所有页面/幻灯片/段落——for page in doc、for slide in prs.slides、for para in doc.paragraphs
  • 输入为目录时:收集并处理所有匹配文件,然后汇总结果
  • 对于扫描版 PDF:检测文本是否为空 → 调用 caption.py 进行 OCR
  • 对于仅含图像的幻灯片:文本提取结果为空 → 将幻灯片渲染为 PNG → 调用 caption.py
  • 进行计算时:展示中间值;确认单位与问题相符
绝不可执行
  • 不要将 pytesseract 或 easyocr 用作主要 OCR 工具——它们未安装;请使用 caption.py
  • 不要使用 PIL 像素分析来推断图表数值——请改用视觉模型生成说明
  • 不要只处理第一个文件、第一页或第一个表格
  • 不要根据文件名猜测内容——始终解析实际文件
  • 问题询问绝对值时,不要输出百分比(反之亦然)

说明脚本(用于任何文档中的图像/图表内容)

当页面、幻灯片或嵌入图像需要视觉理解时,请先加载 sn-da-image-caption 技能,然后使用其 scripts/caption.py:

read_file(path="<skills_root>/sn-da-image-caption/SKILL.md")
import subprocess, json

CAPTION = "/path/to/skills/sn-da-image-caption/scripts/caption.py"

def caption_image(image_path, prompt=None):
    cmd = ["python3", CAPTION, image_path, "--json"]
    if prompt:
        cmd += ["--prompt", prompt]
    result = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
    if result.returncode != 0:
        raise RuntimeError(f"caption failed: {result.stderr[:200]}")
    return json.loads(result.stdout)["description"]

# Example prompts by content type:
# Table:  "提取表格所有内容,Markdown 表格格式,保持行列结构,数值不四舍五入。"
# Chart:  "提取图表标题、坐标轴标签、每个数据点的数值。Markdown 表格输出。"
# Diagram: "描述所有节点和连接关系。"

可用子技能

sn-da-non-spreadsheet-analysis/capability/word-analysis/SKILL.md   — .docx/.doc
sn-da-non-spreadsheet-analysis/capability/pdf-analysis/SKILL.md    — .pdf
sn-da-non-spreadsheet-analysis/capability/ppt-analysis/SKILL.md    — .pptx/.ppt

评论

支持 Markdown