百度AI开放平台- API实战调用

百度AI开放平台- API实战调用

一、      前言

首先说一下项目需求。

两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-100条左右,不会更多,只会更少。最终的需求是:从这些匹配结果中找到相似度较高的那些条目。

自己编写算法来实现是一个很大的工程,涉及到自然语言处理的一些方面,比较复杂。于是上网搜了搜,发现百度开放平台的自然语言处理可以免费调用,而且每天有10W的调用次数,对我的小项目来说正好满足。但是,在往下翻的时候,发现百度给了提示,不保证并发,也就是说,在我调用的时候很容易出现返回错误结果的情况,这部分需要进行适当的处理。

既然是实战,我们从头开始说。

二、      准备工作

从哪里开始说呢,从在百度开放平台创建一个应用说起。创建应用之后(下面的开发环境是PHP,所以在选择应用使用类型的时候填写HTML),会有应用的ID,key,secret。后两个参数接下来会有用。

我使用的是短文本相似度API,其他类型的功能与此基本一模一样(不接受抬杠)。先去看开发文档http://ai.baidu.com/docs#/NLP-API/top可以看到提供了两种调用方式,这里我们以调用方式一为例-向API服务地址使用POST发送请求,这种方式来实现上述功能。看描述,需要一个参数叫做access_token原文也提供了其获取方式。以获取短文本相似度的access_token例子:

https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=MzRN******Txgske3QRf5Yj69&client_secret=a30CAbc*****bDuuGLdHLeyRaZk1tq5&

其中一共涉及三个参数,第一个固定为client_credentials不要改变。

第二第三个分别为前面获取到的key,secret。

把这一串地址放在地址栏中,回车即可返回json格式的字符串,找到access_token复制存在一个文件中,留着备用。

注意:复制地址的时候,中间可能会带有空格,一定要删去。特别是复制开发文档中的那段代码的时候,带有空格,是得不到返回结果的。可以复制我的这一段地址则没有问题。

三、      动手

下面开始编写PHP代码。整个过程我们只需一个文件就好。

PHP可以使用curl来请求url参数。在开发文档中,说明了要传参access_token以及要把请求文本以json格式传过去(编码是GBK)。下面是代码:

$access_token = "24.a810b4be2b5683a4d6af2f47b420877f.2592000.1507883636.282335-10044457";

$url = "https://aip.baidubce.com/rpc/2.0/nlp/v2/simnet?access_token=" . $access_token;

$body=array(

    "text_1"=>"我在二舍B门口看到一床被子,应该是哪位同学忘记收走了,记得来取哦。",

    "text_2"=>"信息A门口有一辆自行车,黄色的,没上锁,请失主前去认领。"

);

$json_data=json_encode($body);

这段代码及时实现了上述功能。在把$body转为json格式的时候,已经默认把中文从UTF8转到GBK了,无需另外的操作。

$curl=curl_init();

        curl_setopt($curl, CURLOPT_URL, $url);

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($curl, CURLOPT_POST, true);

        curl_setopt($curl, CURLOPT_POSTFIELDS, $dataArray[$i]);

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//取消SSL鉴权验证

最后这个取消SSL鉴权验证是必须的,否则会报错!

$result = curl_exec($ch);

//var_dump($result);

$json = iconv("gb2312", "UTF-8", $result);//返回格式是中文GBK编码,需要转为UTF8

输出$json则可以看到返回结果。

但是上述过程仅仅实现了一条记录的相似度匹配,怎么实现多条呢?使用循环???NO!NO!NO!自己去测试一下如果同时10条url请求,会发生什么事情。好吧答案是:结果正确返回。。但是返回时间非常慢,因为10条请求是顺序执行的,不会并行。所以下面的问题就是要解决并行问题。

四、           解决并行问题以及QPS并发问题

说一个大家都知道的不好的消息,就是PHP本身是不支持多线程的。有木有想死的感觉??

再说一个好消息,curl是可以并行处理多个url请求来模拟多线程的,这点非常好,啪啪!30条url请求同时发送,最终时间取决于最慢的那个请求。但是这个结果也非常棒了好不好。

下面是先是代码(我做了20条数据(文字内容都是一样的,其实一不一样无所谓)):

<?php

header(‘content-type:text/html;charset=utf8‘);

$localtime=date(‘y-m-d H:i:s‘,time());

echo "开始时间:".$localtime;

