时光荏苒,这个故事发生在4年前,那时候我头发可真厚。

小姐姐求助

友圈一位要做毕设的小姐姐在求助postman怎样用,我就帮她解答了一下。

我知道她并非计算机相关专业,所以很古怪为什么要用postman。

本来她的毕设是要依据微博上最近10年关于房价的话题数据,来做剖析,做未来房价的走势预测,练习模型。

她通过一番调研之后决议用某渠道的「言语处理技能」,实现根底数据的语义剖析,即:情感极性分类成果,0负向、1中性、2正向。

技术男的春天:小姐姐求助&暖男分析

官方供给的是依据postman的演示demo,尽管对咱们专业人士来讲很简答,可是对学文科的小姐姐还是有必定门槛的。

我教会小姐姐怎样用postman之后,问了她一个问题:

灵魂一问

你尽管知道了postman怎样用,能查询每条数据的语义剖析成果。

可是微博关于房价的数据有几十万条,你总不能用postman一条一条来操作吧!?

小姐姐蒙了

技术男的春天:小姐姐求助&暖男分析

技能男的春天

我告知小姐姐不必忧虑,可以用编程轻松解决,比如Go、Python、Java、PHP都是可以的。

可是沟通下来发现小姐姐对编程并不感冒,尽管之前有学过,可是短时间内实现需求恐怕很困难。

是时候展现真实的技能了:

所以,我帮她搭建了依据某渠道AI开放渠道的批量语义辨认的系统,也算进行了某渠道【言语处理技能】的开箱测试

暖男剖析

考虑到小姐姐并不是很懂编程,所以要以最简略的方式来实现需求:

  1. 尽量削减代码,能运用东西软件的尽量运用东西软件。

  2. 开发言语运用简略易学的PHP

  3. 数据库东西运用开箱即用的Navicat

  4. 开发环境运用一键装置东西「LNMP一键装置包」

(别问我为啥没用Go,毕竟这个故事起码3年前,哈哈哈)

技术男的春天:小姐姐求助&暖男分析

说干就干,马上开端搞

搞定数据源

小姐姐现已通过某宝拿到了20W+关于房价的微博数据,现在需求做的就是依据语义剖析来取得这20W+数据集对房价走势的判断。

小姐姐也是思路广啊~

技术男的春天:小姐姐求助&暖男分析

  1. 首要依据数据源和某渠道语义接口回来成果,规划MySql表结构。

技术男的春天:小姐姐求助&暖男分析

  1. 考虑到数据有20万+,利用了mysql的可视化东西[Navicat]导入数据,也便利小姐姐操作。

技术男的春天:小姐姐求助&暖男分析

技术男的春天:小姐姐求助&暖男分析

技术男的春天:小姐姐求助&暖男分析

留意:要做好表格源字段和目标字段的匹配

技术男的春天:小姐姐求助&暖男分析

  1. 初次导入挑选直接追加;后续优化模型重复导入数据时挑选更新。

技术男的春天:小姐姐求助&暖男分析

  1. 点击开端即可导入Excel源数据到mysql数据库中

技术男的春天:小姐姐求助&暖男分析

  1. 导入完结,在Navicat控制台通过查询指令,共查询到231007条数据

技术男的春天:小姐姐求助&暖男分析

搭建开发环境

考虑到小姐姐最终意图是练习模型,而非学习编程,所以搭建开发环境就怎样简略怎样来了。

所以我就推荐她运用「LNMP一键装置包」,10几分钟左右就把LNMP环境搭建好了

敲代码

脚本关键代码及思路:

字段阐明:

mysql语句中 liuXX 是数据库名 semantic_analysis是表名

代码规划思路:

运用do while循环,批量循环恳求某渠道AI语义剖析接口,查询positive_prob=0的数据(即未进行语义剖析的数据)。

当查询不到数据时,阐明一切数据现已成功恳求某渠道语义剖析接口,且将回来成果更新到数据表中。

留意问题:

每次查询之后都会休眠1秒,因为免费版的某渠道语义剖析接口有QPS约束,防止出现无效恳求

实现流程

查询数据:

  1. 查询条件是 positive_prob=0(代表本条数据未恳求某渠道接口)

  2. 查询排序: 依据id倒序

  3. 查询翻页: 每次查询10条

处理数据,恳求某渠道接口:

  1. 将查询到的数据进行json_encode()处理,从而恳求某渠道接口

处理某渠道回来成果

  1. 异常处理:当某渠道回来的error_code为282131时,表明文本内容过长,超过了某渠道语义剖析的字数约束。

  2. mysql会将不符合某渠道语义剖析的数据源删去,不再重复恳求

  3. 输出回来成果,便利查询信息,定位问题

