在信息爆炸的时代,企业、研究机构乃至个人都面临着海量文档信息的处理需求。这些文档可能以PDF、Word、Excel、PPT、纯文本甚至图像扫描件等多种格式存在。如何高效、准确地从这些异构文档中提取关键信息,并进行汇总分析,成为提升工作效率和挖掘数据价值的关键环节。传统的手工处理方式不仅耗时耗力,而且容易出错,难以应对大规模文档处理的挑战。本文将详细介绍如何利用强大的大语言模型DeepSeek及其API接口,结合Python编程语言及其丰富的生态系统,构建一套自动化、智能化的多格式文件内容提取与汇总解决方案。该方案能够处理常见办公文档格式,提取文本内容,利用大模型进行理解、摘要或关键信息抽取,最终实现信息的结构化汇总,为后续的数据分析、报告生成或知识管理奠定坚实基础。

一、引言:批量文档处理的挑战与自动化需求

日常工作中,我们经常需要处理来自不同渠道、不同格式的文档:

  • 合同与协议:PDF格式居多,包含大量条款信息。
  • 报告与论文:PDF、Word格式,包含研究结论、数据。
  • 财务报表:Excel格式,包含结构化数据。
  • 项目总结:PPT格式,包含要点摘要。
  • 客户沟通记录:邮件、聊天记录(文本文件)。
  • 历史档案:扫描图像(JPG, PNG)转成的PDF。

手动处理这些文档面临诸多困难:

  1. 效率低下:逐个打开文件、复制粘贴内容极其耗时。
  2. 格式兼容性差:不同格式需要不同的软件打开,操作繁琐。
  3. 信息提取不完整:手动提取易遗漏重要信息,尤其对于扫描件中的文字。
  4. 理解与总结困难:面对大量文本,人工提炼要点、总结主旨需要高度专注和时间。
  5. 汇总整合麻烦:将不同文档的关键信息整合到一个报告或数据库中需要大量整理工作。

因此,实现批量文档处理自动化,特别是能够跨格式提取文本内容智能理解汇总信息的系统,具有极高的实用价值。Python以其丰富的库和易用性,DeepSeek以其强大的文本理解能力,成为构建此类系统的理想组合。

二、技术基石:DeepSeek 与 Python 生态

1. DeepSeek:强大的文本理解引擎

DeepSeek 是一个先进的大语言模型(LLM)。其核心能力在于:

  • 深度语义理解:能够理解文本的上下文、含义和意图,而不仅仅是关键词匹配。
  • 文本生成:可以生成摘要、改写句子、回答问题、续写内容。
  • 信息抽取:能从大段文本中识别并提取特定类型的实体(如人名、地点、日期、金额、关键条款)或关系。
  • 多语言支持:具备良好的中文处理能力。
  • API 接口:提供编程接口(API),允许开发者通过网络请求调用其模型能力,轻松集成到Python应用中。

在本方案中,DeepSeek 的核心作用是:

  • 内容理解与摘要:对提取出的原始文本进行压缩,生成简洁的摘要。
  • 关键信息提取:根据预设模板或指令,从文本中抽取出特定的结构化数据(如合同金额、到期日、责任方)。
  • 问答式提取:通过提问的方式,让模型从文档中找出特定问题的答案。
  • 文本分类与主题识别:判断文档的主题或类别。

2. Python:自动化与数据处理的核心

Python 是数据科学和自动化领域的首选语言,拥有大量强大的库:

  • 文件操作与路径管理osshutilglobpathlib
  • PDF 处理
    • PyPDF2 / PyPDF4:读取文本(对纯文本PDF效果好)、元数据、拆分合并PDF。
    • pdfminer / pdfplumber:更强大的文本和表格提取能力。
    • PyMuPDF (fitz):功能全面,支持文本、图像、标注提取,渲染页面。
  • Word (.docx) 处理python-docx - 读取和创建Word文档内容、样式、表格。
  • Excel (.xlsx) 处理openpyxl / pandas - pandas 尤其擅长读取和处理表格数据。
  • PowerPoint (.pptx) 处理python-pptx - 读取幻灯片文本、形状、表格。
  • 图像处理与 OCR
    • Pillow (PIL):基础图像处理。
    • OpenCV:高级计算机视觉。
    • Tesseract OCR (通过 pytesseract 库):开源的OCR引擎,用于识别图像中的文字。这是处理扫描件的关键!
  • HTTP 请求与 API 调用requests - 用于调用DeepSeek等服务的API。
  • 数据结构与处理pandas - 用于存储、清洗、汇总提取出的结构化数据。
  • 配置文件与日志configparserlogging

