|
|
@@ -1,305 +0,0 @@
|
|
|
-# 文档分类切分库 - 优化完成说明
|
|
|
-
|
|
|
-## 项目概述
|
|
|
-
|
|
|
-已成功将`pdf_classifier`和`word_classifier`两个独立项目整合为统一的`doc_classifier`库模块,并实现了全新的智能分块逻辑。
|
|
|
-
|
|
|
-## 完成的优化内容
|
|
|
-
|
|
|
-### 1. 配置文件管理 ✓
|
|
|
-
|
|
|
-**新增文件**:
|
|
|
-- `config.yaml` - 统一配置文件
|
|
|
-- `config_loader.py` - 配置加载模块
|
|
|
-- `配置说明.md` - 配置文档
|
|
|
-
|
|
|
-**配置项包括**:
|
|
|
-- LLM参数(model_url, model_name, temperature, timeout)
|
|
|
-- 文本切分参数(target_level, max_chunk_size, min_chunk_size, fuzzy_threshold)
|
|
|
-- 目录提取参数(max_pages, paragraphs_per_page)
|
|
|
-- 分类类别(mapping, descriptions)
|
|
|
-- 提示词模板(classification prompt)
|
|
|
-- 输出配置(default_dir_name, save_results, max_filename_length)
|
|
|
-- 标题模式(level1_patterns, level2_patterns, level3_patterns)
|
|
|
-- 编号格式(numbering formats)
|
|
|
-- 噪音过滤(noise patterns)
|
|
|
-- 目录检测(toc patterns, min/max length)
|
|
|
-- 日志配置(level, format, filename)
|
|
|
-
|
|
|
-**特点**:
|
|
|
-- 所有配置集中管理,易于维护
|
|
|
-- 支持配置文件和函数参数两种方式
|
|
|
-- 配置优先级:函数参数 > 配置文件 > 默认值
|
|
|
-- 单例模式,全局共享配置
|
|
|
-
|
|
|
-### 2. 统一的库模块结构 ✓
|
|
|
-
|
|
|
-**位置**: `script/doc_classifier/`
|
|
|
-
|
|
|
-**模块组成**:
|
|
|
-- `__init__.py` - 库入口,导出主要类
|
|
|
-- `core.py` - 核心处理类 DocumentClassifier
|
|
|
-- `toc_extractor.py` - 目录提取模块(支持PDF和Word)
|
|
|
-- `llm_classifier.py` - LLM分类模块
|
|
|
-- `text_splitter.py` - 文本切分模块(新的智能分块逻辑)
|
|
|
-- `result_saver.py` - 结果保存模块
|
|
|
-- `config.yaml` - 配置文件
|
|
|
-- `config_loader.py` - 配置加载模块
|
|
|
-- `main.py` - 命令行入口
|
|
|
-- `example.py` - 使用示例
|
|
|
-- `test_basic.py` - 基础测试
|
|
|
-
|
|
|
-**特点**:
|
|
|
-- 统一接口,自动识别PDF和Word格式
|
|
|
-- 可作为Python库被其他项目导入
|
|
|
-- 支持相对导入和绝对导入
|
|
|
-
|
|
|
-### 3. 新的分块逻辑 ✓
|
|
|
-
|
|
|
-**核心改进**:
|
|
|
-
|
|
|
-#### 分块流程
|
|
|
-1. **定位标题**: 在正文中定位指定层级的标题(跳过目录页)
|
|
|
-2. **子标题切分**: 在每个标题块中查找更低层级的子标题进行切分
|
|
|
-3. **大块分割**: 超过`max_chunk_size`的块按句子级分割(保持语义完整)
|
|
|
-4. **小块合并**: 不足`min_chunk_size`的块尝试合并(仅在同一父标题内合并)
|
|
|
-
|
|
|
-#### 关键特性
|
|
|
-- **局部索引**: `chunk_id`是在每个指定层级标题内部的局部分块索引(整数:1, 2, 3, ...)
|
|
|
-- **父标题追踪**: 通过`serial_number`记录当前标题在指定层级中的位置
|
|
|
-- **智能合并**: 只在同一个父标题内合并小块,合并后重新编号
|
|
|
-- **分割块保护**: 分割产生的块不参与合并,确保语义完整
|
|
|
-
|
|
|
-#### 参数控制
|
|
|
-- `max_chunk_size`: 最大分块字符数(默认1000)
|
|
|
-- `min_chunk_size`: 最小分块字符数(默认500)
|
|
|
-- `target_level`: 目标层级(默认2级)
|
|
|
-
|
|
|
-### 4. 新的数据格式 ✓
|
|
|
-
|
|
|
-**文本块数据结构**:
|
|
|
-
|
|
|
-```json
|
|
|
-{
|
|
|
- "file_name": "文档名称.pdf",
|
|
|
- "chunk_id": 1,
|
|
|
- "section_label": "第一章.工程概况->1.2 自然条件->1.2.1 位置交通",
|
|
|
- "context_summary": "自然条件",
|
|
|
- "project_plan_type": "overview",
|
|
|
- "element_tag": {
|
|
|
- "chunk_id": 1,
|
|
|
- "page": 5,
|
|
|
- "serial_number": 1
|
|
|
- },
|
|
|
- "review_chunk_content": "正文内容..."
|
|
|
-}
|
|
|
-```
|
|
|
-
|
|
|
-**字段说明**:
|
|
|
-- `chunk_id`: 在当前指定层级标题内部的局部分块索引(整数)
|
|
|
-- `serial_number`: 当前标题在指定层级中的索引(第几个指定层级的标题)
|
|
|
-- `section_label`: 完整的层级路径
|
|
|
-- `context_summary`: 上下文摘要(父标题)
|
|
|
-- `project_plan_type`: 分类代码(英文)
|
|
|
-
|
|
|
-### 5. 统一的API接口 ✓
|
|
|
-
|
|
|
-**主要接口**:
|
|
|
-
|
|
|
-```python
|
|
|
-from doc_classifier import DocumentClassifier
|
|
|
-
|
|
|
-classifier = DocumentClassifier(
|
|
|
- model_url="http://172.16.35.50:8000/v1/chat/completions"
|
|
|
-)
|
|
|
-
|
|
|
-result = classifier.process_document(
|
|
|
- file_path="document.pdf", # 支持PDF和Word
|
|
|
- target_level=2, # 目标层级
|
|
|
- max_chunk_size=1000, # 最大分块大小
|
|
|
- min_chunk_size=500, # 最小分块大小
|
|
|
- output_dir="./output", # 输出目录
|
|
|
- save_results=True # 是否保存文件
|
|
|
-)
|
|
|
-```
|
|
|
-
|
|
|
-**新增功能**:
|
|
|
-- `save_results=False`: 不保存文件,只返回数据
|
|
|
-- 命令行参数 `--no-save`: 不保存文件
|
|
|
-
|
|
|
-### 6. 完整的文档和示例 ✓
|
|
|
-
|
|
|
-**文档文件**:
|
|
|
-- `README.md` - 完整的API文档和使用说明
|
|
|
-- `快速开始.md` - 快速上手指南
|
|
|
-- `项目总览.md` - 项目架构和技术细节
|
|
|
-- `配置说明.md` - 配置文件详细说明
|
|
|
-- `example.py` - 6个使用示例
|
|
|
-- `优化完成说明.md` - 本文件
|
|
|
-
|
|
|
-**示例内容**:
|
|
|
-1. 基础使用
|
|
|
-2. 处理Word文档
|
|
|
-3. 自定义分块大小
|
|
|
-4. 不保存文件,只获取数据
|
|
|
-5. 访问文本块数据
|
|
|
-6. 批量处理
|
|
|
-
|
|
|
-## 测试结果
|
|
|
-
|
|
|
-运行 `test_basic.py` 测试结果:
|
|
|
-
|
|
|
-```
|
|
|
-✓ 通过 - 模块导入
|
|
|
-✓ 通过 - 依赖包检查
|
|
|
-✓ 通过 - 分类器初始化
|
|
|
-✓ 通过 - 目录提取器
|
|
|
-✓ 通过 - 文本切分器
|
|
|
-✓ 通过 - LLM分类器
|
|
|
-✓ 通过 - 结果保存器
|
|
|
-
|
|
|
-总计: 7/7 个测试通过
|
|
|
-```
|
|
|
-
|
|
|
-所有测试通过,库已准备就绪!
|
|
|
-
|
|
|
-## 使用方法
|
|
|
-
|
|
|
-### 方式1: 使用默认配置
|
|
|
-
|
|
|
-```python
|
|
|
-from doc_classifier import DocumentClassifier
|
|
|
-
|
|
|
-# 自动从config.yaml加载配置
|
|
|
-classifier = DocumentClassifier()
|
|
|
-
|
|
|
-# 使用配置文件中的默认参数
|
|
|
-result = classifier.process_document("document.pdf")
|
|
|
-```
|
|
|
-
|
|
|
-### 方式2: 覆盖部分配置
|
|
|
-
|
|
|
-```python
|
|
|
-from doc_classifier import DocumentClassifier
|
|
|
-
|
|
|
-# 覆盖model_url,其他使用配置文件
|
|
|
-classifier = DocumentClassifier(model_url="http://custom:8000/v1/chat/completions")
|
|
|
-
|
|
|
-# 覆盖分块参数,其他使用配置文件
|
|
|
-result = classifier.process_document(
|
|
|
- file_path="document.pdf",
|
|
|
- max_chunk_size=1500,
|
|
|
- min_chunk_size=800,
|
|
|
- save_results=False
|
|
|
-)
|
|
|
-```
|
|
|
-
|
|
|
-### 方式3: 修改配置文件
|
|
|
-
|
|
|
-直接编辑`config.yaml`:
|
|
|
-
|
|
|
-```yaml
|
|
|
-text_splitting:
|
|
|
- max_chunk_size: 1500 # 修改默认值
|
|
|
- min_chunk_size: 800
|
|
|
-```
|
|
|
-
|
|
|
-然后正常使用:
|
|
|
-
|
|
|
-```python
|
|
|
-classifier = DocumentClassifier()
|
|
|
-result = classifier.process_document("document.pdf") # 使用新的默认值
|
|
|
-```
|
|
|
-
|
|
|
-### 方式2: 命令行
|
|
|
-
|
|
|
-```bash
|
|
|
-# 处理文档并保存
|
|
|
-python main.py document.pdf
|
|
|
-
|
|
|
-# 不保存文件
|
|
|
-python main.py document.pdf --no-save
|
|
|
-
|
|
|
-# 自定义参数
|
|
|
-python main.py document.pdf -l 2 --max-size 1500 --min-size 800 -o ./output
|
|
|
-```
|
|
|
-
|
|
|
-## 与旧版本对比
|
|
|
-
|
|
|
-| 特性 | 旧版本 | 新版本 |
|
|
|
-|-----|--------|--------|
|
|
|
-| 接口统一性 | PDF和Word分离 | 统一接口 |
|
|
|
-| 分块逻辑 | 仅按标题切分 | 智能分割+合并 |
|
|
|
-| chunk_id | 全局编号 | 局部索引(整数形式) |
|
|
|
-| 数据格式 | 简单格式 | 规范化格式+serial_number |
|
|
|
-| 使用方式 | 独立脚本 | 可作为库调用 |
|
|
|
-| 保存选项 | 必须保存 | 可选保存 |
|
|
|
-| 文档完整性 | 基础文档 | 完整文档+示例 |
|
|
|
-
|
|
|
-## 核心优势
|
|
|
-
|
|
|
-1. **局部索引**: chunk_id在每个父标题内独立编号(整数形式),便于理解和管理
|
|
|
-2. **父标题追踪**: serial_number明确标识当前块属于哪个指定层级的标题
|
|
|
-3. **智能合并**: 只在同一父标题内合并,避免跨标题混淆
|
|
|
-4. **灵活使用**: 可选保存,支持纯数据处理模式
|
|
|
-5. **统一接口**: 一个接口处理所有格式
|
|
|
-
|
|
|
-## 文件结构
|
|
|
-
|
|
|
-```
|
|
|
-doc_classifier/
|
|
|
-├── __init__.py # 库入口
|
|
|
-├── core.py # 核心类
|
|
|
-├── toc_extractor.py # 目录提取
|
|
|
-├── llm_classifier.py # LLM分类
|
|
|
-├── text_splitter.py # 文本切分(新逻辑)
|
|
|
-├── result_saver.py # 结果保存
|
|
|
-├── config.yaml # 配置文件
|
|
|
-├── config_loader.py # 配置加载
|
|
|
-├── main.py # 命令行入口
|
|
|
-├── example.py # 使用示例
|
|
|
-├── test_basic.py # 基础测试
|
|
|
-├── requirements.txt # 依赖包
|
|
|
-├── README.md # 完整文档
|
|
|
-├── 快速开始.md # 快速指南
|
|
|
-├── 项目总览.md # 项目架构
|
|
|
-├── 配置说明.md # 配置文档
|
|
|
-└── 优化完成说明.md # 本文件
|
|
|
-```
|
|
|
-
|
|
|
-## 依赖包
|
|
|
-
|
|
|
-```
|
|
|
-pymupdf>=1.23.0
|
|
|
-python-docx>=0.8.11
|
|
|
-requests>=2.31.0
|
|
|
-pyyaml>=6.0
|
|
|
-```
|
|
|
-
|
|
|
-安装:
|
|
|
-```bash
|
|
|
-pip install -r requirements.txt
|
|
|
-```
|
|
|
-
|
|
|
-## 下一步建议
|
|
|
-
|
|
|
-1. **实际测试**: 使用真实的PDF/Word文档进行测试
|
|
|
-2. **性能优化**: 如需处理大量文档,可考虑并行处理
|
|
|
-3. **功能扩展**: 根据实际需求添加新的分类类别
|
|
|
-4. **错误处理**: 完善异常情况的处理逻辑
|
|
|
-
|
|
|
-## 技术支持
|
|
|
-
|
|
|
-如有问题,请查看:
|
|
|
-1. `README.md` - 完整文档
|
|
|
-2. `快速开始.md` - 快速上手
|
|
|
-3. `配置说明.md` - 配置详解
|
|
|
-4. `example.py` - 使用示例
|
|
|
-5. `test_basic.py` - 测试代码
|
|
|
-
|
|
|
----
|
|
|
-
|
|
|
-**优化完成时间**: 2025-11-13
|
|
|
-**版本**: 2.0.0
|
|
|
-**状态**: ✓ 已完成并通过测试
|
|
|
-
|