尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python工具包acdh-transkribus-utils使用指南

Python工具包acdh-transkribus-utils使用指南 1. 初识acdh-transkribus-utils工具包在数字化文本处理领域Transkribus平台已经成为手写文本识别HTR和文档分析的重要工具。而acdh-transkribus-utils这个Python包则像是为开发者准备的一把瑞士军刀它能让我们以编程方式与Transkribus平台进行高效交互。这个由奥地利科学院数字人文中心ACDH开发的工具包封装了Transkribus REST API的常用功能让开发者可以专注于业务逻辑而非底层接口细节。我第一次接触这个工具包是在处理一批历史手稿的数字化项目时。当时需要批量下载数百份文档的元数据和内容如果手动操作不仅耗时还容易出错。acdh-transkribus-utils提供的简洁API让我能够用几行代码就完成了这个繁琐任务效率提升令人惊喜。这个包目前托管在GitHub上采用MIT开源协议最新版本是2023年12月发布的v2.11。2. 环境配置与认证机制2.1 安装与基础配置安装acdh-transkribus-utils非常简单只需要使用pip命令pip install acdh-transkribus-utils但在此之前我强烈建议先创建一个专用的Python虚拟环境。这能避免与其他项目的依赖冲突python -m venv transkribus_env source transkribus_env/bin/activate # Linux/macOS transkribus_env\Scripts\activate # Windows2.2 认证方式详解与Transkribus API交互需要先通过认证。工具包提供了两种认证方式环境变量认证推荐export TRANSKRIBUS_USERyour_emailexample.com export TRANSKRIBUS_PASSWORDyour_password或者在项目根目录创建.env文件TRANSKRIBUS_USERyour_emailexample.com TRANSKRIBUS_PASSWORDyour_password代码直接认证from transkribus_utils.transkribus_utils import ACDHTranskribusUtils client ACDHTranskribusUtils( useryour_emailexample.com, passwordyour_password )重要提示在实际项目中永远不要将凭证硬编码在代码中我建议使用python-dotenv包来管理环境变量并将.env文件加入.gitignore。3. 核心功能解析与实战应用3.1 集合(Collection)操作集合是Transkribus中组织文档的基本单位。通过list_collections()方法可以获取用户有权访问的所有集合collections client.list_collections() for col in collections[:5]: # 只打印前5个集合 print(fID: {col[colId]}, 名称: {col[colName]})典型输出示例ID: 188933, 名称: bv-play ID: 188991, 名称: Kasten_blau_45_11 ID: 190357, 名称: acdh-transkribus-utils ID: 193145, 名称: palm ID: 195363, 名称: Österreichische Bundesverfassung: Datenset A在实际项目中我经常需要根据集合名称过滤特定集合。这里分享一个实用技巧target_collections [ col for col in collections if Bundesverfassung in col[colName] ]3.2 文档(Document)管理获取集合中的文档列表是常见操作。以下代码展示了如何获取指定集合中的文档col_id 142911 documents client.list_docs(col_id) # 打印文档基本信息 for doc in documents[-3:]: # 只打印最后3个文档 print(f 文档ID: {doc[docId]} 标题: {doc[title]} 作者: {doc[author]} 页数: {doc[nrOfPages]} )输出示例文档ID: 950920 标题: Kasten_blau_44_9_0050 作者: Pfalz-Neuburg, Eleonore Magdalena Theresia von 页数: 1 文档ID: 950921 标题: Kasten_blau_44_9_0037 作者: Pfalz, Johann Wilhelm Joseph Janaz von der 页数: 43.3 METS文件下载实战METS(Metadata Encoding and Transmission Standard)是数字图书馆常用的元数据标准。acdh-transkribus-utils提供了便捷的METS下载功能COL_ID 51052 # 基本下载保存到默认位置 client.collection_to_mets(COL_ID) # 自定义保存路径 client.collection_to_mets(COL_ID, file_path./custom_folder) # 选择性下载特定文档 client.collection_to_mets( COL_ID, filter_by_doc_ids[230161, 230155] )在实际项目中我遇到了几个值得注意的问题大集合下载可能耗时较长建议添加进度提示网络不稳定时可能中断需要实现断点续传文档数量多时会占用大量磁盘空间这是我的增强版下载代码import os from tqdm import tqdm # 进度条库 def safe_download_mets(col_id, doc_idsNone, output_dir./mets): os.makedirs(output_dir, exist_okTrue) existing_files set(os.listdir(output_dir)) client ACDHTranskribusUtils() docs client.list_docs(col_id) if doc_ids: docs [doc for doc in docs if doc[docId] in doc_ids] for doc in tqdm(docs, desc下载进度): mets_file f{doc[docId]}.xml if mets_file not in existing_files: try: client.collection_to_mets( col_id, file_pathoutput_dir, filter_by_doc_ids[doc[docId]] ) except Exception as e: print(f下载失败 {doc[docId]}: {str(e)})4. 高级应用与性能优化4.1 批量处理与并发控制当需要处理大量文档时顺序执行效率低下。我们可以使用Python的concurrent.futures模块实现并行处理from concurrent.futures import ThreadPoolExecutor def process_document(doc_id): # 这里放置文档处理逻辑 pass with ThreadPoolExecutor(max_workers4) as executor: doc_ids [doc[docId] for doc in documents] executor.map(process_document, doc_ids)注意Transkribus API可能有请求频率限制过度并发可能导致IP被封。建议开始时设置较低的max_workers(如2-4)添加适当的延迟(time.sleep)捕获并处理429 Too Many Requests错误4.2 元数据增强处理获取基础元数据后我们通常需要进一步处理和增强。例如将文档信息转换为结构化DataFrameimport pandas as pd def get_collection_metadata(col_id): docs client.list_docs(col_id) df pd.DataFrame(docs) # 添加处理日期列 df[process_date] pd.Timestamp.now() # 提取可能的年份信息 df[year] df[title].str.extract(r(\d{4})) return df metadata_df get_collection_metadata(142911) metadata_df.to_csv(collection_metadata.csv, indexFalse)4.3 错误处理与重试机制网络请求难免会遇到临时故障。实现健壮的重试机制很重要import time from requests.exceptions import RequestException def robust_request(func, max_retries3, delay5): for attempt in range(max_retries): try: return func() except RequestException as e: if attempt max_retries - 1: raise print(f请求失败{delay}秒后重试... (尝试 {attempt 1}/{max_retries})) time.sleep(delay) # 使用示例 collections robust_request(lambda: client.list_collections())5. 实际项目案例分享5.1 历史档案数字化项目在一个18世纪欧洲贵族信件的数字化项目中我们需要从Transkribus获取所有信件元数据下载METS文件提取文本内容和标注信息构建时间线分析关键实现代码def process_historical_letters(col_id): # 获取集合信息 client ACDHTranskribusUtils() letters client.list_docs(col_id) # 下载METS文件 client.collection_to_mets(col_id, file_path./letters) # 解析METS并提取内容 results [] for letter in letters: mets_path f./letters/{col_id}/{letter[docId]}.xml content parse_mets(mets_path) # 自定义解析函数 results.append({ id: letter[docId], title: letter[title], date: extract_date(content), text: extract_text(content), persons: extract_entities(content, person) }) return pd.DataFrame(results)5.2 学术文献批量分析在研究项目中我们需要分析多个文献集合中的术语分布def analyze_terminology(col_ids, keywords): terminology_data [] for col_id in col_ids: docs client.list_docs(col_id) for doc in docs: mets_path f./mets/{col_id}/{doc[docId]}.xml text extract_text_from_mets(mets_path) counts {kw: text.lower().count(kw.lower()) for kw in keywords} terminology_data.append({ doc_id: doc[docId], title: doc[title], **counts }) return pd.DataFrame(terminology_data)5.3 质量监控系统为确保数字化质量我们建立了自动化的质量检查系统def quality_check(col_id): issues [] docs client.list_docs(col_id) for doc in docs: if not doc[nrOfPages]: issues.append(f文档{doc[docId]}缺少页数信息) mets_path f./mets/{col_id}/{doc[docId]}.xml if not os.path.exists(mets_path): issues.append(f文档{doc[docId]}METS文件缺失) else: with open(mets_path) as f: if error in f.read(): issues.append(f文档{doc[docId]}包含错误标记) return issues6. 常见问题与解决方案在实际使用acdh-transkribus-utils的过程中我积累了一些常见问题的解决方法认证失败问题现象收到401 Unauthorized错误可能原因凭证错误环境变量未正确加载账户被锁定解决方案确认凭证正确性重启Python环境确保环境变量加载检查Transkribus账户状态请求超时问题现象长时间无响应或超时错误解决方案增加超时设置client ACDHTranskribusUtils(timeout30)实现重试机制如前文所示检查网络连接特别是代理设置大集合内存问题现象处理大集合时内存不足解决方案使用分页处理采用生成器而非列表增加交换空间METS解析问题现象无法正确解析METS文件解决方案验证METS文件完整性使用lxml而非标准xml解析器检查命名空间声明7. 扩展应用与集成思路acdh-transkribus-utils可以与其他工具链集成构建更强大的工作流与数字化工作流集成graph LR A[扫描图像] -- B[Transkribus处理] B -- C[通过acdh-transkribus-utils获取结果] C -- D[TEI XML转换] D -- E[数字仓库存储]与NLP工具链结合from transformers import pipeline ner pipeline(ner, modeldbmdz/bert-large-cased-finetuned-conll03-english) def analyze_entities(col_id): docs client.list_docs(col_id) entities [] for doc in docs: text get_document_text(doc[docId]) doc_entities ner(text) entities.append({ doc_id: doc[docId], entities: doc_entities }) return entities可视化展示集成import matplotlib.pyplot as plt def plot_document_timeline(col_id): df get_collection_metadata(col_id) df[year] pd.to_numeric(df[year], errorscoerce) df df.dropna(subset[year]) plt.figure(figsize(10, 6)) df[year].hist(bins30) plt.title(文档年代分布) plt.xlabel(年份) plt.ylabel(文档数量) plt.savefig(timeline.png)
返回列表