提高 PDF 批量处理的准确性
在当今数字化时代,处理大量 PDF 文档并确保其内容提取的准确性是许多企业面临的挑战。本文将详细介绍如何利用 AWS 的相关服务,提高 PDF 批量处理的准确性,具体步骤如下:
解决方案搭建准备
在开始构建解决方案之前,需要完成一些准备工作:
1.
创建 Amazon SageMaker Jupyter 笔记本
:如果之前未创建,请按照相关说明创建。在创建时,接受 IAM 角色的默认设置,以允许访问任何 S3 存储桶。
2.
设置 IAM 权限
:为笔记本角色设置访问 AWS 服务所需的 Identity and Access Management (IAM) 权限。
3.
克隆 GitHub 仓库
:克隆指定的 GitHub 仓库(https://github.com/PacktPublishing/Natural-Language-Processing-with-AWS-AI-Services)。
4.
创建 Amazon S3 存储桶
:创建一个 Amazon S3 存储桶,并在笔记本中提供存储桶名称以开始执行。
具体操作步骤如下:
1. 按照相关说明创建 Jupyter 笔记本实例。
2. 当笔记本实例状态为 InService 时,在操作菜单中点击“Open Jupyter”。
3. 进入笔记本实例的主文件夹。
4. 点击“New”并选择“Terminal”。
5. 在终端窗口中,输入
cd SageMaker
然后执行
git clone https://github.com/PacktPublishing/Natural-Language-Processing-with-AWS-AI-Services
。
6. 退出终端窗口,返回主文件夹,点击“Natural-Language-Processing-with-AWS-AI-Services”文件夹,再点击“Chapter 16”。
7. 打开“Improve-accuracy-of-pdf-processing-with-Amazon-Textract-and-Amazon-A2I-forGitHub.ipynb”笔记本。
8. 逐单元格执行笔记本中对应步骤,并阅读每个单元格的说明。
额外的 IAM 先决条件
还需要为 SageMaker 笔记本角色启用额外的策略:
1.
附加策略
:如果尚未将 TextractFullAccess 和 AmazonAugmentedAIFullAccess 策略附加到 Amazon SageMaker 笔记本 IAM 角色,请进行附加。
2.
添加内联策略
:添加一个
iam:PassRole
权限作为内联策略到 SageMaker 笔记本执行角色,具体代码如下:
{ "Version": "2012-10-17", "Statement": [ {
"Action": [
"iam:PassRole"
],
"Effect": "Allow",
"Resource": "<your sagemaker notebook execution role ARN>"
}
]
}
创建用于人工审核的私有团队
为了能够在解决方案的 Amazon A2I 步骤中登录到标注任务 UI,需要创建一个私有团队并将自己添加为团队成员。具体步骤如下:
1. 登录 AWS 管理控制台,在服务搜索栏中输入“Amazon SageMaker”,进入 Amazon SageMaker 控制台。在左侧点击“Ground Truth”,然后选择“Labelling workforces”。在屏幕上选择“Private”选项卡,点击“Create private team”。
2. 在“Team Name”字段中输入私有团队的名称,在“Add Workers”部分保留默认的“Create a new Amazon Cognito user group”选择,然后滚动页面并点击“Create private team”。
3. 复制团队的 ARN,并在笔记本的 Step 1 – Cell 1 中提供:
WORKTEAM_ARN= '<your-private-workteam-arn>'
4. 滚动页面到“Workers”部分,点击“Invite new workers”,提供自己的电子邮件地址并点击“Invite new workers”。按照收到的电子邮件中的说明完成注册过程。
5. 点击“nlp-doc-team”,然后选择“Add workers to team”,从列表中选择自己的电子邮件地址并点击“Add workers to team”。
创建 Amazon S3 存储桶
按照相关说明创建 Amazon S3 存储桶。如果之前已创建,可以重复使用该存储桶。具体操作如下:
1. 在笔记本的 Step 1 – Cell 1 中输入存储桶名称:
bucket = "<S3-bucket-name>"
2. 点击笔记本 UI 顶部菜单中的“Run”按钮,执行 Step 1 – Cell 1,导入所需的库,初始化变量,并为下一步做好准备。
3. 执行笔记本中的 Step 1 – Cell 2,将注册文档上传到 S3 存储桶:
s3_client = boto3.client('s3')
for secfile in os.listdir():
if secfile.endswith('pdf'):
response = s3_client.upload_file(secfile, bucket, prefix+'/'+secfile)
print("Uploaded {} to S3 bucket {} in folder {}".format(secfile, bucket, prefix))
使用 Amazon Textract 提取注册文档内容
使用 Amazon Textract 提交异步文本检测作业,完成后将结果加载到 pandas DataFrame 中,选择所需的文本行并审查结果。具体步骤如下:
1.
定义桶句柄和存储作业 ID 的字典
:执行 Step 2 – Cell 1:
input_bucket = s3.Bucket(bucket)
jobids = {}
- 提交文本检测作业 :执行 Step 2 – Cell 2:
for doc in input_bucket.objects.all():
if doc.key.startswith(prefix) and doc.key.endswith('pdf'):
tres = textract.start_document_text_detection(
DocumentLocation={
"S3Object": {
"Bucket": bucket,
"Name": doc.key
}
}
)
jobids[doc.key.split('/')[2]] = tres['JobId']
- 打印作业 ID :执行 Step 2 – Cell 3:
for j in jobids:
print("Textract detection Job ID for {} is {}".format(j,str(jobids[j])))
- 定义辅助类并加载文本行 :执行 Step 3 – Cell 1。
- 提取文本并加载到 DataFrame :执行 Step 3 – Cell 2:
text_extractor = TextExtractor()
indoc = {}
df_indoc = pd.DataFrame(columns =
['DocName','LineNr','DetectedText','Confidence',
'CorrectedText', 'Comments'])
for x in jobids:
pages = text_extractor.extract_text(jobids[x])
contdict =pages[1]['Content']
for row in range(1,(int(len(contdict)/2))+1):
df_indoc.loc[len(df_indoc.index)]
= [x, row, contdict['Text'+str(row)],
round(contdict['Confidence'+str(row)],1),'','']
- 定义过滤标准并创建新的 DataFrame :执行 Step 3 – Cell 3 和 Step 3 – Cell 4:
df_newdoc = pd.DataFrame(columns =
['DocName','LineNr','DetectedText','Confidence',
'CorrectedText','Comments'])
for idx, row in df_indoc.iterrows():
if str(row['LineNr']) in bounding_dict['lines'].
split(':'):
df_newdoc.loc[len(df_newdoc.index)] =
[row['DocName'],row['LineNr'], row['DetectedText'],
row['Confidence'], row['CorrectedText'],row['Comments']]
df_newdoc
设置 Amazon A2I 人工审核工作流
使用之前创建的私有团队设置人工工作流,并将结果发送到 Amazon A2I 人工审核循环进行审查和修改。具体步骤如下:
1.
初始化变量
:执行 Step 4 – Cell 1。
2.
定义人工任务 UI 模板
:执行 Step 4 – Cell 2。
3.
创建任务 UI
:执行 Step 4 – Cell 3:
def create_task_ui():
response = sagemaker.create_human_task_ui(
HumanTaskUiName=taskUIName,
UiTemplate={'Content': template})
return response
# Create task UI
humanTaskUiResponse = create_task_ui()
humanTaskUiArn = humanTaskUiResponse['HumanTaskUiArn']
print(humanTaskUiArn)
- 创建 Amazon A2I 流程定义 :执行 Step 5 – Cell 1:
create_workflow_definition_response = sagemaker_client.
create_flow_definition(
FlowDefinitionName=flowDefinitionName,
RoleArn=role,
HumanLoopConfig= {
"WorkteamArn": WORKTEAM_ARN,
"HumanTaskUiArn": humanTaskUiArn,
"TaskCount": 1,
"TaskDescription": "Review the contents and
correct values as indicated",
"TaskTitle": "SEC Registration Form Review"
},
OutputConfig={
"S3OutputPath" : OUTPUT_PATH
}
)
flowDefinitionArn = create_workflow_definition_
response['FlowDefinitionArn']
- 启动人工工作流循环 :执行 Step 5 – Cell 2:
for x in range(60):
describeFlowDefinitionResponse = sagemaker_client.
describe_flow_definition(FlowDefinitionName=
flowDefinitionName)
print(describeFlowDefinitionResponse
['FlowDefinitionStatus'])
if (describeFlowDefinitionResponse
['FlowDefinitionStatus'] == 'Active'):
print("Flow Definition is active")
break
time.sleep(2)
- 上传扫描图像 :执行 Step 6 – Cell 1:
reg_images = {}
for image in os.listdir():
if image.endswith('png'):
reg_images[image.split('_')[0]] = S3Uploader.
upload(image, 's3://{}/{}'.format(bucket, prefix))
- 启动人工审核循环 :执行 Step 6 – Cell 2:
humanLoopName = {}
docs = df_newdoc.DocName.unique()
# confidence threshold
confidence_threshold = 95
for doc in docs:
doc_list = []
humanLoopName[doc] = str(uuid.uuid4())
for idx, line in df_newdoc.iterrows():
# Send only those lines whose confidence score is
less than threshold
if line['DocName'] == doc and line['Confidence']
<= confidence_threshold:
doc_list.append({'linenr':
line['LineNr'], 'detectedtext': line['DetectedText'],
'confidence':line['Confidence']})
ip_content = {"document": doc_list,
'image': reg_images[doc.split('.')[0]]
}
start_loop_response = a2i.start_human_loop(
HumanLoopName=humanLoopName[doc],
FlowDefinitionArn=flowDefinitionArn,
HumanLoopInput={
"InputContent": json.dumps(ip_content)
}
)
- 检查人工审核循环状态 :执行 Step 6 – Cell 3:
completed_human_loops = []
for doc in humanLoopName:
resp = a2i.describe_human_
loop(HumanLoopName=humanLoopName[doc])
print(f'HumanLoop Name: {humanLoopName[doc]}')
print(f'HumanLoop Status: {resp["HumanLoopStatus"]}')
print(f'HumanLoop Output Destination:
{resp["HumanLoopOutput"]}')
print('\n')
- 获取任务 UI URL :执行 Step 6 – Cell 4:
workteamName = WORKTEAM_ARN[WORKTEAM_ARN.rfind('/') + 1:]
print("Navigate to the private worker portal and do
the tasks. Make sure you've invited yourself to your
workteam!")
print('https://' + sagemaker.describe_
workteam(WorkteamName=workteamName)['Workteam']
['SubDomain'])
- 登录任务 UI 进行审核和修改 :使用之前创建标注工作团队时设置的凭据登录任务 UI,选择“SEC Registration Form Review”任务并点击“Start working”。在页面上进行修改后点击“Submit”。
- 检查人工审核循环完成状态 :执行 Step 6 – Cell 5。
- 检索人工审核结果并更新 DataFrame :执行 Step 6 – Cell 7。
存储结果以供下游处理
为了让下游应用程序能够使用处理结果,需要将其持久化存储。具体操作如下:
1.
创建 Amazon DynamoDB 表
:执行 Step 7 – Cell 1。
2.
将 DataFrame 内容上传到 DynamoDB 表
:执行 Step 7 – Cell 2:
for idx, row in df_newdoc.iterrows():
table.put_item(
Item={
'row_nr': idx,
# 此处代码未完整给出,需根据实际情况补充
}
通过以上步骤,可以利用 AWS 的相关服务提高 PDF 批量处理的准确性,并将处理结果存储起来供下游应用使用。整个流程的流程图如下:
graph LR
A[解决方案搭建准备] --> B[额外的 IAM 先决条件]
B --> C[创建用于人工审核的私有团队]
C --> D[创建 Amazon S3 存储桶]
D --> E[使用 Amazon Textract 提取注册文档内容]
E --> F[设置 Amazon A2I 人工审核工作流]
F --> G[存储结果以供下游处理]
通过上述步骤,我们可以看到如何逐步构建一个完整的解决方案,从准备工作到最终结果的存储,每个环节都有明确的操作步骤和代码示例。这种方法不仅提高了 PDF 批量处理的准确性,还引入了人工审核机制,确保了处理结果的可靠性。同时,将结果存储在 DynamoDB 中,为下游应用提供了方便的数据访问方式。在实际应用中,我们可以根据具体需求对这些步骤进行调整和优化,以适应不同的业务场景。
提高 PDF 批量处理的准确性(续)
各步骤总结与分析
在前面的内容中,我们详细介绍了提高 PDF 批量处理准确性的一系列步骤,下面对这些步骤进行总结和分析,以便更好地理解整个流程。
| 步骤 | 操作内容 | 关键代码 |
|---|---|---|
| 解决方案搭建准备 | 创建 Amazon SageMaker Jupyter 笔记本、设置 IAM 权限、克隆 GitHub 仓库、创建 Amazon S3 存储桶 |
git clone https://github.com/PacktPublishing/Natural-Language-Processing-with-AWS-AI-Services
等
|
| 额外的 IAM 先决条件 | 附加 TextractFullAccess 和 AmazonAugmentedAIFullAccess 政策,添加 iam:PassRole 内联政策 |
json<br>{ "Version": "2012-10-17", "Statement": [ {<br> "Action": [<br> "iam:PassRole"<br> ],<br> "Effect": "Allow",<br> "Resource": "<your sagemaker notebook execution role ARN"><br> }<br> ]<br>}<br>
|
| 创建用于人工审核的私有团队 | 在 Amazon SageMaker 控制台创建私有团队,添加成员 |
WORKTEAM_ARN= '<your-private-workteam-arn>'
|
| 创建 Amazon S3 存储桶 | 创建存储桶,上传注册文档 |
python<br>s3_client = boto3.client('s3')<br>for secfile in os.listdir():<br> if secfile.endswith('pdf'):<br> response = s3_client.upload_file(secfile, bucket, prefix+'/'+secfile)<br> print("Uploaded {} to S3 bucket {} in folder {}".format(secfile, bucket, prefix))<br>
|
| 使用 Amazon Textract 提取注册文档内容 | 提交异步文本检测作业,处理结果 |
python<br>input_bucket = s3.Bucket(bucket)<br>jobids = {}<br>
等
|
| 设置 Amazon A2I 人工审核工作流 | 初始化变量、定义 UI 模板、创建流程定义、启动循环等 |
python<br>def create_task_ui():<br> response = sagemaker.create_human_task_ui(<br> HumanTaskUiName=taskUIName,<br> UiTemplate={'Content': template})<br> return response<br># Create task UI<br>humanTaskUiResponse = create_task_ui()<br>humanTaskUiArn = humanTaskUiResponse['HumanTaskUiArn']<br>print(humanTaskUiArn)<br>
等
|
| 存储结果以供下游处理 | 创建 Amazon DynamoDB 表,上传 DataFrame 内容 |
python<br>for idx, row in df_newdoc.iterrows():<br> table.put_item(<br> Item={<br> 'row_nr': idx,<br> # 此处代码未完整给出,需根据实际情况补充<br> }<br>
|
可能遇到的问题及解决方法
在实际操作过程中,可能会遇到一些问题,下面为大家列举一些常见问题及解决方法。
-
权限问题
- 问题描述 :在执行某些操作时,可能会因为权限不足而失败,例如无法上传文件到 S3 存储桶,或者无法调用 Textract 服务。
- 解决方法 :检查 IAM 权限设置,确保已经正确附加了所需的策略,如 TextractFullAccess 和 AmazonAugmentedAIFullAccess 政策,以及添加了 iam:PassRole 内联政策。
-
任务状态问题
- 问题描述 :在启动人工审核循环或其他任务时,可能会出现任务状态异常,如一直处于初始化状态,无法变为活动状态。
- 解决方法 :检查相关配置是否正确,如 FlowDefinition 的配置是否完整,人工团队是否正常创建等。可以通过查看日志信息来获取更多详细信息。
-
数据处理问题
- 问题描述 :在将数据加载到 DataFrame 或上传到 DynamoDB 表时,可能会出现数据格式不匹配或数据丢失的问题。
- 解决方法 :检查数据处理代码,确保数据格式正确,并且在处理过程中没有丢失重要信息。可以在关键步骤添加打印语句,输出中间结果进行调试。
优化建议
为了进一步提高 PDF 批量处理的准确性和效率,可以考虑以下优化建议。
- 并行处理 :在提交文本检测作业时,可以考虑使用并行处理的方式,同时处理多个文档,以提高处理速度。例如,可以使用多线程或异步编程的方式来实现。
- 自动化审核 :对于一些低风险的文本检测结果,可以考虑使用自动化审核的方式,减少人工审核的工作量。可以通过设置规则或使用机器学习模型来实现自动化审核。
- 数据缓存 :对于一些经常使用的数据,可以考虑使用缓存机制,减少重复计算和数据读取的时间。例如,可以使用 Redis 等缓存工具来实现数据缓存。
总结
通过本文的介绍,我们详细了解了如何利用 AWS 的相关服务提高 PDF 批量处理的准确性。从解决方案的搭建准备,到使用 Amazon Textract 提取文档内容,再到设置 Amazon A2I 人工审核工作流,最后将结果存储以供下游处理,每个步骤都有明确的操作步骤和代码示例。同时,我们还对可能遇到的问题进行了分析,并提出了相应的解决方法和优化建议。
在实际应用中,我们可以根据具体需求对这些步骤进行调整和优化,以适应不同的业务场景。希望本文能够对大家在 PDF 批量处理方面有所帮助。
整个优化流程的详细步骤关系图如下:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([解决方案搭建准备]):::startend --> B(额外的 IAM 先决条件):::process
B --> C(创建用于人工审核的私有团队):::process
C --> D(创建 Amazon S3 存储桶):::process
D --> E(使用 Amazon Textract 提取注册文档内容):::process
E --> F(设置 Amazon A2I 人工审核工作流):::process
F --> G(存储结果以供下游处理):::process
H(并行处理优化):::process --> E
I(自动化审核优化):::process --> F
J(数据缓存优化):::process --> G
K(问题排查与解决):::process --> A
K --> B
K --> C
K --> D
K --> E
K --> F
K --> G
通过这个流程图,我们可以更清晰地看到整个优化流程的步骤以及各个优化点和问题排查环节与主流程的关系。希望大家在实际操作中能够顺利完成 PDF 批量处理的优化工作。
超级会员免费看

被折叠的 条评论
为什么被折叠?



