一、环境搭建与依赖安装
本指南将构建一个基于Python的智能档案处理工具,核心功能包括OCR文字识别、批量处理以及基于NLP的自动关键词提取。所有操作均在本地完成,无需调用外部付费API。
确保你的系统中已经安装了Python 3.8或更高版本。打开终端(Windows下为CMD或PowerShell,Mac/Linux下为Terminal),输入以下命令检查版本:
```bash
python --version
```
如果未安装或版本过低,请前往Python官网下载安装包。环境准备就绪后,我们需要创建一个独立的虚拟环境来隔离项目依赖,避免冲突。执行以下命令:
```bash
创建名为archive_ai的虚拟环境
python -m venv archive_ai
激活虚拟环境
Windows:
archive_ai\Scripts\activate
Mac/Linux:
source archive_ai/bin/activate
```
接下来,安装核心依赖库。我们将使用百度开源的PaddleOCR进行文字识别,它对中文支持极佳且免费;使用jieba进行中文分词和关键词提取。请严格按顺序执行以下安装命令:
```bash
安装PaddlePaddle深度学习框架(CPU版本,适合零门槛运行)
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
安装PaddleOCR模型库
pip install "paddleocr>=2.0.1"
安装图像处理库和中文分词库
pip install pillow jieba
```
二、单张档案图片OCR识别实现
在项目目录下新建一个名为ocr_tool.py的文件。我们将先编写代码实现单张图片的文字提取功能。PaddleOCR的使用非常标准化,初始化模型后,直接传入图片路径即可。
以下是完整的单图识别代码,包含详细的中文注释解释每一行参数的作用:
```python
from paddleocr import PaddleOCR
import os
初始化OCR模型
use_angle_cls=True: 启用文字方向分类,自动旋转倒置的图片
lang="ch": 指定语种为中文(中英文混合模型)
ocr = PaddleOCR(use_angle_cls=True, lang="ch", show_log=False)
def process_single_image(image_path):
检查文件是否存在
if not os.path.exists(image_path):
print(f"错误:找不到文件 {image_path}")
return
print(f"正在识别:{image_path} ...")
执行识别
result是一个列表,每个元素代表一个检测到的文本块
result = ocr.ocr(image_path, cls=True)
提取并合并所有识别到的文本
full_text = []
if result and result[0]:
for line in result[0]:
line的结构: [[坐标], (文本内容, 置信度)]
text_content = line[1][0]
confidence = line[1][1]
可以根据置信度过滤低质量文字,例如只保留置信度>0.5的
if confidence > 0.5:
full_text.append(text_content)
将列表拼接为完整字符串
content_str = "\n".join(full_text)
print("-" 30)
print("识别结果:")
print(content_str)
print("-" 30)
return content_str
测试代码:请将下方路径替换为你本地的一张图片路径
process_single_image("test.jpg")
```