$access_token = "24.a810b4be2b5*******************507883636.282335-10044457";

$url = "https://aip.baidubce.com/rpc/2.0/nlp/v2/simnet?access_token=" . $access_token;

$body=array(

    "text_1"=>"我在二舍B门口看到一床被子,应该是哪位同学忘记收走了,记得来取哦。",

    "text_2"=>"信息A门口有一辆自行车,黄色的,没上锁,请失主前去认领。"

);

$json_data=json_encode($body);

$dataArray=array();

for($i=0;$i<160;$i++){

    array_push($dataArray,$json_data);

}

$jsonResultArray=array();

mFunction($url,$dataArray,$jsonResultArray);

/*$jsonResultArray=func($url,$json_data);//存储返回的json数组*/

function mFunction($url,$dataArray,&$jsonResultArray){

    $multicurl=curl_multi_init();

    $curls=array();//存放所有的ch对象

    for($i=0;$i<count($dataArray);$i++){

        $curl=curl_init();

        curl_setopt($curl, CURLOPT_URL, $url);

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($curl, CURLOPT_POST, true);

        curl_setopt($curl, CURLOPT_POSTFIELDS, $dataArray[$i]);

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//取消SSL鉴权验证

        curl_multi_add_handle($multicurl,$curl);

        array_push($curls,$curl);

    }

/*    $running = null;

    do {

        $mrc = curl_multi_exec($multicurl, $running);

    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

    while ($running && $mrc == CURLM_OK) {

        if (curl_multi_select($multicurl) != -1) {//$mh批处理中还有可执行的$ch句柄,curl_multi_select($mh) != -1程序退出阻塞状态。

            do {                   //继续执行需要处理的$ch句柄。

                $mrc = curl_multi_exec($multicurl, $running);

            } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        }

    }*/

    $running = null;

// 执行批处理句柄

    do {

        usleep(10000);

        curl_multi_exec($multicurl, $running);

    } while ($running > 0);

    $failArray=array();

    for($i=0;$i<count($dataArray);$i++){

        $temp=iconv("gb2312", "UTF-8", curl_multi_getcontent($curls[$i]));//得到的是返回结果的json格式字符串

        $resultarray=json_decode($temp);//得到一个数组

        if(array_key_exists("error_msg",$resultarray)){//出错则重新发送请求,最后得到的结果要赋值给temp

            array_push($failArray,$dataArray[$i]);

            curl_multi_remove_handle($multicurl, $curls[$i]);

        }else{

            array_push($jsonResultArray,$temp);

            curl_multi_remove_handle($multicurl, $curls[$i]);

        }

    }

    if($failArray!=null){//如果$failArray数组不为空,继续调用func()

        curl_multi_close($multicurl);

        mFunction($url,$failArray,$jsonResultArray);//$url,$json_data,&$jsonResultArray

    }else{//如果$failArray数组为空,return 即可退出函数。

        curl_multi_close($multicurl);

        return;

    }

}

for($i=0;$i<count($jsonResultArray);$i++){

    var_dump($jsonResultArray[$i]);

}

$localtime=date(‘y-m-d H:i:s‘,time());

echo "结束时间:".$localtime;

上面这段代码,没错就是全部代码都贴出来了,注释也可以看。代码中一道都把并发带来的问题都解决了。

curl_multi_init();  的用法不多说,上网查到处都是,可以去菜鸟教程看。下面说一说处理QPS的问题。

因为并行提交速度太快,服务器容易达到QPS限制,就会返回错误代码:

  1. ‘{"error_msg":"Open api qps request limit reached","error_code":18}‘ (length=66)

没什么好的解决方式,要想免费使用,我的方案是,对返回结果检测是否存在error_msg只要存在,就得重新发送请求。返回结果正常呢,就把返回结果现存人数组中。在处理重新发送请求部分,使用了函数迭代,直到没有错误信息才结束调用。最终所有的正确结果都存在数组中了。

五、           测试结果

经测试:

测试数据条目以及对应的响应时间,从结果来看,还是可以接受的。

/*

 * 20条=>1s

 *

 *40条=>3s

 *

 * 80条=>7s

 *

 * 160条=>16s

 * */

文章是昨晚上熬夜写的,没想到学校突然断网断电,断电不可怕,重要的是电没了,手机移动网络也跟着消失……消失……失……

早上起来重新发喽~

时间: 2024-11-05 02:36:47

