2018年7月7日18:52:17php
php是用純算法,本身是提取圖片內容不是不行,能夠可是優化起來很麻煩還得設計學習庫,去矯正數據的正確率git
對於大多數項目來講,若是不是作ocr服務,就沒必要要作需求工具或者接口github
先說工具 tesseract-ocr/tesseract 目前沒有時間測試,全套東西,學習難度不大,須要的訓練數據,支持多國語言web
https://github.com/ShuiPingYang/tesseract-ocr-for-phpredis
官方網站 http://tesseract-ocr.repairfaq.org算法
整一套到實際項目起碼的一個月差很少,成熟的還得幾個月的線上數據訓練,差很少就OK了json
去購買其餘成熟的平臺的api,目前測試過的百度的圖片識別api,通用文字高精度版,測試過幾張稍複雜的圖片還不錯,返回的不是純textapi
返回的是數組,還行,對於不規則的表格,文本後面再說處理方法,數組
我如今項目的使用的就是這個,官網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的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的偏移進行定位你須要的位置的文本
可是,你不能使用不可窮盡的匹配位置的去獲取數據
因此利用一點小方法就能夠輕鬆獲取數據,並且也不用寫得極其的多的代碼去匹配數據位置
好比你的pdf文件數據大體的位置都是固定,可是解析出來的文本不規則的,能夠進行數據塊進行分割成一塊一塊的,若是你須要某塊 的一部分數據,你就直接寫稍微多3-4個
方法,去匹配位置就ok了,就不用去全文的匹配位置,麻煩少了不少,原則就是大塊文本分小塊,分塊分次處理,進行全局匹配位置太麻煩,並且全局匹配可能你都沒辦法對複雜一點的pdf沒法處理
使用nlp接口去分析文本,百度ai的文本分析說使用只是把各類算法實現了,提供了接口,可是不是提供完整的功能,好比文本塊分析
騰訊ai 也提供了。可是最大字符只有1024個字符,因此就直接放棄了,一頁文本常常好幾千個字,基本無實用性,若是你有小塊文本須要提取的能夠試試這個接口
hadoop,可是貌似也沒有直接數據清洗和數據提取的工具,若是你須要進行不少的數據的分析,仍是得上這個生態
本文還會時不時繼續更新