3. 系统架构概览

整个自动化流程可以抽象为以下几个核心模块:

  1. 文件遍历与输入:识别目标文件夹,收集所有待处理文件路径。
  2. 格式识别与分发:根据文件扩展名或内容判断格式,分发到对应的处理模块。
  3. 内容提取器
    • PDF 提取器:处理纯文本PDF和图像扫描PDF(需OCR)。
    • Word 提取器:提取段落文本、表格内容。
    • Excel 提取器:读取单元格数据、表格。
    • PPT 提取器:提取幻灯片文本、备注。
    • 文本提取器:读取 .txt.csv 等。
    • OCR 引擎:集成Tesseract,处理图像或扫描PDF中的文字识别。
  4. 文本后处理器:清理提取出的原始文本(去除乱码、多余空格、页眉页脚)。
  5. DeepSeek 接口模块:将清理后的文本发送给DeepSeek API,根据需求获取摘要、提取的关键信息或问答结果。
  6. 信息汇总器:接收DeepSeek处理后的结构化信息(或原始文本/摘要),按需汇总。可能使用字典、列表、Pandas DataFrame存储。
  7. 输出模块:将汇总结果输出到文件(Excel, CSV, Word, Markdown)或数据库。
  8. 日志与错误处理:记录处理过程,捕获并处理异常(如文件损坏、API调用失败)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

graph LR

A[文件遍历] --> B[格式识别]

B --> C1[PDF 提取器]

B --> C2[Word 提取器]

B --> C3[Excel 提取器]

B --> C4[PPT 提取器]

B --> C5[文本提取器]

C1 --> D[OCR?]

D --> E[文本后处理]

C2 --> E

C3 --> E

C4 --> E

C5 --> E

E --> F[DeepSeek API]

F --> G[信息汇总]

G --> H[输出结果]

H --> I[日志/报告]

三、核心实现步骤详解

1. 环境准备

  • Python 环境:安装 Python 3.7+。
  • 安装依赖库

1

pip install requests pandas PyMuPDF python-docx openpyxl python-pptx pdfplumber pytesseract pillow opencv-python-headless tqdm

  • requests: API调用。
  • pandas: 数据处理汇总。
  • PyMuPDF (fitz): PDF处理。
  • python-docx: Word处理。
  • openpyxl: Excel处理 (或直接用 pandas 读)。
  • python-pptx: PPT处理。
  • pdfplumber: 可选,增强PDF表格提取。
  • pytesseract: Tesseract OCR的Python封装。
  • Pillow: 图像处理。
  • opencv-python-headless: 图像预处理 (可选,提升OCR精度)。
  • tqdm: 显示进度条。
  • Tesseract OCR 安装:从 https://github.com/UB-Mannheim/tesseract/wiki 下载并安装对应操作系统的 Tesseract。安装后确保其路径在系统环境变量中,或在代码中通过 pytesseract.pytesseract.tesseract_cmd 指定路径。
  • DeepSeek API 密钥:注册 DeepSeek 平台账号,获取 API Key (通常是一个长字符串)。注意保管好密钥,不要泄露!

2. 文件遍历与输入

使用 pathlib 或 glob 遍历指定文件夹及其子文件夹,收集所有目标文件。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

from pathlib import Path

import os

