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. 03Wordやスライドからの表抽出
  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")

必要なサブスキルのみを読み込みます。3 つすべてを一度に読み込まないでください。


ステップ 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 の場合:テキストが空であることを検出したら、OCR のために caption.py を呼び出す
  • 画像のみのスライドの場合:テキスト抽出結果が空なら、スライドを PNG としてレンダリングし、caption.py を呼び出す
  • 計算の場合:途中の値を示し、単位が質問と一致していることを確認する
絶対に行わないこと
  • 主な OCR 手段として pytesseract や easyocr を使わないでください。インストールされていません。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

コメント