百度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限制,就会返回错误代码:
- '{"error_msg":"Open api qps request limit reached","error_code":18}' (length=66)
没什么好的解决方式,要想免费使用,我的方案是,对返回结果检测是否存在error_msg只要存在,就得重新发送请求。返回结果正常呢,就把返回结果现存人数组中。在处理重新发送请求部分,使用了函数迭代,直到没有错误信息才结束调用。最终所有的正确结果都存在数组中了。
五、 测试结果
经测试:
测试数据条目以及对应的响应时间,从结果来看,还是可以接受的。
/* * 20条=>1s * *40条=>3s * * 80条=>7s * * 160条=>16s * */
文章是昨晚上熬夜写的,没想到学校突然断网断电,断电不可怕,重要的是电没了,手机移动网络也跟着消失……消失……失……
早上起来重新发喽~
欢迎关注微信公众号“ **IT客**“ ,投稿邮箱 itkeyy@163.com
百度AI开放平台- API实战调用的更多相关文章
- 百度AI开放平台,语音识别,语音合成以及短文本相似度
百度AI开放平台:https://ai.baidu.com/ 语音合成 from aip import AipSpeech APP_ID=" #'你的 App ID' API_KEY=&qu ...
- selenium自动化 | 借助百度AI开放平台识别验证码登录职教云
#通过借助百度AI开放平台识别验证码登录职教云 from PIL import Image from aip import AipOcr import unittest # driver.get(zj ...
- 基于百度AI开放平台的人脸识别及语音合成
基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜 ...
- 微信小程序,天气预报(百度地图开放平台API)
小程序看似一种全新的东西,但好在基本上就是曾经HTML,CSS,JS的一个微变版本. 语法和之前一样.只是一些用法和名字(标签)发生了一些变化. 小程序主要就四种扩展名的文件:js,json,wxml ...
- 腾讯AI开放平台的接口调用指南
最近无意发现腾讯AI开放平台上提供了大量好玩的人工智能云服务,而且是完全免费的.只需要用QQ号登录即可.这么好的东西,作为一个程序员,当然要试试了! 从上图可以看出腾讯AI开放平台提供的人工智能服务主 ...
- 百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统
这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前 ...
- 百度AI开放平台 情感倾向分析实例以及gbk编码解决
f=open('test.txt','a+',encoding='utf-8') for index,row in cxzg.iterrows(): text=str(row['text']) tex ...
- 腾讯AI开放平台的使用
一.腾讯AI开放平台 https://ai.qq.com/ 二.腾讯AI平台支持的功能 三.签名机制 1.计算步骤 用于计算签名的参数在不同接口之间会有差异,但算法过程固定如下4个步骤. 1.将< ...
- java通过百度AI开发平台提取身份证图片中的文字信息
废话不多说,直接上代码... IdCardDemo.java package com.wulss.baidubce; import java.io.BufferedReader; import jav ...
随机推荐
- HDU6055 Regular polygon(计算几何)
Description On a two-dimensional plane, give you n integer points. Your task is to figure out how ma ...
- solr排序问题
搜搜引擎排序问题,因为涉及到的维度比较多,有时候单纯的依靠sort是无法满足需要的,例如:搜索商品的时候我希望不管怎么排无货的商品都置底,这样问题就来了,怎么排? 其实,solr是自己的解决 ...
- linux 两个查找工具 locate,find详解
linux 中有很多查找工具,今天主要讲解locate,find两个工具. 1.locate (1)查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db 注意:如果这 ...
- linux下访问windows的共享
linux下,要访问windows的共享,有好几种情况,下面进行总结. 外面的文章,有点介绍需要使用samba,有点说什么都不需要,只需要mount加上参数, 功能是实现,不过原理,还是不太明白,我发 ...
- MySQL binlog相关分析
1.redolog.binlog的简单分析 图解:redolog和binlog机制 2.开启binlog及关注点 3.关注binlog的相关参数 4.binlog模式分析 5.关于binlog的使用 ...
- Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页
本博客介绍基于Spring Data这款orm框架加上Jquery.pagination插件实现的分页功能. 介绍一下Spring Data框架 spring Data : Spring 的一个子项目 ...
- 程序员/PM怎么让项目预估的时间更加准确
项目时间的估算对项目的成败至关重要.项目时间管理包括了项目按时完成所需的各个过程.但是,在实际项目中,经常出现项目延期,估算严重不准确的现象. 一个我曾经共事过的很有经验的项目经理曾宣称说,他会拿程序 ...
- 复杂JSON反序列化为类对象
有3种常用的反序列化库,gson和fastjson都很棒,json-lib有很大的局限性不推荐使用! 1. net.sf.json(json-lib) 只能用于解析简单的JSON,稍微复杂点的例如,类 ...
- Spring(二)之配置.md
依赖配置详解 bean的属性及构造器参数既可以引用容器中的其他bean,也可以是内联(inline)bean.在spring的XML配置中使用 直接变量(基本类型.Strings类型等.) <v ...
- ArrayList和CopyOnWriteArrayList
这篇文章的目的如下: 了解一下ArrayList的增删改查实现原理 看看为什么说ArrayList查询快而增删慢? CopyOnWriteArrayList为什么并发安全且性能比Vector好 1. ...