2018-03-05 百度AI API说明

短文本相似度
比较文本最大限制长度:512字节

请求参数

参数 类型 是否必须 描述

text_1  string  是   待比较文本1(GBK编码),最大512字节
text_2  string  是   待比较文本2(GBK编码),最大512字节
model   string  否   默认为"BOW",可选"BOW"、"CNN"与"GRNN"

关于模型选择
短文本相似度接口,可由用户自主选择合适的模型:

  • BOW(词包)模型

基于bag of words的BOW模型,特点是泛化性强,效率高,比较轻量级,适合任务:输入序列的 term “确切匹配”、不关心序列的词序关系,对计算效率有很高要求;

  • GRNN(循环神经网络)模型

基于recurrent,擅长捕捉短文本“跨片段”的序列片段关系,适合任务:对语义泛化要求很高,对输入语序比较敏感的任务;

  • CNN(卷积神经网络)模型

模型语义泛化能力介于 BOW/RNN 之间,对序列输入敏感,相较于 GRNN 模型的一个显著优点是计算效率会更高些。

调用次数:

短文本相似度 | 免费使用 | https://aip.baidubce.com/rpc/2.0/nlp/v2/simnet | 100000次/天免费 | 不保证并发

返回说明
返回参数

参数  描述  取值
log_id  uint64  随机数,请求唯一标识码
score   float   相似度结果取值(0,1],分数越高说明相似度越高

返回示例

{
    "log_id": 12345,
    "texts":{
        "text_1":"浙富股份",
        "text_2":"万事通自考网"
    },
    "score":0.3300237655639648 //相似度结果
},

采用百度API和自己处理的python解析的优缺点说明


5415920-88bfb149410b73ae.png
Image 1.png

下面我整理了一份 短文本比较的api接口,对文本做了长度,编码,特殊字符的处理。

<?php

/*
 * This file is part of PHP CS Fixer.
 * (c) Fabien Potencier <fabien@symfony.com>
 *     Dariusz Rumiński <dariusz.ruminski@gmail.com>
 *
 * This source file is subject to the MIT license that is bundled
 * with this source code in the file LICENSE.
 */

namespace App\Services;

use App\Repositories\TextCompareRepository;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;

class BaiduAiServices
{
    private $compare_url = 'https://aip.baidubce.com/rpc/2.0/nlp/v2/simnet?access_token=';
    private $token_url = 'https://aip.baidubce.com/oauth/2.0/token';
    private $cache_key = 'BAIDU_ACCESS';
    private $maxlength = 512;// 最大長度

    /**
    * 短文本相似度比較
    * @param text1
    * @param text2
    * @param model 可选"BOW"、"CNN"与"GRNN"
    * @return rate 
        // 转换成gbk编码 否则报错
        // {"log_id": 1376946857059981358, 
        // "error_code": 282002, 
        // "error_msg": "input encoding error"}
    */
    public function get_comapre_rate($text1, $text2, $model='BOW')
    {
        $access_token = $this->get_access_token();
        $url = $this->compare_url . $access_token;
        
        $t1 = $this->substr($text1);
        $t2 = $this->substr($text2);

        $t1 = $this->to_gbk($t1);
        $t2 = $this->to_gbk($t2);
        
        // 过滤非中文,数字,字母
        $t1 = $this->clean_emoji($t1);
        $t2 = $this->clean_emoji($t2);
        // $t1 = $this->filter_special($t1);
        // $t2 = $this->filter_special($t2);
    
        $param['text_1'] = $t1;
        $param['text_2'] = $t2;
        $param['model'] = $model;
        $result = $this->request_post($url, json_encode($param));
        $result = mb_convert_encoding($result,"UTF-8","GBK");
        
        if (!$result) {
            return false;
        }
        $result = json_decode($result, true);
        if (isset($result['error_code'])) {
            $msg = isset($result['error_msg']) ? $result['error_msg'] : '';
            Log::info('get compare text rate failed.info:' . 
                      $msg . ', text1:' . $param['text_1'] . ',text2:' . $param['text_2']);
            return false;
        } else {
            return $result;
        }
    }

    private function clean_emoji($text)
    {
        $clean_text = "";

        // Match Emoticons
        $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u';
        $clean_text = preg_replace($regexEmoticons, '', $text);

        // Match Miscellaneous Symbols and Pictographs
        $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u';
        $clean_text = preg_replace($regexSymbols, '', $clean_text);

        // Match Transport And Map Symbols
        $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u';
        $clean_text = preg_replace($regexTransport, '', $clean_text);

        // Match Miscellaneous Symbols
        $regexMisc = '/[\x{2600}-\x{26FF}]/u';
        $clean_text = preg_replace($regexMisc, '', $clean_text);

        // Match Dingbats
        $regexDingbats = '/[\x{2700}-\x{27BF}]/u';
        $clean_text = preg_replace($regexDingbats, '', $clean_text);

        $regexDingbats = '/[\x{231a}-\x{23ab}\x{23e9}-\x{23ec}\x{23f0}-\x{23f3}]/u';
        $clean_text = preg_replace($regexDingbats, '', $clean_text);

        return $clean_text;
    }

