在开始构建数字档案馆的智能分类模块之前,必须先配置好Python开发环境。本指南基于Python 3.9版本,所有依赖库均通过pip直接安装。请打开终端或命令提示符,依次执行以下命令:
1. 安装核心依赖库
我们需要安装OCR引擎(用于识别扫描件文字)、机器学习库(用于分类)以及图像处理库。执行命令:
```bash pip install pytesseract pillow scikit-learn pandas numpy opencv-python joblib ```2. 安装Tesseract-OCR引擎
Python的pytesseract库只是调用接口,真正的OCR引擎需要单独安装系统级程序。
机器学习模型需要训练数据。在数字档案馆场景下,我们需要模拟两类典型的档案数据:人事档案和财务凭证。为了方便实操,我们直接生成包含文本特征的CSV文件,而不是依赖外部数据库。
创建一个名为 generate_data.py 的文件,并写入以下代码:
```python import pandas as pd import os 模拟档案数据:包含文本内容和对应的分类标签 data = { 'content': [ 人事档案样本特征词 "员工入职登记表 身份证复印件 学历证明 劳动合同", "年度绩效考核表 薪资调整申请 晋升审批记录", "离职申请单 工作交接清单 社保转移证明", "考勤异常记录 请假条 加班申请汇总", "新员工培训计划 岗位职责说明书 试用期考核", 财务凭证样本特征词 "增值税专用发票 进项税额抵扣 销货清单", "银行转账回单 付款申请单 费用报销单", "资产负债表 利润表 现金流量表", "固定资产采购申请 验收单 领用记录", "记账凭证 会计分录 科目汇总表" ], 'category': [ '人事档案', '人事档案', '人事档案', '人事档案', '人事档案', '财务凭证', '财务凭证', '财务凭证', '财务凭证', '财务凭证' ] } df = pd.DataFrame(data) 保存为CSV文件 df.to_csv('archive_samples.csv', index=False, encoding='utf-8-sig') print("训练数据已生成至 archive_samples.csv") ```运行该脚本生成数据:
```bash python generate_data.py ```数字档案馆中大量文件是扫描件或图片(JPG/PNG)。直接对图片进行分类难度极大,因此必须先通过OCR提取文字。为了保证识别率,我们需要加入图像预处理步骤(去噪、二值化)。

创建 ocr_module.py,写入以下代码:
```python import cv2 import pytesseract import os 如果是Windows系统,请取消下面这行的注释,并修改为你的实际安装路径 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def preprocess_image(image_path): """ 图像预处理:灰度化 -> 二值化 -> 去噪 """ 读取图片 image = cv2.imread(image_path) if image is None: raise FileNotFoundError(f"无法读取图片: {image_path}") 转为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 二值化处理 (OTSU自动寻找阈值) _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) 降噪处理 (中值滤波) denoised = cv2.medianBlur(binary, 3) return denoised def extract_text_from_image(image_path): """ 使用Tesseract提取图片中的中文和英文 """ try: processed_img = preprocess_image(image_path) lang='chi_sim+eng' 表示同时识别简体中文和英文 text = pytesseract.image_to_string(processed_img, lang='chi_sim+eng') return text.strip() except Exception as e: print(f"OCR识别出错: {e}") return "" 测试代码 (如果有测试图片可取消注释) if __name__ == "__main__": 请确保当前目录下有一张名为 test.jpg 的图片 if os.path.exists("test.jpg"): result = extract_text_from_image("test.jpg") print("识别内容:", result) else: print("请放入 test.jpg 进行测试") ```有了OCR提取的文字内容后,我们需要训练一个分类器来自动判断该文件属于“人事档案”还是“财务凭证”。这里使用TF-IDF算法将文本转换为向量,并使用朴素贝叶斯算法进行分类。
创建 train_model.py,写入以下代码:
```python import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import Pipeline from sklearn.model_selection import train_test_split import joblib 1. 加载数据 try: df = pd.read_csv('archive_samples.csv', encoding='utf-8-sig') except FileNotFoundError: print("请先运行 generate_data.py 生成数据文件") exit() 2. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( df['content'], df['category'], test_size=0.2, random_state=42 ) 3. 构建Pipeline TF-IDF: 将文本转换为词频矩阵 MultinomialNB: 朴素贝叶斯分类器,适合文本分类 text_clf = Pipeline([ ('tfidf', TfidfVectorizer(stop_words=None)), 这里可以加载中文停用词表优化效果 ('clf', MultinomialNB()), ]) 4. 训练模型 print("开始训练模型...") text_clf.fit(X_train, y_train) 5. 评估模型 accuracy = text_clf.score(X_test, y_test) print(f"模型训练完成,测试集准确率: {accuracy 100:.2f}%") 6. 保存模型到本地 model_filename = 'archive_classifier_model.joblib' joblib.dump(text_clf, model_filename) print(f"模型已保存为 {model_filename}") ```执行训练命令:
```bash python train_model.py ```我们将OCR模块和训练好的模型串联起来,形成一个完整的业务流:输入图片 -> 识别文字 -> 模型预测 -> 移动到对应文件夹。
创建主程序 auto_archive.py,写入以下代码:
```python import os import shutil import joblib from ocr_module import extract_text_from_image 配置参数 MODEL_FILE = 'archive_classifier_model.joblib' UPLOAD_DIR = 'input_files' 待处理的图片放入此文件夹 OUTPUT_DIR = 'archive_system' 归档后的文件存放根目录 def ensure_dir(directory): if not os.path.exists(directory): os.makedirs(directory) def main(): 1. 加载模型 if not os.path.exists(MODEL_FILE): print(f"错误:找不到模型文件 {MODEL_FILE},请先运行训练脚本。") return print("正在加载模型...") model = joblib.load(MODEL_FILE) 2. 检查输入目录 ensure_dir(UPLOAD_DIR) files = [f for f in os.listdir(UPLOAD_DIR) if f.lower().endswith(('.png', '.jpg', '.jpeg'))] if not files: print(f"目录 {UPLOAD_DIR} 中没有待处理的图片文件。") return print(f"发现 {len(files)} 个待处理文件,开始自动归档...") for filename in files: file_path = os.path.join(UPLOAD_DIR, filename) try: 第一步:OCR识别 print(f"正在识别文件: {filename}...") text_content = extract_text_from_image(file_path) if not text_content: print(f"警告: {filename} 未能识别出文字,跳过处理。") continue 第二步:模型预测 prediction = model.predict([text_content[0:200]])[0] 只取前200字预测,通常足够 print(f"识别内容摘要: {text_content[:30]}... -> 预测类别: {prediction}") 第三步:文件归档 target_folder = os.path.join(OUTPUT_DIR, prediction) ensure_dir(target_folder) target_path = os.path.join(target_folder, filename) shutil.move(file_path, target_path) print(f"成功: 文件已移动至 {target_path}") except Exception as e: print(f"处理文件 {filename} 时发生错误: {e}") if __name__ == "__main__": main() ```为了验证系统是否可用,请按照以下步骤操作:
预期结果:
程序运行后,控制台会显示识别过程。程序结束后,input_files 文件夹将被清空,项目根目录下会生成 archive_system 文件夹,内部包含 财务凭证 和 人事档案 两个子文件夹,刚才上传的图片已经被自动分类移动到对应的文件夹中。