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

語言: CN / TW / HK

highlight: a11y-dark theme: Chinese-red


時光荏苒,這個故事發生在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

```

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,更不用管什麼框架。

“黑貓白貓,能抓耗子才是好貓”,“這個語言好,那個框架土,能幫你解決問題才是好工具。”

延伸

這篇文章也算迴應一下最近有意和我討論語言高下、框架優劣的朋友。

我確實無意在這類事情上花時間。

想起了“霍元甲”説的一句話:天下武功沒有高下之分,只是習武之人有強弱之別。

一起學習

我們搞了一個有門檻的技術交流羣,歡迎加入我們一起學習:

image.png

微信號:wangzhongyang1993

公眾號:程序員升職加薪之旅

B站視頻:王中陽Go