基于轻量语义标注的数字档案馆资源建设实操全流程
一、轻量语义标注环境搭建(15分钟)
1.1 工具选择与安装
本次使用免费开源的Tesseract OCR 5.3.3做图片文字识别+LabelStudio 2.4.3做轻量语义标注,双工具均支持Windows/macOS/Linux。
Windows安装Tesseract: 直接从GitHub镜像站下载预编译包:https://ghproxy.com/https://github.com/UB-Mannheim/tesseract/wiki/5.3.3-2023-10-14 ,选择tesseract-ocr-w64-setup-5.3.3.20231014.exe,安装时勾选「Add Tesseract-OCR to PATH」,额外勾选中文简体(chi_sim)、中文繁体(chi_tra)、通用英文(eng)语言包。
验证Tesseract安装: 打开CMD输入```tesseract --version```,返回版本号及已安装语言包即为成功。

全平台安装LabelStudio: 确保已安装Python 3.9-3.11(推荐3.10.11,稳定兼容),未安装的话从https://www.python.org/downloads/release/python-31011/ 下载对应系统包,勾选「Add Python 3.10 to PATH」。 打开终端(Windows用CMD/管理员PowerShell,macOS/Linux用Terminal)输入: ```bash pip install label-studio -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 安装完成后输入```label-studio```启动,浏览器自动打开http://localhost:8080 ,首次使用设置邮箱(可任意,比如ds@test.com)、密码(至少8位)即可。
二、轻量语义本体构建(20分钟)
本体不用太复杂,仅覆盖中小馆高频分类,本次用LabelStudio内置标签系统实现,无需写OWL代码。
2.1 创建项目与标注配置
- 登录LabelStudio点击「Create」→选择「Other」模板→点击「Create」进入项目配置页。
- 左侧「Data Manager」→点击「Import」上传测试用的档案(支持PDF、JPG、PNG、TXT,这里先传10份扫描成JPG的民国档案目录)。
- 左侧「Settings」→「Labeling Interface」→切换到「Code」模式,删除默认内容,粘贴以下可直接复制的轻量语义标注配置:
```xml
``` 点击「Save」保存配置。
2.2 配置OCR自动预填充(减少手动输入)
- 在终端按Ctrl+C停止当前LabelStudio,新建一个Python脚本文件`labelstudio_ocr.py`,粘贴以下完整代码: ```python from label_studio_ml.model import LabelStudioMLBase import pytesseract from PIL import Image import requests from io import BytesIO class OCRPreModel(LabelStudioMLBase): def __init__(self, kwargs): super().__init__(kwargs) 指定Tesseract路径(Windows非默认安装需改,macOS/Linux留空) self.tesseract_path = r'C:\Program Files\Tesseract-OCR\tesseract.exe' if self.tesseract_path: pytesseract.pytesseract.tesseract_cmd = self.tesseract_path def predict(self, tasks, kwargs): predictions = [] for task in tasks: 获取图片URL image_url = task['data']['image'] 处理本地图片(LabelStudio本地启动的资源前缀是/data/uploaded) if image_url.startswith('/data/uploaded'): image_url = f'http://localhost:8080{image_url}' 下载图片 response = requests.get(image_url, headers={'Authorization': f'Token {self.api_key}'}) img = Image.open(BytesIO(response.content)) OCR识别(中文+英文混合识别) ocr_text = pytesseract.image_to_string(img, lang='chi_sim+eng') 生成预填充结果 predictions.append({ 'result': [{ 'from_name': 'ocr_text', 'to_name': 'image', 'type': 'textarea', 'value': {'text': [ocr_text.strip()]} }], 'score': 0.99 }) return predictions if __name__ == '__main__': OCRPreModel().serve() ```
- 安装依赖库,终端输入: ```bash pip install label-studio-ml pytesseract pillow requests -i https://pypi.tuna.tsinghua.edu.cn/simple ```
- 启动OCR预模型服务(新开一个终端窗口,不要关原来的): ```bash label-studio-ml start labelstudio_ocr.py ```
- 回到原来的LabelStudio项目→左侧「Settings」→「Machine Learning」→点击「Add Model」,模型名称填「轻量OCR预填充」,URL填http://localhost:9090 ,勾选「Use for pre-annotation」,点击「Validate and Save」。
三、批量资源标注与导出(30分钟起,依数据量)
3.1 单份标注示范
- 回到项目「Data Manager」,点击任意一张图片进入标注页,左侧会自动出现OCR预填充的文字(如有识别错误直接在TextArea修改)。
- 选中预填充的文字中对应「文书档案」的部分,点击右侧「doc_type」下的「文书档案」标签完成分类。
- 依次选中「题名」「责任者」「时间」「档号」文字块,点击对应「key_info」标签完成实体提取。
- 点击右下角「Submit」提交标注,点击「Next」进入下一份。
3.2 批量智能辅助标注(提升50%效率)
- 标注完5-10份作为训练样本后,回到项目「Data Manager」→选中所有已标注样本→点击右上角「Actions」→「Export」→选择「JSON」格式导出。
- 返回终端OCR预模型服务窗口,按Ctrl+C停止,再输入以下命令重新启动带样本训练的服务: ```bash label-studio-ml start labelstudio_ocr.py --with-samples --from=./导出的JSON文件路径 ``` 注意把「导出的JSON文件路径」替换成实际的完整路径,比如Windows是`C:\Users\用户名\Downloads\project-1-at-2024-05-20-12-34-56-export.json`。
- 回到项目「Machine Learning」→点击刚才的模型名称→勾选「Retrain on annotations」,点击「Update」,等待1-2分钟训练完成后,新图片进入标注页时会有预分类和预实体标注,只需修正错误即可。
3.3 批量导出标准数据
标注完成后回到「Data Manager」→全选所有已标注数据→点击「Actions」→「Export」→选择「JSON (Min)」格式导出,导出的JSON文件包含「档号」「时间」「责任者」「题名」「分类」「原始图片路径」6个核心字段,可直接导入中小馆常用的数字档案馆系统(比如旗云、世纪科怡,导入时需对应字段映射)。
四、数据本地快速检索验证(5分钟)
验证标注数据是否可用,新建Python脚本`ds_search.py`,粘贴以下代码: ```python import json import re 替换成导出的JSON文件路径 EXPORT_PATH = r'C:\Users\用户名\Downloads\project-1-at-2024-05-20-12-34-56-export-min.json' def load_data(): with open(EXPORT_PATH, 'r', encoding='utf-8') as f: return json.load(f) def search_data(keyword, data): results = [] keyword = keyword.lower() for item in data: 从JSON中提取标注的关键信息 doc_type = next((r['value']['choices'][0] for r in item['annotations'][0]['result'] if r['from_name'] == 'doc_type'), '') ocr_text = next((r['value']['text'][0] for r in item['annotations'][0]['result'] if r['from_name'] == 'ocr_text'), '') key_entities = {} for r in item['annotations'][0]['result']: if r['from_name'] == 'key_info': label = r['value']['labels'][0] text = r['value']['text'][0] if 'text' in r['value'] else ocr_text[r['value']['start']:r['value']['end']] key_entities[label] = text 多字段模糊匹配 if (re.search(keyword, ocr_text.lower()) or re.search(keyword, doc_type.lower()) or any(re.search(keyword, v.lower()) for v in key_entities.values())): results.append({ '分类': doc_type, '关键信息': key_entities, '图片路径': item['data']['image'] }) return results if __name__ == '__main__': data = load_data() while True: keyword = input('请输入检索关键词(输入q退出):') if keyword == 'q': break results = search_data(keyword, data) print(f'找到{len(results)}条结果:') for idx, res in enumerate(results, 1): print(f'\n{idx}. 分类:{res["分类"]}') for k, v in res['关键信息'].items(): print(f' {k}:{v}') ``` 运行脚本后输入关键词即可检索,比如输入「民国」「档案号」「1949」等,能快速定位标注数据。