如何将Python Textract提取的文本与AWS DynamoDB存储数据进行比对
方案整体架构思路
你不需要把Textract的提取结果全量传入DynamoDB再执行比对,DynamoDB作为键值存储,直接做全字段模糊匹配的效率很低,推荐用无服务流程串联实现需求,成本和复杂度都更低。
正向流程(Textract提取结果主动匹配DynamoDB已有用户数据)
- 第一步:先结构化Textract的身份证提取输出,把需要比对的核心字段(比如姓名、身份证号、出生日期)从Textract返回的JSON结果中提取出来,做字段清洗:比如去掉空格、特殊符号,身份证号统一转大写,姓名去掉特殊编码字符等,清洗后的字段统一存入一个JSON对象。
- 第二步:选择DynamoDB中的唯一标识字段作为查询键,比如用户录入时必填的身份证号,你直接把Textract提取清洗后的
身份证号作为Partition Key调用GetItem接口查询DynamoDB对应条目,该查询为毫秒级返回,成本极低。 - 第三步:如果查询到匹配条目,再把Textract提取的其他字段和DynamoDB中存储的对应字段做相似度比对,比如用
Levenshtein库计算编辑距离,超过你设定的阈值(比如95%匹配)就算核验通过;如果未查到对应身份证号的条目,直接返回无匹配记录即可。 - 可选优化:如果需要支持非唯一字段的模糊匹配,可以给DynamoDB开启DynamoDB Streams,同步数据到OpenSearch,用OpenSearch做模糊匹配查询,效率远高于直接扫描DynamoDB。
反向流程(用DynamoDB存储的用户数据匹配已有的Textract提取结果库)
- 第一步:你需要先把所有历史Textract提取的结构化身份证数据存在另一张DynamoDB表或者S3中,同样以身份证号作为Partition Key建立索引。
- 第二步:用户在前端提交录入数据后,触发Lambda函数,把录入的核心字段做同样的清洗操作,用身份证号作为键查询存储Textract提取结果的库。
- 第三步:执行和正向流程一致的字段相似度比对,返回匹配结果即可。
核心代码示例(Python)
import boto3 from Levenshtein import ratio dynamodb = boto3.resource('dynamodb') # 用户录入数据存储的DynamoDB表 user_table = dynamodb.Table('user-submitted-data') def verify_id_card(textract_extracted_data): # 清洗提取的身份证号和姓名字段 extracted_id = textract_extracted_data['id_number'].strip().upper() extracted_name = textract_extracted_data['name'].strip() # 查询DynamoDB对应条目 response = user_table.get_item(Key={'id_number': extracted_id}) if 'Item' not in response: return {"match": False, "reason": "无对应身份证号记录"} stored_user = response['Item'] # 比对姓名相似度,可自行扩展出生日期、地址等其他字段的比对逻辑 name_similarity = ratio(extracted_name, stored_user['name']) if name_similarity >= 0.9: return {"match": True, "similarity": name_similarity} else: return {"match": False, "similarity": name_similarity, "reason": "姓名匹配度不足"}
注意事项
- 身份证等敏感数据存储在DynamoDB时必须开启静态加密,传输过程全程使用HTTPS,符合数据安全合规要求。
- Textract识别结果可能存在局部误差,不要设置100%全等匹配的规则,根据业务场景设置合理的相似度阈值即可。
- 如果比对请求量波动较大,建议给DynamoDB开启按需容量模式,不需要手动调整吞吐量。
内容的提问来源于stack exchange,提问作者VANYA SHRIVASTAVA
相关产品推荐
相关产品推荐

