技术方案选型与核心逻辑
在人事档案数字化过程中,最棘手的问题往往是扫描件混杂在一起。面对成千上万份包含简历、劳动合同、身份证复印件、学历证书等不同类型的图片文件,人工分类不仅效率低,而且极易出错。为了解决这个问题,我们将采用OCR(光学字符识别)+ 关键词规则匹配的技术方案。
该方案的核心逻辑是:利用Python调用Tesseract OCR引擎识别图片中的文字内容,通过预设的关键词库(如“劳动合同”对应合同类,“身份证号”对应身份类)进行文本匹配,最后利用脚本自动将文件移动到对应的分类文件夹中。这种方法无需昂贵的商业软件,零成本、高准确率,且支持后续扩展。
第一步:环境搭建与依赖安装
在开始编写代码之前,必须先配置好运行环境。本指南基于Windows 10/11系统进行演示,macOS或Linux用户操作类似,但路径配置需调整。
1. 安装Python环境
确保系统已安装Python 3.8或更高版本。如果未安装,请前往Python官网下载安装包。安装时,务必勾选“Add Python to PATH”选项,这将避免后续配置环境变量的麻烦。
2. 安装Tesseract OCR引擎
Tesseract是OCR识别的核心引擎。请直接访问UB Mannheim的Tesseract下载页面(https://github.com/UB-Mannheim/tesseract/wiki),选择最新的Windows 64-bit安装包进行下载。
安装过程中,路径建议保持默认(通常为C:\Program Files\Tesseract-OCR)。安装完成后,必须将Tesseract的安装路径添加到系统环境变量Path中:
- 右键“此电脑” -> 属性 -> 高级系统设置 -> 环境变量。
- 在“系统变量”中找到“Path”,点击编辑。
- 点击新建,输入
C:\Program Files\Tesseract-OCR,然后一路点击确定保存。
验证安装:打开CMD命令行,输入tesseract --version,如果显示版本号,说明安装成功。
3. 安装Python依赖库
打开CMD命令行,依次执行以下命令安装所需的第三方库:
```bash
pip install pytesseract opencv-python pillow shutil
```
- pytesseract:Python的Tesseract封装库。
- opencv-python:用于图像预处理,提高识别率。
- pillow:用于图像文件的基本操作。
第二步:建立项目目录与规则配置
为了保持项目结构清晰,请在D盘或任意工作目录下创建一个名为ArchiveAutoSort的文件夹。在该文件夹内,创建以下目录结构:
input/:存放待分类的杂乱图片文件(jpg, png等)。
output/:程序运行后,分类好的文件将自动存入此处的子文件夹中。
sort_script.py:我们的核心自动化脚本。

接下来,我们需要定义分类规则。在编写代码前,先明确人事档案的常见分类及对应的关键词。这是识别准确率的关键。我们将采用字典结构来定义这些规则,代码中会直接体现。
第三步:编写核心自动化脚本
打开sort_script.py文件,将以下代码完全复制进去。这段代码包含了图像预处理、OCR识别、关键词匹配以及文件移动的完整逻辑。
```python
import os
import shutil
import cv2
import pytesseract
from PIL import Image
如果环境变量配置有问题,可以显式指定tesseract.exe的路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
定义分类规则:键为目标文件夹名,值为该类别的关键词列表
CLASSIFICATION_RULES = {
"01_劳动合同": ["劳动合同", "甲方", "乙方", "期限", "终止"],
"02_身份证明": ["身份证", "公民身份号码", "住址", "签发机关"],
"03_学历学位": ["毕业证书", "学位证书", "学校", "专业", "学号"],
"04_履历简历": ["个人简历", "教育经历", "工作经历", "技能特长"],
"05_考核考评": ["考核表", "年度考核", "考评结果", "绩效"],
"06_其他档案": [] 默认分类
}
def preprocess_image(image_path):
"""
图像预处理:转灰度、去噪,提高OCR识别率
"""
读取图像
img = cv2.imread(image_path)
转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
二值化处理,使用OTSU自动寻找阈值
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return thresh
def recognize_text(image_path):
"""
使用Tesseract识别图片中的文字
"""
try:
预处理图像
processed_img = preprocess_image(image_path)
配置Tesseract参数:psm 6 表示假设图像为统一的文本块
custom_config = r'--oem 3 --psm 6 -l chi_sim+eng'
识别文字
text = pytesseract.image_to_string(processed_img, config=custom_config)
return text
except Exception as e:
print(f"识别文件 {image_path} 失败: {e}")
return ""
def classify_file(text_content):
"""
根据识别出的文字内容匹配分类规则
"""
for category, keywords in CLASSIFICATION_RULES.items():
跳过默认分类
if category == "06_其他档案":
continue
检查是否包含该类别的任意关键词
for keyword in keywords:
if keyword in text_content:
return category
如果没有匹配到任何规则,归入“其他”
return "06_其他档案"
def main():
定义输入输出路径
base_dir = os.path.dirname(os.path.abspath(__file__))
input_dir = os.path.join(base_dir, 'input')
output_dir = os.path.join(base_dir, 'output')
确保输出目录存在
if not os.path.exists(output_dir):
os.makedirs(output_dir)
初始化输出子文件夹
for category in CLASSIFICATION_RULES.keys():
category_path = os.path.join(output_dir, category)
if not os.path.exists(category_path):
os.makedirs(category_path)
print(f"开始处理,输入目录:{input_dir}")
遍历输入目录下的所有文件
files = [f for f in os.listdir(input_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff'))]
if not files:
print("input文件夹为空或没有图片文件,请检查。")
return
for filename in files:
file_path = os.path.join(input_dir, filename)
print(f"正在处理: {filename} ...")
1. OCR识别
text = recognize_text(file_path)
2. 分类匹配
target_category = classify_file(text)
3. 移动文件
dest_path = os.path.join(output_dir, target_category, filename)
shutil.move(file_path, dest_path)
print(f"--> 归类至: {target_category}")
print("所有文件处理完成!")
if __name__ == "__main__":
main()
```
第四步:代码关键逻辑解析
为了确保大家能够理解并根据实际需求修改代码,以下对关键模块进行详细解析。
1. 图像预处理(preprocess_image函数)
直接对扫描件进行OCR识别,准确率往往较低。代码中使用了OpenCV进行灰度化和二值化处理。cv2.threshold配合cv2.THRESH_OTSU能够自动计算最佳阈值,将图片转换为纯黑白,去除背景噪点,这对识别印章覆盖文字或扫描有污渍的档案至关重要。
2. 中文识别配置(custom_config)
在recognize_text函数中,config=custom_config这一行非常关键。-l chi_sim+eng告诉Tesseract我们要识别的是“简体中文”和“英文”。人事档案中通常包含数字和英文,必须加载英文语言包,否则数字识别会出错。--psm 6参数表示将图像视为一行统一的文本块,这适合一般的A4扫描件排版。
3. 关键词匹配策略(classify_file函数)
分类逻辑采用了“优先匹配”原则。代码会遍历CLASSIFICATION_RULES字典,一旦在OCR结果中发现匹配的关键词,立即返回该分类。这意味着关键词的定义不能冲突。例如,如果“身份证”和“身份证复印件”分别属于不同类别,需要将长关键词放在前面,或者通过更精确的上下文判断。在当前示例中,我们采用了互斥的关键词组,足以应对大多数场景。
第五步:执行与结果验证
环境配置完成且脚本保存后,即可进行实操验证。
- 准备测试数据:找几张不同类型的图片,例如一张劳动合同扫描件、一张毕业证扫描件,将它们放入
input文件夹中。
- 运行脚本:在
ArchiveAutoSort目录下打开CMD窗口,输入以下命令运行脚本:
python sort_script.py
- 观察控制台输出:屏幕会逐行打印处理进度,显示正在识别的文件名以及最终归类的目录。
例如:
正在处理: contract_001.jpg ...
--> 归类至: 01_劳动合同
- 检查结果:打开
output文件夹,你会会发现里面已经自动创建了01_劳动合同、03_学历学位等子文件夹,且刚才的图片已经准确地移动到了对应的文件夹中。
常见问题排查
如果运行过程中提示FileNotFoundError或tesseract is not installed,请检查代码中pytesseract.pytesseract.tesseract_cmd这一行是否被注释掉。如果环境变量配置未生效,请取消该行注释,并确保路径指向你电脑上实际的tesseract.exe位置。
通过以上步骤,你已经构建了一套完整的人事档案自动分类系统。针对大量档案,只需批量放入input文件夹,即可实现秒级自动归档,极大提升了数字化工作的效率。