def find_files(root_dir, extensions=['.pdf', '.docx', '.xlsx', '.pptx', '.txt', '.jpg', '.png']):

    """

    查找指定扩展名的文件

    :param root_dir: 根目录

    :param extensions: 目标扩展名列表

    :return: 文件路径列表

    """

    file_paths = []

    for ext in extensions:

        # 使用 glob 匹配 (pathlib 的 glob 也可)

        pattern = os.path.join(root_dir, '**', f'*{ext}')

        file_paths.extend([f for f in glob.glob(pattern, recursive=True) if os.path.isfile(f)])

    return file_paths

# 或者使用 pathlib

def find_files_pathlib(root_dir, extensions):

    root_path = Path(root_dir)

    file_paths = []

    for ext in extensions:

        file_paths.extend(list(root_path.rglob(f'*{ext}')))

    return [str(p) for p in file_paths]

3. 格式识别与分发

简单的识别可以通过文件后缀名判断。更可靠的方式是检查文件魔数(magic number),但对于常见办公文档,后缀名通常足够。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

def get_file_type(file_path):

    """

    根据后缀名判断文件类型

    :param file_path: 文件路径

    :return: 文件类型字符串 ('pdf', 'docx', 'xlsx', 'pptx', 'text', 'image')

    """

    ext = Path(file_path).suffix.lower()

    if ext == '.pdf':

        return 'pdf'

    elif ext == '.docx':

        return 'docx'

    elif ext in ['.xlsx', '.xls']:  # 可能需要处理旧版 .xls

        return 'xlsx'

    elif ext == '.pptx':

        return 'pptx'

    elif ext in ['.txt', '.csv', '.md']:

        return 'text'

    elif ext in ['.jpg', '.jpeg', '.png', '.bmp', '.tiff']:

        return 'image'

    else:

        return 'unknown'  # 或抛出异常

4. 内容提取器实现

(1) PDF 文件提取器 (PyMuPDF)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import fitz  # PyMuPDF

