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

Posted 文仙草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了人口普查分析:利用python+百度文字识别提取图片中的表格数据相关的知识,希望对你有一定的参考价值。

今天发布了最新的人口普查结果,笔者拿到的文件是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,包括表格主体内容、表格标题等,见下图:

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

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

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

以上是关于人口普查分析:利用python+百度文字识别提取图片中的表格数据的主要内容,如果未能解决你的问题,请参考以下文章

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

Python调用百度接口(情感倾向分析)和讯飞接口(语音识别关键词提取)处理音频文件

1分钟读懂人口普查大数据——第七次人口普查数据可视化BI分析

1分钟读懂人口普查大数据——第七次人口普查数据可视化BI分析

人口普查数据分析

人口普查数据分析