人口普查分析:利用python+百度文字识别提取图片中的表格数据(代码片段)

文仙草 文仙草     2022-12-05     761

关键词:

今天发布了最新的人口普查结果,笔者拿到的文件是pdf格式(网上应该有)。之前就一直想实现从pdf提取表格数据,输出为excel。正好这次有公开数据,因此打算用来练个手。

尝试了两种方法:

1.python的pdfplumber包:利用pdfpumber中的extract_table()方法,可以直接将pdf中表格抽取转换成excel,但是对于不规则的表格(比如有合并单元格、分布在两页中)抽取效果不太理想

2. python+百度智能云的文字识别:需要把pdf先转换成图片,再通过图片识别完成(其实。。。感觉有些多此一举。。。),不过对于边框有缺失的表格感觉效果一般。

 

以下是用 python+百度智能云的文字识别抽取表格信息的步骤:

零经验新手第一次尝试,正好写的稍微细致一些

 

声明:代码使用python3实现

 

!!!前期准备

1. 注册百度智能云账号:也可以用百度云账号。需要完成实名认证,并进行刷脸认证(这一步被迫下载了百度智能云app,吐槽!!为什么要另外下载app,用百度云app不香么。。。)

2. 登录百度智能云并开通通用文字识别的应用:在这个官方网站里https://ai.baidu.com/tech/ocr/general选择免费使用就行(新手练习的次数够了,我爱开放平台!)

百度智能云界面-全局

3. 创建应用:这一步是为了获取后续请求接口时需要使用到的API Key和Secret Key,个人理解有点像用户名和密码,发送请求和获取结果接口的时候需要使用到。点击上图中左边栏的”文字识别“,然后出现下图的界面后,点击”创建应用”即可。具体该怎么创建,也可以百度搜索,此处省略一些描述。。。

创建应用的界面

 

 

!!!python准备

!!给python安装sdk:

csdn里搜到的安装sdk的代码是:

pip install baidu-aip

