php抓取圖片進行內容提取解析,文字性pdf進行內容文字提取解析

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解析內容

目前解析文字性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,可是貌似也沒有直接數據清洗和數據提取的工具,若是你須要進行不少的數據的分析,仍是得上這個生態

 

本文還會時不時繼續更新

相關文章
相關標籤/搜索