将回来成果更新到数据表中

  1. 当某渠道的回来成果 positive_prob 字段的值不为0时,表明语义剖析成功,已回来成果

  2. 将回来的成果更新到mysql数据表中

批处理脚本核心文件代码:

文件名:batchProcessing.php

<?php
ini_set('memory_limit', '256M'); //内存管理
include '../include/ConfigLiuxx.php'; //引进数据配置文件
include '../include/Db.php';//引进db数据库
include '../include/Logger.php';//引进log文件
include '../include/Request.php';//引进 http恳求文件
define('Index_table', 'semantic_analysis'); //设置数据表名 语义剖析
$db_liuxx = new Db($db_liuxx); //引进db配置文件
/**
 * 某渠道语义剖析脚本
 */
$access_token = "xxxxxxxxxxx";  //某渠道供给的token
$url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=' . $access_token; //按某渠道要求拼接恳求url
$limit = 10;
$offset = 0;
do {
    $datas = $db_liuxx->get_all('select * from liuxx.semantic_analysis WHERE positive_prob = 0  order by id desc limit ' . $offset . ',' . $limit);
    foreach ($datas as $key => $value) {
        $id = $value['id'];
        $text = $value['text'];
        $params = ['text' => $text];
        $bodys = json_encode($params);
        $response = request_post($url, $bodys);
        $res_data = json_decode($response, true);
        if ($res_data['error_code'] == 282131) {
            $db_liuxx->query('delete from liuxx.semantic_analysis WHERE id = ' . $id);
            var_dump($id . '  文本过长 删去');
        }
        echo 'id:';
        var_dump('某渠道回来:');
        var_dump($res_data);
        $data = [
            'positive_prob' => $res_data['items'][0]['positive_prob'],
            'confidence' => $res_data['items'][0]['confidence'],
            'negative_prob' => $res_data['items'][0]['negative_prob'],
            'sentiment' => $res_data['items'][0]['sentiment'],
            'ctime' => time(),
        ];
        if ($data['positive_prob']) {
            var_dump($data);
            //更新条件
            $condition = 'id = ' . $id;
            $res = $db_liuxx->query('update liuxx.semantic_analysis set positive_prob = ' . $data['positive_prob'] . ', confidence = ' . $data['confidence'] . ', negative_prob = ' . $data['negative_prob'] . ', sentiment = ' . $data['sentiment'] . ' where id = ' . $id);
            var_dump($res);
        } else {
            var_dump('某渠道未回来成果');
        };
    }
    sleep(1);
} while (!empty($datas)); //能查到数据就一直循环
?>
/**
 * 发起http post恳求(REST API), 并获取REST恳求的成果
 * @param string $url
 * @param string $param
 * @return - http response body if succeeds, else false.
 */
function request_post($url = '', $param = '')
{
    if (empty($url) || empty($param)) {
        return false;
    }
    $postUrl = $url;
    $curlPost = $param;
    // 初始化curl
    $curl = curl_init();
    // 抓取指定网页
    curl_setopt($curl, CURLOPT_URL, $postUrl);
    // 设置header
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 要求成果为字符串且输出到屏幕上
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    // post提交方式
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
    // 运转curl
    $data = curl_exec($curl);
    curl_close($curl);
    return $data;
}

履行批处理脚本

nohup:表明脚本生成的log日志和打印信息输出到nohup.log文件中

&:表明脚本后台运转

nohup php batchProcessing.php &

取得成果

脚本运转结束后,即可在mysql中查询到经某渠道语义剖析接口处理过的数据,成果示例如下图:

技术男的春天:小姐姐求助&暖男分析

导出数据

通过Navcat东西,小姐姐就可以便利的将mysql数据成果导出到Excel。

总结

以上操作,花了大概2个小时,成就感爆棚。

技术男的春天:小姐姐求助&暖男分析

当年的总结是:编程真的太有用了,帮了小姐姐大忙,收到了一大波赞,这种精神鼓励和涨工资差不多吧,哈哈哈。

今天的总结是:不论PHP还是Java、GO,更不必管什么结构。

“黑猫白猫,能抓耗子才是好猫”,“这个言语好,那个结构土,能帮你解决问题才是好东西。”

技术男的春天:小姐姐求助&暖男分析

延伸

这篇文章也算回应一下最近有意和我评论言语高低、结构优劣的朋友。

我的确无意在这类事情上花时间。

想起了“霍元甲”说的一句话:天下武功没有高低之分,仅仅习武之人有强弱之别。

一起学习

咱们搞了一个有门槛的技能交流群,欢迎参加咱们一起学习:

技术男的春天:小姐姐求助&暖男分析

微信号:wangzhongyang1993

公众号:程序员升职加薪之旅

B站视频:王中阳Go