百度AI开放平台- API实战调用的相关文章

百度AI开放平台,共建AI生态

2016年,百度开始把积累多年的人工智能技术全面对外开放,从底端智能云,中间百度大脑,到顶层的DuerOS,百度打造整体人工智能开放生态,旨在帮助企业.业界能够更快速的使用.应用人工智能的技术去发展,为人类带来更好的生活.在此背景下,为了更加全面的了解百度AI开放平台及AI生态,将由百度AI技术生态部产品负责人刘倩为大家介绍百度在人工智能开放平台与开放生态方面的思考.进展以及沉淀. 以下为刘倩老师演讲实录 百度AI开放生态战略的中流砥柱---百度大脑 百度AI开放生态是从底端智能云,中间百度大脑

基于百度AI开放平台的人脸识别及语音合成

基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜值等信息,将信息返回到Web界面进行显示. (2)人脸比对 在Web界面上传两张人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口比对照片信息,返回相似度. (3)语音识别 在Web页面上传语音文件,判断语音文件格式,如果不是wav格式进行转码处理,然后调用平台接口进行识别,

百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统

这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前国内做AI的,应该就算百度比较超前了. 于是就开始研究吧. 百度AI的网址http://ai.baidu.com/    然后就看百度的UNIT的文档    地址参见 https://ai.baidu.com/docs#/UNIT-v2-download/top UNIT机器人对话API文档.里面的

浅谈开放平台API接口调用频率控制系统设计

www.qdmm.com/BookReader/1391649,62631917.aspx www.qdmm.com/BookReader/1391649,62631988.aspx www.qdmm.com/BookReader/1391649,62632029.aspx www.qdmm.com/BookReader/1391649,62632094.aspx www.qdmm.com/BookReader/1391649,62632135.aspx www.qdmm.com/BookRea

百度语音识别开放平台SDK使用方法

百度Android语音识别SDK分在线与离线两种,这篇文章介绍在线SDK的使用方法. 在线SDK是以JAR包和动态链接库形式发布和使用,可以从百度开放云平台网站中下载SDK及使用说明文档. http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/voice 完成语音SDK的集成分以下几步,本文将一步步介绍SDK集成方法. 1.注册开放开放平台 点击管理控制台,选择移动应用管理 选择创建应用,填写应用名称     可以看到右

新浪微博开放平台API

关于新浪微博开放平台有很多问题,网上文档写的不是很清楚,授权机制把我给难住了 不清楚怎么回事一直报没有权限 EMAIL给开发人员也没回应 偶然尝试到一个方法  States返回了成功 如下代码: 1.在head 引用 <meta property="wb:webmaster" content="8998f19501c5a01c" /> <script src=" http://tjs.sjs.sinajs.cn/open/api/js/w

2018虹软视觉AI开放平台开发者大赛,助力开发者梦想起航

过去,人们因为出门忘带钥匙而烦恼,因为排队检票人山人海而焦灼-- 自从有了人脸识别算法赋能,出门不用再带钥匙,排队实时人证核验检票--刷脸轻松畅行. 对于人脸识别黑科技感兴趣的你是不是也跃跃欲试呢? 现在机会来了,2018虹软AI开放平台开发者大赛9月30日正式上线,不用等待 "1024,智见未来"虹软视觉人工智能开放平台开发者大赛是一个面向全球开发者,致力于汇集AI产业生态资源,为广大开发者和AI从业人员提供实践创新平台的技术比赛. 虹软希望通过提供这样一片沃土,推动视觉人工智能前沿

腾讯AI开放平台使用

一.腾讯AI开放平台 https://ai.qq.com/ 二.腾讯AI平台支持的功能 三.签名机制 1.计算步骤 用于计算签名的参数在不同接口之间会有差异,但算法过程固定如下4个步骤. 1.将<key, value>请求参数对按key进行字典升序排序,得到有序的参数对列表N 2.将列表N中的参数对按URL键值对的格式拼接成字符串,得到字符串T(如:key1=value1&key2=value2),URL键值拼接过程value部分需要URL编码,URL编码算法用大写字母,例如%E8,而

java通过百度AI开发平台提取身份证图片中的文字信息

废话不多说,直接上代码... IdCardDemo.java 1 package com.wulss.baidubce; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.net.HttpURLConnection; 6 import java.net.URL; 7 import java.net.URLEncoder; 8 import java.util.Map; 9 10