2018年7月7日18:52:17

php是用纯算法,自己是提取图片内容不是不行,可以但是优化起来很麻烦还得设计学习库,去矫正数据的正确率

对于大多数项目来说,如果不是做ocr服务,就不必要做需求工具或者接口

一,

先说工具 tesseract-ocr/tesseract 目前没有时间测试,全套东西,学习难度不大,需要的训练数据,支持多国语言

https://github.com/ShuiPingYang/tesseract-ocr-for-php

官方网站 http://tesseract-ocr.repairfaq.org

整一套到实际项目起码的一个月差不多,成熟的还得几个月的线上数据训练,差不多就OK了

二,

去购买其他成熟的平台的api,目前测试过的百度的图片识别api,通用文字高精度版,测试过几张稍复杂的图片还不错,返回的不是纯text

返回的是数组,还行,对于不规则的表格,文本后面再说处理方法,

我现在项目的使用的就是这个,官网http://ai.baidu.com/  500/天 是免费的,方便测试

还有一个就是https://ai.qq.com/ 腾讯的 这个注册了但是还没有测试,

当然还有阿里云的,但是也属于没测试过,

都有各种语言的demo包

提取的百度api的demo

/*
* 百度OCR
* $data 传进来是图片的二进制数据
* $type = 1 通用文字识别 50000次/天免费
* $type = 2 通用文字识别(高精度)500次/天免费
* $type = 3 网络图片文字识别 500次/天免费
* $type = 4 身份证识别 500次/天免费
* $type = 5 银行卡识别 500次/天免费
*
* 说明 通用文字识别(高精度)识别度可以建议使用这个
*/ public static function baidu_ai($image = '', $type = 2) {
if (empty($image)) {
throw new \Exception('图片二进制数据不能为空');
} $AppID = '';
$API_Key = '';
$Secret_Key = ''; if ($type == 1) {
// 通用文字识别
$url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic';
} elseif ($type == 2) {
//通用文字识别(高精度版
$url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic';
} elseif ($type == 3) {
//网络图片文字识别
$url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/webimage';
} elseif ($type == 4) {
//身份证识别
$url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/idcard';
} elseif ($type == 5) {
//银行卡识别
$url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/bankcard';
} else {
throw new \Exception('$type 类型错误');
}
//获取token 有效时长30天,存redis
$baidu_key = 'BAIDU_TOKET';
if (Redis::ttl($baidu_key) < 360) {
$data['grant_type'] = 'client_credentials';
$data['client_id'] = $API_Key;
$data['client_secret'] = $Secret_Key;
$access_token_url = 'https://aip.baidubce.com/oauth/2.0/token';
$result = self::post($access_token_url, $data);
if ($result['code'] != 200) {
throw new \Exception('授权出错');
} Redis::set($baidu_key, $result['content']);
Redis::expire($baidu_key, 29 * 24 * 3600);
}
$baidu_token = Redis::get($baidu_key);
$baidu_token = json_decode($baidu_token, true); $access_token = $baidu_token['access_token']; $request_data['image'] = base64_encode($image);
$request_url = $url . "?access_token={$access_token}&aipSdk=php&aipSdkVersion=2_2_2";
$data_result = self::post($request_url, $request_data);
if ($data_result['code'] != 200) {
throw new \Exception('接口请求出错');
}
return $data_result['content'];
} public static function post($url = '', $data = [], $headers = []) {
if (empty($url) || empty($data)) {
throw new \Exception('请求URL和数据都不能为空');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, is_array($data) ? http_build_query($data) : $data);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 60000);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 60000);
$content = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($code === 0) {
throw new \Exception(curl_error($ch));
} curl_close($ch);
return array(
'code' => $code,
'content' => $content,
);
}

三,

纯算法提取,算了

pdf解析内容

目前解析文字性pdf的php,效果还不错,但是解析出来是纯文本,是不规则数据,

https://github.com/smalot/pdfparser  php的库

文字识别率和效率都还不错

项目demo代码

composer require smalot/pdfparser
use Smalot\PdfParser\Parser;

public static function parsing_pdf() {
$parser = new Parser();
$pdf = $parser->parseFile('http://www.yafco.com.hk/asp_bin/newimg/1523872385.pdf');
// pp($pdf);
$text = $pdf->getText();
$result = json_encode($text, JSON_UNESCAPED_UNICODE);
}

图片性的pdf更麻烦,还得切成一页的图片然后再去ocr

说点数据提取的一点点心得

比如我获取某些网站发布的pdf文件进行部分数据的提取

首先我建议提取的pdf原始文本,进行json吧制表符转换成实体,记住不要把中文不要转码

json_encode( '中文', JSON_UNESCAPED_UNICODE );

利用制表符,\t\n   \t   等作为分隔符,然后就是肉眼看到貌似很规则的pdf格式

其实解析完,你会发现一点都不规则,如果你没处理过,你会使用分割完的数组进行key的偏移进行定位你需要的位置的文本

但是,你不能使用不可穷尽的匹配位置的去获取数据

所以利用一点小方法就可以轻松获取数据,而且也不用写得极其的多的代码去匹配数据位置