    private function filter_special($str)
    {
        $str = preg_replace("/[^\u4E00-\u9FFF]+/","", $str);
        return $str;
    }

    // 按照最长字节截取
    private function substr($str)
    {
        $text_length = 0;
        $str = preg_replace_callback(
                '/./u',
                function (array $match) use(&$text_length, &$length_arr) {
                    $str_len = strlen($match[0]);
                    
                    if ($str_len >= 4) { // 过滤emoji
                        return '';
                    } else {
                        if (($text_length + $str_len) >= $this->maxlength) {
                            return '';
                        }
                        $text_length += $str_len;
                        return $match[0];
                    }
                },
                $str);

         return $str;
     }

    /*
    * 轉為簡體中文
    */
    private function to_gbk($word){
        $table = config('s2table');
        return strtr($word, $table);
    }

    private function get_access_token()
    {
        $cache = Cache::get($this->cache_key);
        if (!$cache) {
            $cache = $this->create_access_token();
        }

        return $cache['access_token'];
    }

    private function create_access_token()
    {
        $post_data['grant_type']       = 'client_credentials';
        $post_data['client_id']      = config('constant.BAIDU_CLIENT_ID');
        $post_data['client_secret'] = config('constant.BAIDU_CLIENT_SECRET');
        $o = "";
        foreach ( $post_data as $k => $v ) 
        {
            $o.= "$k=" . urlencode( $v ). "&" ;
        }
        $post_data = substr($o,0,-1);
        $res = $this->request_post($this->token_url, $post_data);
        $res = json_decode($res, true);
        $expires_in = $res['expires_in']; // 秒数
        Cache::put($this->cache_key, $res, $expires_in / 60);

        return $res;
    }

    private function request_post($url = '', $param = '') {
        if (empty($url) || empty($param)) {
            return false;
        }
            
        $postUrl = $url;
        $curlPost = $param;
        $curl = curl_init();//初始化curl
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                                            'Content-Type: application/json',
                                            'Connection: Keep-Alive'
                                            ));

        curl_setopt($curl, CURLOPT_URL,$postUrl);//抓取指定网页
        curl_setopt($curl, CURLOPT_HEADER, 0);//设置header
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
        curl_setopt($curl, CURLOPT_POST, 1);//post提交方式
        curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
        $data = curl_exec($curl);//运行curl
        curl_close($curl);
        
        return $data;
    }
}

人臉庫

  • 獲取group
// get group
https://aip.baidubce.com/rest/2.0/face/v2/faceset/group/getlist?access_token=xxx
// response:
{"result":["demo"],"result_num":1,"log_id":3813784293030910}

  • 1:N人脸识别
    用于人脸库中一对一检测。检测图片中的人(单人)是否在人脸库中,存在则返回。
/**
     * 人臉檢測
     *
     * @param  $image data base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M
     * @return array
     */
    public function face_detect($image_data)
    {
        $access_token = $this->get_access_token();
        $url = config('constant.BAIDU.HOST') . 
            str_replace('{VERSION}', config('constant.BAIDU.VERSION'), config('constant.BAIDU.FACE.FACE_DETECT_ENDPOINT')) . '?access_token=' .  $access_token;
        $content_type = 'application/x-www-form-urlencoded';
        $data['image'] = $image_data;
        $data['max_face_num'] = $this->max_face_num;
        $data['face_fields'] = 'age,beauty,expression,faceshape,gender,glasses,race,qualities';
        $result = $this->request_post($url , $data, $content_type);

        return $result;
    }
  • 人脸认证
    用于识别上传的图片是否为指定用户,即查找前需要先确定要查找的用户在人脸库中的id。

  • M:N人脸识别
    待识别的图片中,存在多张人脸的情况下,支持在一个人脸库中,一次请求,同时返回图片中所有人脸的识别结果。

  • 文章标签
    文本标签服务对文章的标题和内容进行深度分析,输出能够反映文章关键信息的主题、话题、实体等多维度标签以及对应的置信度,该技术在个性化推荐、文章聚合、内容检索等场景具有广泛的应用价值。

参数名类型说明是否必填
titlestring文章标题(GBK编码),最大80字节必填
contentstring文章内容(GBK编码),最大65535字节 ,大约64KB必填

BODY 请求参数说明

参数名类型说明是否必填
titlestring文章标题(GBK编码),最大80字节必填
contentstring文章内容(GBK编码),最大65535字节 ,大约64KB必填
图像审核

价格和免费额度:
https://ai.baidu.com/docs#/ImageCensoring-Pricing/top

身份验证有文档,但是这个估计是属于公安特殊接口,需要申请。
​ 目前公安验证接口,暂不对外开放(在应用管理中无法自行勾选),需要您申请客户端SDK成功后自动赋权给您的账户。若您需要单独使用公安验证接口而无需使用SDK,请通过商务方式告知百度方面,百度方面配置完毕后,即可开启此appid的调用权限。
https://ai.baidu.com/docs#/FacePrint/47eb863d

图片识别

目前有car,animal,plant,logo,dish,图像主体位置,通用物和场景识别等几种识别类型。如果你想自定义图像类别,可以在http://ai.baidu.com/customize/ 做自定义化。logo也可以自定义,但是需要开通企业认证。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值