def extract_text_from_pdf(pdf_path):

    """

    提取PDF文本内容。对于扫描件,此方法只能得到空字符串或乱码。

    :param pdf_path: PDF文件路径

    :return: 提取出的文本字符串

    """

    doc = fitz.open(pdf_path)

    full_text = ""

    for page_num in range(len(doc)):

        page = doc.load_page(page_num)

        text = page.get_text("text"# "text" 参数获取纯文本

        full_text += text + "\n"  # 添加换行分隔页面

    doc.close()

    return full_text.strip()

(2) OCR 处理 (处理扫描PDF或图像)

当 extract_text_from_pdf 返回的文本过少或无效时,或者直接处理图像文件时,需要使用OCR。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

from PIL import Image

import pytesseract

import cv2  # 可选,用于图像预处理

def ocr_image(image_path, lang='chi_sim+eng'):

    """

    使用Tesseract OCR识别图像中的文字

    :param image_path: 图像文件路径

    :param lang: 语言 (例如 'eng' 英文, 'chi_sim' 简体中文)

    :return: 识别出的文本字符串

    """

    # 预处理 (可选, 根据图像质量调整)

    img = cv2.imread(image_path)

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度化

    # thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]  # 二值化

    # ... 其他可能的预处理步骤 (降噪、纠偏等)

    # 使用PIL打开预处理后的图像 (或原始图像)

    # pil_img = Image.fromarray(thresh)

    pil_img = Image.open(image_path)

    text = pytesseract.image_to_string(pil_img, lang=lang)

    return text.strip()

# 处理扫描PDF: 需要先将PDF每一页转为图像,再OCR

def ocr_pdf(pdf_path, output_dir='temp_ocr_images', dpi=300, lang='chi_sim+eng'):

    """

    OCR识别扫描PDF

    :param pdf_path: PDF路径

    :param output_dir: 临时存放图像的目录

    :param dpi: 渲染图像的分辨率 (越高越清晰,但越慢)

    :param lang: OCR语言

    :return: 识别出的文本字符串

    """

    doc = fitz.open(pdf_path)

    Path(output_dir).mkdir(parents=True, exist_ok=True)

    full_text = ""

    for page_num in range(len(doc)):

        page = doc.load_page(page_num)

        pix = page.get_pixmap(matrix=fitz.Matrix(dpi/72, dpi/72))  # 提高DPI

        image_path = Path(output_dir) / f"page_{page_num}.png"

        pix.save(str(image_path))

        page_text = ocr_image(str(image_path), lang=lang)

        full_text += page_text + "\n\n"  # 添加空行分隔页面

        os.remove(image_path)  # 删除临时图像

    doc.close()

    return full_text.strip()

(3) Word 文件提取器 (python-docx)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

from docx import Document

def extract_text_from_docx(docx_path):

    """

    提取Word文档文本内容

    :param docx_path: .docx 文件路径

    :return: 提取出的文本字符串

    """

    doc = Document(docx_path)

    full_text = []

    for para in doc.paragraphs:

        full_text.append(para.text)

    # 提取表格文本 (可选,按行按单元格)

    for table in doc.tables:

        for row in table.rows:

            for cell in row.cells:

                full_text.append(cell.text)

    return "\n".join(full_text).strip()

(4) Excel 文件提取器 (pandas)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import pandas as pd

def extract_data_from_excel(excel_path, sheet_name=None):

    """

    提取Excel数据。这里简单返回所有工作表的数据字典。

    :param excel_path: .xlsx 文件路径

    :param sheet_name: 指定工作表名 (None表示所有)

    :return: 字典 {工作表名: pandas DataFrame}

    """

    xl = pd.ExcelFile(excel_path)

    if sheet_name:

        return {sheet_name: pd.read_excel(excel_path, sheet_name=sheet_name)}

    else:

        return {sheet: pd.read_excel(excel_path, sheet_name=sheet) for sheet in xl.sheet_names}

# 注意:提取的是结构化数据,后续可能不需要DeepSeek处理整个表,而是处理特定列的描述或汇总统计。

(5) PPT 文件提取器 (python-pptx)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

from pptx import Presentation

def extract_text_from_pptx(pptx_path):

    """

    提取PPT幻灯片文本

    :param pptx_path: .pptx 文件路径

    :return: 提取出的文本字符串

    """

    prs = Presentation(pptx_path)

    full_text = []

    for slide in prs.slides:

        # 提取幻灯片标题 (如果有)

        if slide.shapes.title:

            full_text.append(slide.shapes.title.text)

        # 提取其他形状中的文本

        for shape in slide.shapes:

            if hasattr(shape, "text") and shape != slide.shapes.title:  # 避免重复标题

                if shape.text.strip():  # 跳过空文本框

                    full_text.append(shape.text)

    return "\n".join(full_text).strip()

(6) 文本文件提取器

1

2

3

4

5

6

7

8

def extract_text_from_text_file(txt_path):

    """

    提取纯文本文件内容

    :param txt_path: 文本文件路径 (.txt, .md, .csv等)

    :return: 文件内容字符串

    """

    with open(txt_path, 'r', encoding='utf-8') as f:

        return f.read().strip()

5. 文本后处理

提取出的原始文本可能包含:

  • 多余的空格、换行符。
  • 页眉、页脚、页码(在PDF中常见)。
  • 乱码或OCR识别错误。
  • 无关的元数据。

需要根据情况进行清理:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import re

def clean_text(raw_text):

    """

    清理文本:去除多余空白、常见页眉页脚模式、特定乱码

    :param raw_text: 原始提取文本

    :return: 清理后的文本

    """

    # 合并多个空白符为一个空格

    cleaned = re.sub(r'\s+', ' ', raw_text)

    # 去除特定页眉页脚模式 (需要根据文档特点调整正则表达式)

    cleaned = re.sub(r'机密\s*第\s*\d+\s*页\s*共\s*\d+\s*页', '', cleaned)  # 示例

    # 去除常见的OCR识别错误字符 (例如孤立的符号)

    cleaned = re.sub(r'^[^\w]*$', '', cleaned, flags=re.MULTILINE)  # 删除仅包含非单词字符的行

    # 去除首尾空白

    cleaned = cleaned.strip()

    return cleaned

6. DeepSeek API 接口模块

这是将提取的文本送入大模型进行智能处理的核心环节。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

import requests

import json

import time

DEEPSEEK_API_URL = "https://api.deepseek.com/v1/chat/completions"  # 假设的API地址,请替换为真实地址

DEEPSEEK_API_KEY = "your_deepseek_api_key_here"  # 替换为你的真实API密钥

def call_deepseek_api(prompt, model="deepseek-chat", max_tokens=2048, temperature=0.7):

    """

    调用DeepSeek API进行文本生成或理解

    :param prompt: 输入的提示文本

    :param model: 使用的模型名称

    :param max_tokens: 生成的最大token数

    :param temperature: 生成多样性

    :return: API返回的响应文本 (通常是字符串)

    """

    headers = {

        "Authorization": f"Bearer {DEEPSEEK_API_KEY}",

        "Content-Type": "application/json"

    }

    data = {

        "model": model,

        "messages": [{"role": "user", "content": prompt}],

        "max_tokens": max_tokens,

        "temperature": temperature,

    }

    try:

        response = requests.post(DEEPSEEK_API_URL, headers=headers, data=json.dumps(data))

        response.raise_for_status()  # 检查HTTP错误

        response_data = response.json()

        return response_data['choices'][0]['message']['content'].strip()  # 提取模型回复内容

    except requests.exceptions.RequestException as e:

        print(f"API请求失败: {e}")

        return None

    except (KeyError, IndexError) as e:

        print(f"解析API响应失败: {e}")

        return None

如何利用 DeepSeek 处理提取的文本?

  • 生成摘要

1

2

3

cleaned_text = clean_text(extracted_text)

summary_prompt = f"请为以下文本生成一个简洁的摘要:\n\n{cleaned_text[:3000]}"  # 注意token限制,可能需要分块

summary = call_deepseek_api(summary_prompt)

  • 关键信息提取 (模板化)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

info_prompt = f"""你是一个信息抽取助手。请从以下合同文本中提取以下信息,并以JSON格式返回:

- 合同编号 (contract_id)

- 甲方名称 (party_a)

- 乙方名称 (party_b)

- 合同金额 (amount) (带单位)

- 签订日期 (sign_date) (YYYY-MM-DD格式)

- 合同有效期 (validity_period)

文本内容:

{cleaned_text}

JSON格式示例:{{"contract_id": "HT2024001", "party_a": "XX公司", ...}}

请只返回JSON,不要有其他内容。

"""

extracted_info_json = call_deepseek_api(info_prompt)

# 然后解析 JSON

  • 问答式提取

1

2

3

4

5

6

7

question = "这份合同的主要交付物是什么?"

qa_prompt = f"""基于以下文本,回答用户的问题。文本内容:

{cleaned_text}

用户问题:{question}

请直接给出答案。

"""

answer = call_deepseek_api(qa_prompt)

  • 文本分类

1

2

3

4

5

classify_prompt = f"""请判断以下文本的主题类别(选项:技术文档、财务报告、法律合同、新闻报道、其他):

{cleaned_text}

请只返回类别名称。

"""

category = call_deepseek_api(classify_prompt)

注意

  • Token 限制:DeepSeek API 对单次请求的输入和输出 token 数有限制。对于长文档,需要将文本分块处理,或者先让模型生成一个非常简短的摘要,再基于摘要提问。
  • 成本:API 调用通常按 token 收费,需注意使用量。
  • 提示工程 (Prompt Engineering):提问或指令的方式 (prompt) 对结果质量影响巨大。需要根据任务仔细设计 prompt
  • 错误处理:API 调用可能因网络、配额、内容策略等原因失败,需做好重试和异常处理。

7. 信息汇总器

接收来自不同文件、经过 DeepSeek 处理后的结果。结果可能是:

  • 摘要字符串。
  • 结构化数据(如从合同提取的JSON)。
  • 问答对。
  • 分类标签。

使用 pandas DataFrame 是汇总结构化信息的理想方式:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

import pandas as pd

# 初始化一个空的DataFrame,定义好列名

summary_df = pd.DataFrame(columns=[

    'file_path', 'file_type', 'extracted_text_summary', 'contract_id', 'party_a', 'party_b',

    'amount', 'sign_date', 'validity_period', 'qa_answer', 'category', 'processing_time'

])

# 在处理每个文件后,将结果添加到DataFrame

def add_to_summary(summary_df, file_info, deepseek_results):

    """

    将单个文件处理结果添加到汇总DataFrame

    :param summary_df: 汇总DataFrame

    :param file_info: 文件基本信息字典 (如 path, type, size, extraction_time)

    :param deepseek_results: 字典,包含DeepSeek处理后的各种结果 (summary, extracted_info, qa_answer, category)

    :return: 更新后的DataFrame

    """

    new_row = {

        'file_path': file_info['path'],

        'file_type': file_info['type'],

        'extracted_text_summary': deepseek_results.get('summary', ''),

        # 假设 extracted_info 是一个字典,包含合同字段

        'contract_id': deepseek_results.get('extracted_info', {}).get('contract_id', ''),

        'party_a': deepseek_results.get('extracted_info', {}).get('party_a', ''),

        'party_b': deepseek_results.get('extracted_info', {}).get('party_b', ''),

        'amount': deepseek_results.get('extracted_info', {}).get('amount', ''),

        'sign_date': deepseek_results.get('extracted_info', {}).get('sign_date', ''),

        'validity_period': deepseek_results.get('extracted_info', {}).get('validity_period', ''),

        'qa_answer': deepseek_results.get('qa_answer', ''),

        'category': deepseek_results.get('category', ''),

        'processing_time': file_info.get('processing_time', ''),

    }

    # 将新行转换为DataFrame并拼接

    new_df = pd.DataFrame([new_row])

    return pd.concat([summary_df, new_df], ignore_index=True)

对于非结构化的摘要或问答结果,也可以考虑存储到列表或字典中,或者直接写入一个汇总的Markdown/文本文件。

8. 输出模块

将汇总好的信息输出到用户需要的格式:

CSV/Excel (适合结构化数据):

1

2

summary_df.to_csv('document_summary.csv', index=False, encoding='utf-8-sig')

summary_df.to_excel('document_summary.xlsx', index=False, engine='openpyxl')

Word 报告 (适合包含摘要、关键点的叙述性报告):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

from docx import Document

from docx.shared import Pt

def generate_word_report(summary_df, output_path):

    doc = Document()

    doc.add_heading('批量文档处理汇总报告', level=0)

    for _, row in summary_df.iterrows():

        doc.add_heading(f"文件: {row['file_path']}", level=2)

        doc.add_paragraph(f"类型: {row['file_type']}")

        doc.add_paragraph(f"摘要:")

        doc.add_paragraph(row['extracted_text_summary'])

        if row['contract_id']:  # 如果有合同信息

            doc.add_paragraph("关键合同信息:")

            doc.add_paragraph(f"合同编号: {row['contract_id']}")

            doc.add_paragraph(f"甲方: {row['party_a']}")

            # ... 添加其他合同字段

        doc.add_paragraph("-" * 40# 分隔线

    doc.save(output_path)

Markdown 文件

1

2

3

4

5

6

7

with open('summary.md', 'w', encoding='utf-8') as md:

    md.write('# 批量文档处理汇总\n\n')

    for _, row in summary_df.iterrows():

        md.write(f"## 文件: {row['file_path']}\n")

        md.write(f"- **类型**: {row['file_type']}\n")

        md.write(f"- **摘要**: {row['extracted_text_summary']}\n\n")

        # ... 添加其他信息

  • 数据库:使用 sqlalchemy 或其他ORM库将 DataFrame 写入数据库表。

9. 日志与错误处理

良好的日志记录和错误处理是自动化脚本稳定运行的关键。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

import logging

import sys

from tqdm import tqdm  # 进度条

# 配置日志

logging.basicConfig(

    filename='document_processor.log',

    level=logging.INFO,

    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'

)

logger = logging.getLogger('DocProcessor')

def process_all_files(root_dir):

    file_paths = find_files(root_dir)

    summary_df = pd.DataFrame(...)  # 初始化空的汇总DF

    error_files = []  # 记录处理失败的文件

    for file_path in tqdm(file_paths, desc="Processing Documents"):

        try:

            start_time = time.time()

            file_type = get_file_type(file_path)

            logger.info(f"开始处理文件: {file_path} ({file_type})")

            # Step 1: 提取内容

            if file_type == 'pdf':

                raw_text = extract_text_from_pdf(file_path)

                if len(raw_text) < 100# 简单判断是否是扫描件

                    logger.warning(f"{file_path} 可能是扫描PDF,尝试OCR...")

                    raw_text = ocr_pdf(file_path)

            elif file_type == 'docx':

                raw_text = extract_text_from_docx(file_path)

            # ... 其他类型处理

            cleaned_text = clean_text(raw_text)

            logger.info(f"文本提取完成,长度: {len(cleaned_text)} 字符")

            # Step 2: DeepSeek 处理 (示例:生成摘要)

            summary_prompt = f"请为以下文本生成一个简洁的摘要:\n\n{cleaned_text[:3000]}"

            summary = call_deepseek_api(summary_prompt)

            if summary is None:

                raise Exception("DeepSeek API调用失败")

            logger.info(f"摘要生成完成")

            # Step 3: 信息汇总 (这里假设只存摘要)

            file_info = {'path': file_path, 'type': file_type}

            deepseek_results = {'summary': summary}

            summary_df = add_to_summary(summary_df, file_info, deepseek_results)

            proc_time = time.time() - start_time

            logger.info(f"文件处理成功,耗时: {proc_time:.2f}秒")

        except Exception as e:

            logger.error(f"处理文件 {file_path} 时出错: {str(e)}", exc_info=True)

            error_files.append(file_path)

    # Step 4: 输出汇总结果

    summary_df.to_excel('document_summary.xlsx', index=False)

    logger.info(f"汇总结果已输出到 document_summary.xlsx")

    # 输出错误文件列表

    if error_files:

        logger.warning(f"以下文件处理失败:")

        for ef in error_files:

            logger.warning(ef)

        with open('error_files.txt', 'w') as ferr:

            ferr.write("\n".join(error_files))

    return summary_df, error_files

四、应用场景与价值

  1. 合同管理自动化
    • 自动提取合同编号、双方、金额、期限、关键条款。
    • 生成合同摘要。
    • 识别合同风险点(通过提问或分类)。
    • 汇总所有合同信息到数据库或报表。
  2. 研究文献分析
    • 批量阅读 PDF 论文,生成摘要。
    • 提取研究方法、结论、关键数据。
    • 按主题对文献自动分类。
    • 构建文献知识库。
  3. 财务报告处理
    • 从 PDF/Word 报告中提取财务数据(结合OCR和表格识别)。
    • 总结季度/年度财务表现。
    • 识别关键财务指标变化。
  4. 客户支持工单分析
    • 分析邮件、聊天记录文本。
    • 识别客户问题类别(技术问题、账单问题、投诉)。
    • 提取客户反馈中的核心诉求。
    • 生成工单摘要供客服人员快速了解。
  5. 知识库构建
    • 将分散的企业文档(制度、流程、产品文档)内容提取汇总。
    • 利用 DeepSeek 生成知识条目摘要或问答对。
    • 便于后续搜索和问答系统构建。
  6. 尽职调查
    • 快速处理大量目标公司的公开文档(年报、公告、新闻)。
    • 提取关键信息,辅助投资决策。

价值体现

  • 效率提升:将数天乃至数周的手工工作压缩至几分钟或几小时。
  • 信息完整性:减少人工提取的遗漏和错误。
  • 深度洞察:利用大模型理解文本内涵,发现人眼可能忽略的模式或风险。
  • 成本降低:节省大量人力成本。
  • 可扩展性:轻松应对不断增长的文档量。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