方法1:

比如你的pdf文件数据大致的位置都是固定,但是解析出来的文本不规则的,可以进行数据块进行分割成一块一块的,如果你需要某块 的一部分数据,你就直接写稍微多3-4个

方法,去匹配位置就ok了,就不用去全文的匹配位置,麻烦少了很多,原则就是大块文本分小块,分块分次处理,进行全局匹配位置太麻烦,而且全局匹配可能你都没办法对复杂一点的pdf无法处理

方法2:

使用nlp接口去分析文本,百度ai的文本分析说使用只是把各种算法实现了,提供了接口,但是不是提供完整的功能,比如文本块分析

腾讯ai 也提供了。但是最大字符只有1024个字符,所以就直接放弃了,一页文本经常好几千个字,基本无实用性,如果你有小块文本需要提取的可以试试这个接口

方法3:

hadoop,但是貌似也没有直接数据清洗和数据提取的工具,如果你需要进行很多的数据的分析,还是得上这个生态

本文还会时不时继续更新

php抓取图片进行内容提取解析,文字性pdf进行内容文字提取解析的更多相关文章

  1. 深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  2. 深入学习Python解析并解密PDF文件内容的方法

    前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容的方法. 链接如下:https://www.cnblogs.com/wj-1314/p/9429 ...

  3. Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)

    概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868 ...

  4. python3用BeautifulSoup抓取图片地址

    # -*- coding:utf-8 -*- #python 2.7 #XiaoDeng #http://tieba.baidu.com/p/2460150866 #抓取图片地址 from bs4 i ...

  5. ffmpeg 从视频流中抓取图片

    从视频中不断抓取图片的基本流程:打开视频流地址->获取视频流packt->解码成图片帧->输出图片 一.初始化Ffmpeg void ffmpegInit(){ av_registe ...

  6. jmeter正则表达式提取器提取特定字符串后的全部内容

    jmeter进行JDBC请求时,请求后的响应结果在传递给下一个请求使用时,需要用到关联,也在jmeter中,关联通过正则表达式提取器实现. 但是,在JDBC请求后的响应结果中,往往需要关联的内容是只有 ...

  7. curl 抓取图片

    /** * curl 抓取图片 * @param $url * @return mixed */ public static function downLoadImage($url) { $heade ...

  8. HttpClient(三)-- 抓取图片

    使用HttpClient抓取图片,先通过 entity.getContent() 获取输入流,然后 使用 common io 中的文件复制 方法 将图片专区到本地,代码如下: 1.需要依赖common ...

  9. (三)HttpClient 抓取图片

    第一节: HttpClient 抓取图片 这里pom.xml需要用到io输入输出: <dependency> <groupId>commons-io</groupId&g ...

随机推荐

  1. Distance on the tree(数剖 + 主席树)

    题目链接:https://nanti.jisuanke.com/t/38229 题目大意:给你n个点,n-1条边,然后是m次询问,每一次询问给你u,v,w然后问你从u -> v 的路径上有多少边 ...

  2. iTOP-4412开发板-串口转接小板的使用文档

    本文档介绍如何使用 迅为iTOP-4412 精英版如何使用串口转接板,串口小板如下所示.和串口转接板模块相关的资料如下:“iTOP-4412-Android-串口测试文档(升级版)_V2.X.zip” ...

  3. 设计模式九: 观察者模式(Observer Pattern)

    简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...

  4. ROS-PCL点云库的安装

    网上各种说安装点云库还慢,中间出现一些没有依赖库的情况,但在我这里都是很顺利,难道是一开始安装了ROS的原因?不是很清楚,暂且将过程写下来. 一,下载PCL $ git clone https://g ...

  5. 【原创】运维基础之Docker(4)实用工具ctop

    ctop类似于top,top监控的是进程,ctop监控的是容器(container top) 安装 # wget https://github.com/bcicen/ctop/releases/dow ...

  6. 【原创】大叔经验分享(46)用户提交任务到yarn报错

    用户提交任务到yarn时有可能遇到下面的错误: 1) Requested user anything is not whitelisted and has id 980,which is below ...

  7. vue2.0 事件处理常用修饰符-----------------记录,加强记忆。

    1,<!-- 阻止单击事件继续传播 --> <a v-on:click.stop="doThis"></a> stop修饰符对应的是阻止冒泡的e ...

  8. 浅析Memcache和Redis

    想必开发的小伙伴们对Memcache和Redis都不陌生吧,最近正好在整理它们,于是就写一下博客吧!一方面是分享,另一方面便于自己查找. 首先,来说说Memcache和Redis是什么? 说得简单一点 ...

  9. 【EasyNetQ】- 发布/订阅模式

    EasyNetQ支持的最简单的消息传递模式是发布/ 订阅.这种模式是消除消费者信息提供者的绝佳方式.出版商简单地向全世界说,“这已经发生了”或“我现在有了这些信息”.它不关心是否有人正在倾听,他们可能 ...

  10. RPC原理及实现

    一.什么是RPC RPC 的全称是 Remote Procedure Call 是一种进程间通信方式.它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个 ...