保存上述代码。为了测试,你需要找一张包含文字的jpg或png图片放在同级目录,命名为test.jpg,取消代码最后一行的注释并运行:
```bash
python ocr_tool.py
```
三、批量处理档案与结构化存储
实际档案管理中,文件数量巨大。我们需要遍历文件夹,将所有扫描件识别并保存为JSON格式的元数据,方便后续存入数据库。在ocr_tool.py中追加以下代码:
```python
import json
import glob
from datetime import datetime
def batch_process_folder(input_folder, output_json):
支持的图片格式
valid_extensions = ['.jpg', '.png', '.jpeg', '.bmp']
image_files = []
收集所有图片文件
for ext in valid_extensions:
递归查找文件夹下所有符合后缀的文件
image_files.extend(glob.glob(os.path.join(input_folder, '', ext), recursive=True))
if not image_files:
print(f"在文件夹 {input_folder} 中未找到图片文件。")
return
data_store = []
for img_path in image_files:
调用之前定义的单图识别函数
content = process_single_image(img_path)
if content:
构建结构化数据对象
record = {
"file_name": os.path.basename(img_path),
"file_path": img_path,
"scan_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"raw_content": content,
"status": "success"
}
data_store.append(record)
将结果写入JSON文件
try:
with open(output_json, 'w', encoding='utf-8') as f:
json.dump(data_store, f, ensure_ascii=False, indent=4)
print(f"\n处理完成!数据已保存至 {output_json}")
except Exception as e:
print(f"保存JSON文件失败: {e}")
测试批量处理
请确保当前目录下有一个名为 'archives' 的文件夹,里面放有图片
batch_process_folder("archives", "archive_data.json")
```
四、引入NLP实现智能标签提取
仅有文字是不够的,档案软件需要自动分类。我们将使用jieba.analyse.extract_tags自动从识别出的文本中提取关键词,作为档案的标签。这属于NLP(自然语言处理)的基础应用。
继续在文件中追加以下函数,用于增强我们的数据结构:
```python
import jieba.analyse
def add_smart_tags(data_store, top_k=5):
jieba默认TF-IDF算法,这里不做额外训练,直接使用通用语料库
对于垂直领域(如医疗、法律),建议加载自定义词典
for record in data_store:
text = record.get("raw_content", "")
if text:
提取权重最高的top_k个关键词
keywords = jieba.analyse.extract_tags(text, topK=top_k, withWeight=True)
格式化标签列表
tag_list = [item[0] for item in keywords]
record["tags"] = tag_list
print(f"文件: {record['file_name']} -> 自动标签: {tag_list}")
return data_store
修改 batch_process_folder 函数,在保存JSON前调用此函数
...
data_store = add_smart_tags(data_store)
...
```
五、完整整合代码与运行指南
将上述所有片段整合,最终的ocr_tool.py完整结构如下。请直接复制覆盖原文件内容:
```python
import os
import json
import glob
from datetime import datetime
from paddleocr import PaddleOCR
import jieba.analyse
1. 初始化模型
print("正在加载AI模型,首次运行会自动下载模型文件(约几十MB),请稍候...")
ocr = PaddleOCR(use_angle_cls=True, lang="ch", show_log=False)
def process_single_image(image_path):
if not os.path.exists(image_path):
return ""
try:
result = ocr.ocr(image_path, cls=True)
full_text = []
if result and result[0]:
for line in result[0]:
text_content = line[1][0]
confidence = line[1][1]
if confidence > 0.5:
full_text.append(text_content)
return "\n".join(full_text)
except Exception as e:
print(f"识别 {image_path} 出错: {e}")
return ""
def add_smart_tags(data_store, top_k=5):
for record in data_store:
text = record.get("raw_content", "")
if text:
keywords = jieba.analyse.extract_tags(text, topK=top_k)
record["tags"] = keywords
return data_store
def batch_process_folder(input_folder, output_json):
valid_extensions = ['.jpg', '.png', '.jpeg', '.bmp']
image_files = []
for ext in valid_extensions:
image_files.extend(glob.glob(os.path.join(input_folder, '', ext), recursive=True))
if not image_files:
print("未找到图片文件。")
return
data_store = []
for img_path in image_files:
print(f"正在处理: {os.path.basename(img_path)}")
content = process_single_image(img_path)
if content:
record = {
"file_name": os.path.basename(img_path),
"file_path": img_path,
"scan_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"raw_content": content,
"tags": [] 占位
}
data_store.append(record)
2. AI标签提取
print("正在进行NLP智能标签提取...")
data_store = add_smart_tags(data_store)
3. 保存结果
with open(output_json, 'w', encoding='utf-8') as f:
json.dump(data_store, f, ensure_ascii=False, indent=4)
print(f"成功!共处理 {len(data_store)} 个文件,结果已保存至 {output_json}")
if __name__ == "__main__":
=== 配置区域 ===
在此处修改你的输入文件夹路径和输出文件名
INPUT_DIR = "./archives"
OUTPUT_FILE = "./archive_result.json"
==============
如果输入文件夹不存在,自动创建一个用于测试
if not os.path.exists(INPUT_DIR):
os.makedirs(INPUT_DIR)
print(f"提示:已自动创建输入文件夹 '{INPUT_DIR}',请放入图片后重新运行。")
else:
batch_process_folder(INPUT_DIR, OUTPUT_FILE)
```
运行步骤
- 准备数据:在当前项目目录下创建一个名为
archives的文件夹。
- 放入档案:将需要识别的档案扫描件(图片格式)复制到
archives文件夹中。
- 执行程序:在终端运行命令
python ocr_tool.py。
- 查看结果:程序运行结束后,会在目录下生成
archive_result.json。打开该文件,你将看到每张图片的识别文本以及AI自动生成的标签。
常见问题处理
如果在运行过程中遇到ModuleNotFoundError: No module named 'shapely'等错误,这是因为某些依赖库未完全安装。请执行以下命令补全依赖:
```bash
pip install shapely scikit-image
```