首先说一下项目需求。

两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有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条数据(文字内容都是一样的,其实一不一样无所谓)):

<?phpheader('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)){//出错则重新发送请求,最后得到的结果要赋值给temparray_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* */

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

早上起来重新发喽~

百度AI开放平台- API实战调用相关推荐

  1. Java调用百度AI开放平台API

    百度AI开放平台 百度AI开放平台是全球领先的人工智能服务平台,面向开发者及企业开放120多项全球领先的AI能力和软硬一体组件,并提供 EasyDL定制化训练平台.对话系统开发平台UNIT.自定义模板 ...

  2. 【百度智能云】教程:连接百度ai开放平台api接口并完成语音识别的任务

    前言与介绍 本文章介绍了如何在Pycharm上用python语言简单的对连接百度ai开放平台的语音识别功能api端口的调用,并在代码里实现了现录音识别内容. 平台与相关工具 windows10.Pyc ...

  3. 百度AI开放平台在线体验及API接口调用(python)

    写在前面 百度AI开放平台将目前已有的深度学习和人工智能的项目成果做了一个集成,并供用户体验和开发者调用. 在线体验 图像技术 色情识别 人像分割 图像无损放大 图像风格转换 文字识别 车牌识别 文字 ...

  4. 如何正确调用百度AI开放平台的API进行图像识别

    一.注册一个百度账号 二.点击下方链接使用百度账号登录百度智能云 百度智能云登录地址:https://login.bce.baidu.com/ 三.进入百度智能云个人中心,找到图像识别 四.点击创建图 ...

  5. python api调用百度ai平台_百度ai开放平台使用方法(附带详细案例步骤)

    百度ai开放平台 1.百度ai开放平台内有众多功能,如文字识别,语音技术等等内容,本文章以身份证识别为例子,教大家怎么使用它啦 链接走起:https://cloud.baidu.com/?from=c ...

  6. AI导论-调用百度AI开放平台进行图象识别

    0. 百度AI开放平台使用步骤 https://www.cnblogs.com/ghgxj/p/14219117.html 1 建立连接与对象 # https://ai.baidu.com/ai-do ...

  7. java 百度账号注册界面_基于百度AI开放平台的人脸识别的注册登录(1)

    百度ai开放平台首页 2.选择产品服务,人脸与人体识别,人脸识别选项.打开后如图所示 人脸识别 3.点击立即使用 3.jpg 4.点击创捷应用 创建应用 这一页大家按自己需求填写即可 5.创建完成后点 ...

  8. 图像识别教程(百度AI开放平台)

    百度AI开放平台 官网准备 网址 百度AI开放平台:http://ai.baidu.com/ 登录/注册 没有注册过百度账号可以先去注册一个. 打开控制台 选择图像识别 创建应用 正确填写 得到对应A ...

  9. 票据识别android代码,Android 百度AI开放平台-文字识别-财务票据文字识别

    简单记录一下今天关于百度AI开放平台-文字识别-财务票据文字识别的实现过程 文字识别有对应的Android SDK集成及相关Demo,文档地址如下图: SDK目录图.png 但是SDK中的返回数据字段 ...

  10. 利用百度AI开放平台的语言处理基础技术(Python)

    百度AI开放平台是一个年轻的平台,2017年1月发布了词法分析,评论观点对抽取,短文本相似度等5种基础技术接口. 本篇文章使用python接入百度AI评论观点对抽取的接口,进行酒店评论文本数据的观点对 ...

最新文章

  1. WinForm导出文件,你懂的……
  2. zzuli 2525: 咕咕的搜索序列
  3. Git 常用命令及讲解(不断更新)
  4. [Java] 蓝桥杯ADV-193 算法提高 盾神与条状项链
  5. 服务器的作用及用途,服务器的作用和用途是什么
  6. oracle+11g+32位数据库能导入到64位么,Oracle 11G数据库导出问题解决
  7. 亮相云栖:这些被Gartner点名的2020年安全风向
  8. python help 函数_python怎么用help函数
  9. 【图书馆】——中英文对照表
  10. 【转】教你如何用手机连接电脑上网
  11. 什么是嵌入式操作系统?
  12. python乒乓球比赛规则介绍_乒乓球比赛规则介绍(上中下)
  13. ES2015部分新特性示例
  14. Word2Vec 源码
  15. c语言的浪漫,c语言浪漫情话
  16. python中的lambda函数
  17. Scala学习(一) 快速入门
  18. 用c语言写出冒泡排序
  19. python用户登录a_Python入门案例-用户注册和登录
  20. 服务器无响应 路由器,服务器无响应路由器

热门文章

  1. Android开发笔记(一百八十三)利用HMS轻松扫描二维码
  2. c# 小票打印机打条形码_C# Code 128条形码打印的问题
  3. html如何生成条形码,使用jsbarcode生成条形码
  4. Solidworks与Matlab联合仿真SimMechnics下载及安装
  5. Java - ip2region - 使用篇
  6. 举例 微积分 拉格朗日方程_(完整word版)拉格朗日方程的应用及举例08讲
  7. MSProject的使用教程
  8. 计算机工程师难度排名,【2018一级造价工程师考试各个科目的难度排行榜】- 环球网校...
  9. 计算机维修技师论文,2016年电工技师论文范文10篇
  10. ARM上移植ser2net源码