查看原文
其他

软件应用 | 你的“老”文献、手写笔记有多少可以识别和复制?快用python批量转化吧!

启研学社 数据Seminar 2022-12-31

启研学社由知名学者担任学术顾问,由高校师生与企研数据科学团队联合组建的,是以大数据资源及相关技术助力中国学术、智库与行业研究为宗旨的研究组织。团队当前的主要目标是挖掘行政、经济与社会大数据资源在经济学学术、智库与相关行业研究领域中的应用价值,以学术研究为标准开展大数据治理研究,努力探索大数据分析技术融入中国经济社会研究的可行进路。 


你的“老”文献、手写笔记有多少可以识别和复制?快用python批量转化吧!

Part1引言

在工作和学习过程中,我们经常需要将图片中不可编辑的文本转为可编辑的文本,例如:将手写的会议记录提取并保存到个人电脑中,以便会议内容的检索;将图片资料中的文字进行提取,为后续数据处理提供基础;将纸质教程中的内容转化为可编辑并快速传播的文字等等。

以往人们会采用手动录入的方式,但这种方式太过原始,并且非常浪费时间,随着OCR文字识别技术的诞生,文档电子化的问题迎刃而解。文字识别技术的概念最早出现于1929年,在近100年的发展中,OCR文字识别技术已经相当成熟,并被大量运用在医疗、教育、商务、新闻出版等领域。

表1  提供OCR文字识别技术的软件或平台


类型类型说明举例优势劣势
识别软件专业的OCR文字识别软件、手机app以及微信小程序等市面上有非常多的OCR文字识别软件,例如,ABBYY Finereader、汉王ORC等。(1)操作简单,界面友好
(2)准确度高,功能丰富
(1)试用期结束后需要付费使用
(2)有些软件不支持批量转换
识别插件集成在应用程序中的OCR文字识别插件QQ、WPS等应用软件内置了OCR文字识别插件(1)操作简单
(2)准确率较高
(1)功能较少
(2)一般不支持批量转换
平台识别软件服务互联网平台公司提供的OCR服务百度智能云文字识别平台、讯飞开放平台、腾讯云OCR等等提供多种文字识别服务:例如,识别名片、识别银行卡、识别公式、识别发票等等。(1)需要了解编程等相关知识,有一定的门槛
(2)需购买额度。
注:上述优劣比较是笔者使用中的体会,仅供参考。

表1列出了提供OCR文字识别技术的软件或平台,优劣评价为笔者体验后给出,仅供参考。若读者需要转换大量的图片,推荐使用互联网公司提供的OCR服务

Part2基于平台OCR服务批量识别图片的实现思路

本文以百度智能云文字识别平台(https://cloud.baidu.com/product/ocr_general)为例,提供了批量实现OCR识别的Python代码,供大家参考。

实现思路如下:

  1. 申请API_KEY和SECRET_KEY。
  2. 通过API_KEY和SECRET_KEY获取access_token,有效期30天
  3. 选择对应功能的URL,例如:“百度的通用文字识别(高精度版)” 的URL为“https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic”
  4. 根据百度智能云提供的文档配置参数
  5. 发送POST请求,把图片发送到服务器,让服务器识别内容,然后获取识别结果
  6. 解析结果,保存到指定路径中

Part3python代码

python代码如下(若要测试代码请准备好python3.7环境并安装requests模块):

import requests
import base64
import os

# API_KEY 和 SECRET_KEY 用来获取 access_token
# 获取 API_KEY 和 SECRET_KEY 请参考: https://cloud.baidu.com/doc/OCR/s/dk3iqnq51
API_KEY = 'xxxxxxxxxxxx'
SECRET_KEY = 'xxxxxxxxxxxxxx'


def get_access_token():
    """
    根据 API_KEY 和 SECRET_KEY 获取 access_token
    请参考: https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu
    
    :return: access_token, 有效期为30天
    "
""

    host = f'https://aip.baidubce.com/oauth/2.0/token?grant_type=' \
           f'client_credentials&client_id={API_KEY}&client_secret={SECRET_KEY}'

    response = requests.get(host)
    if response:
        return response.json()['access_token']
    else:
        return 'get access_token failed'


def baidu_ocr(image):
    """
    百度的通用文字识别(高精度版)

    :param image: 图片路径
    :return: 图片中的文字
    "
""
    
    # 读取图片并用 base64 编码
    f = open(image, 'rb')
    img = base64.b64encode(f.read())
    f.close()
    
    # 设置url参数
    params = {"image": img}
    
    # 设置access_token
    access_token = get_access_token()
    
    # 设置请求的url
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
    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:
        words_result = ''
        for words in response.json()['words_result']:
            # 若不需要换行, 请删除 ' + \n'
            words_result += words['words'] + '\n'
        return words_result
    return 'get txt failed'


def get_imgs_path(img_path):
    """
    获取图片的路径

    :param img_path: 存放图片的文件夹
    :return: 保存图片名称和路径的生成器
    "
""
    # 图片名称生产器
    img_name = (os.path.splitext(i)[0] for i in os.listdir(img_path))
    # 图片路径生产器
    images = (os.path.join(img_path, i) for i in os.listdir(img_path))
    return images, img_name


def run_ocr(img_path, save_path):

    # 得到图片的文件名称, 及其路径
    # images, img_name 是两个生成器
    images, img_name = get_imgs_path(img_path)

    # 对每一个图片进行ocr识别
    for name, path in zip(img_name, images):
        # 调用百度接口
        txt = baidu_ocr(path)
        # 图片文字保存路径
        txt_save_path = os.path.join(save_path, name + '.txt')
        # 打印相关信息
        print(f'图片名称: {name},  图片位置: {path},  图片文字保存位置: {txt_save_path} \n')
        # 保存从百度返回的文字
        with open(txt_save_path, 'w') as f:
            f.write(txt)


if __name__ == '__main__':
    # 图片保存路径
    img_path = r'D:\ocr\imgs'

    # 图片中文字保存路径
    save_path = r'D:\ocr\result'

    # 批量转换
    run_ocr(img_path, save_path)

Part4效果展示与结语

上述代码仅针对百度智能云平台的 “ 通用文字识别(高精度版)” Web API接口。如果需要对发票、表格、身份证等图片进行OCR文字识别,请阅读相关文档:https://cloud.baidu.com/doc/OCR/s/Ek3h7xypm 。




星标⭐我们不迷路!
想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧

往期推荐

软件应用 | 哇!Stata参考书和经典教材!

数据可视化 | Python数据可视化 1 维到 6 维策略详解

统计计量 | 协方差和相关系数的暧昧关系:共性与个性

数据资源 | 常用的数据网站及资源汇总

软件应用 | 用Python快速制作海报级地图

软件应用 | 如何在Excel中调用Python脚本,实现数据自动化处理

数据资源 | 重磅!2014年工业企业数据库质量调查报告






数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文 | 陈煌杰

审核 | 杨奇明、施丹燕


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存