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,但是貌似也沒有直接數據清洗和數據提取的工具,如果你需要進行很多的數據的分析,還是得上這個生態
本文還會時不時繼續更新