百度云官网提供的讲解视频里写的安装sdk代码是:(视频讲解地址:https://cloud.baidu.com/doc/APIGUIDE/s/Ek1mzbeek

pip install bce-python-sdk

我也不知道哪个是对的或者有用的,所以都安装了。。。(求大佬指点)

也可以从百度云官网下载sdk包,手动安装:https://cloud.baidu.com/doc/Developer/index.html

 

!!!终于可以进入正文了,代码实现

本次测试的图片来自今天最新发布的人口普查分析。因为百度文字识别不能识别pdf,只能用图片,所以先把pdf里表格部分截图(从这步开始,此方法就不适合多表格多页PDF了。。)

测试用的人口普查数据图片

具体的实现代码如下:

【步骤一:获取access toke】 

官网的说明文档里面提供了代码示例和说明,网址如下:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu

import requests  #在第一、二、三步都需要调用
import base64    #在第二、三步需要调用


'''
使用百度智能云的表格文字识别(异步接口)获取图片中表格数据
'''

#步骤一:获取Access token

# 需要将官方文档中提供的host中client_id=【官网获取的AK】&client_secret=【官网获取的SK】的黑框内容替换
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
response = requests.get(host)
response = requests.get(host)
if response:
    #print(response.json())  官网代码示例中给的,打印返回结果,可以查看返回的内容
    #print(type(response.json())) 我自己加的,打印返回结果的类型,发现是一个字典
    
    #需要取键名为“access_token”的value
    token_result = response.json()
    access_token = token_result.get('access_token')
    print(access_token)

  通用场景文字识别中的表格文字识别(异步接口)官方说明中提供了代码示例(墙裂推荐阅读!!),网址如下:https://cloud.baidu.com/doc/OCR/s/Ik3h7y238  

【步骤二:提交请求接口】

按照官网的说明,这一步可以通过调整参数is_sync,实现同步获取识别结果。(下次可以试试~)

​#步骤二:提交请求接口


#请求URL,从上面提到的官方说明中查到的,不用修改,直接粘过来
request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/request"

# 二进制方式打开图片文件,把图片文件与本代码文件保存在一个文件夹里
f = open('全国人口年龄构成.png', 'rb')
img = base64.b64encode(f.read())

#请求主体,image是必选参数,其他可选参数详见官方说明
params = "image":img

#access_token来自第一步,即调用鉴权接口获取的token
request_url = request_url + "?access_token=" + access_token
headers = 'content-type': 'application/x-www-form-urlencoded'
response = requests.post(request_url, data=params, headers=headers)
if response:
    # print (response.json())  这是官网提供的代码示例,如成功返回,则应该是一个包含了键名为 'result'和'log_id'的字典
    # 成功返回结果的文件结构如下:'result': ['request_id': '一串字符'], 'log_id': 一串数字
    #从返回结果文件中获取后续步骤需要用到的request_id和log_id
    result = response.json()
    result_id = result.get('result')   
    request_id = result_id[0].get('request_id')   #说明:result_id是一个含有一个值的列表,而这个值的类型是字典。
    log_id = result.get('log_id')
    print (request_id, log_id)​  #查看是不是成功获取

【步骤三:获取结果接口】

基本上就是步骤二的代码,但是注意更新URL,因为获取结果接口的URL提交请求接口的URL不同

#步骤三:获取结果接口


#请求URL,注意与提交请求时的URL不一样!从官方文档获取,直接黏贴即可,不要修改
request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/get_request_result"

#请求主体,可以传递两个参数:request_id和result_type,详见官方文档
#request_id: 必选参数,来自第二步的返回结果
#result_type:可选参数,可以选择传回结果类型为Excel还是json,默认为Excel
params = "request_id":request_id  

#access_token来自第一步
request_url = request_url + "?access_token=" + access_token
headers = 'content-type': 'application/x-www-form-urlencoded'
response = requests.post(request_url, data=params, headers=headers)
if response:
    print (response.json())
#response.json()是返回一个字典类型对象

因为采用的传回结果类型是excel, 所以response.json()对象中有一个'result_data'键,这个’result_data'键值是一个网址,将网址复制黏贴到浏览器里,会弹出提示下载excel的提示框

下载后就是本次图片的表格文字识别的结果,结果包含多个sheet,包括表格主体内容、表格标题等,见下图:

识别出的表格内容主体
识别出的表格标题

猜测,因为图片中的表格内容中间没有框线,所以不同行的内容都在一个单元格里了。

总之,效果一般般。对于没有框线或者框线部分缺失的表格,慎用

人口普查数据分析

def getDataDict():    dataFrame = pandas.read_excel(‘D:/Py/2010人口普查.xlsx‘,skiprows=2)    raceList = list(map(lambda s:str(s).repla 查看详情

大数据分析案例-基于随机森林算法构建人口普查分析模型

查看详情

利用百度文字识别图片中的文字(python版)

importglobfromosimportpathimportosfromaipimportAipOcrfromPILimportImagedefconvertimg(picfile,outdir):‘‘‘调整图片大小,对于过大的图片进行压缩picfile:图片路径outdir:图片输出路径‘‘‘img=Image.open(picfile)width,height=img.sizewhile( 查看详情

使用node.js解析多维人口普查数据

】使用node.js解析多维人口普查数据【英文标题】:usingnode.jstoparsemulti-dimensionalcensusdata【发布时间】:2017-07-0522:19:28【问题描述】:我正在尝试使用node.jsJSON.parse从人口普查数据中提取单个行和特定数据。consthttp=require(\'http\');func... 查看详情

(源码分享)利用python识别提取图像文字(中文英文都可以)

参考技术A你想了解怎么利用程序自动识别网站验证码吗?识别提取图像文字(中文英文都可以)分享一点简单有用的小项目:python源码分享如下:看视频教程链接:(点击识别图像文字视频教程链接)一、首先需要安装Tesseract... 查看详情

r统计聚类分析

题目:为了深入地了解我国人口的文化程度,利用1990年全国普查数据对全国30个省、直辖市、自治区进行聚类分析,分别选用了三个指标:(1)大学以上文化程度的人口占全部人口的比例(DXBZ);(2)初中文化程度的人口占全... 查看详情

1028.人口普查(pat)(代码片段)

题目分析:构造一个Compare函数,比较日期的大小即可,不过要注意如果没有合法的生日,就只能输出一个零(这里贼坑)。 代码如下:1#include<stdio.h>2#include<stdlib.h>34structperson5charname[20];6intyear;7intmonth;8intday;9youngest,ol... 查看详情

ml之shap:基于adult人口普查收入二分类预测数据集(预测年收入是否超过50k)利用shap值对xgboost模型实现可解释性案例之详细攻略

ML之shap:基于adult人口普查收入二分类预测数据集(预测年收入是否超过50k)利用Shap值对XGBoost模型实现可解释性案例之详细攻略目录基于adult人口普查收入二分类预测数据集(预测年收入是否超过50k)利用Shap值对XGBoost模型实 查看详情

机器学习pai实践二人口普查统计

...开篇,先提供一个简单的案例给大家热身。通过截取一份人口普查的数据,对学历和收入进 查看详情

使用州获取美国人口普查区域

】使用州获取美国人口普查区域【英文标题】:getUSCensusregionsusingstates【发布时间】:2017-08-0721:47:27【问题描述】:美国人口普查将每个州指定为region(即纽约位于东北部)。我有一个州数据集,我想查找这些州对应的美国人口... 查看详情

我如何折叠普查数据,以便每一行都代表一个县而不是使用r的普查区?(代码片段)

...到任何帮助,所以我在这里。我正在处理新泽西州2010年人口普查的人口普查数据。此数据在任何地方都没有县名,而是县代码(COUNTY或COUNTYFP10)。我想基于县进行分析,因此(希望)使生活更轻松,我希望将2010年人口普查区域... 查看详情

python:截取图片后识别文字输出至剪切板

...Y和SECRET_KEY这3个关键信息。详细创建和调用过程可以参考python怎么使用百度文字识别功能和百度API接口说明。 查看详情

1028.人口普查(20)

1028.人口普查(20)某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9... 查看详情

怎么把图片字体识别?

...择一张所需识别的图片并打开。图片添加完成后,还可以利用下方一排小工具来对图片进行“移动”“放大图片”“缩小图片”等操作。在界面左下角这里还可以设置一下待会识别好的文件保存位置。可以保存在原文件夹,或者... 查看详情

如何利用python_docx提取文字和文字模块儿?

python使用python-docx操作word如何利用python钢doc是提取文字和文字模块会了当然是按照他的程序啊如何利用python钢doc是提取文字和文字模块会了当然是按照他的程序啊参考技术A提取文字和那文字模块就快了,可以直接点击完设置旁... 查看详情

pat1028.人口普查

人口普查某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,... 查看详情

特定的纬度/经度落在啥“道路”上?美国人口普查形状文件

】特定的纬度/经度落在啥“道路”上?美国人口普查形状文件【英文标题】:What"road"doesaparticularlat/longfallon?USCensusShapefiles特定的纬度/经度落在什么“道路”上?美国人口普查形状文件【发布时间】:2012-02-0104:52:35【问... 查看详情

1018_人口普查(20)

...程序 Standard (来自 小小)题目描述某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过20... 查看详情