技術男的春天:小姐姐求助&暖男分析
highlight: a11y-dark theme: Chinese-red
時光荏苒,這個故事發生在4年前,那時候我頭髮可真厚。
小姐姐求助
友圈一位要做畢設的小姐姐在求助postman怎麼用,我就幫她解答了一下。
我知道她並非計算機相關專業,所以很奇怪為什麼要用postman。
原來她的畢設是要基於微博上最近10年關於房價的話題數據,來做分析,做未來房價的走勢預測,訓練模型。
她經過一番調研之後決定用某平台的「語言處理技術」,實現基礎數據的語義分析,即:情感極性分類結果,0負向、1中性、2正向。
官方提供的是基於postman的演示demo,雖然對咱們專業人士來講很簡答,但是對學文科的小姐姐還是有一定門檻的。
我教會小姐姐怎麼用postman之後,問了她一個問題:
靈魂一問
你雖然知道了postman怎麼用,能查詢每條數據的語義分析結果。
但是微博關於房價的數據有幾十萬條,你總不能用postman一條一條來操作吧!?
小姐姐蒙了
技術男的春天
我告訴小姐姐不用擔心,可以用編程輕鬆解決,比如Go、Python、Java、PHP都是可以的。
但是溝通下來發現小姐姐對編程並不感冒,雖然之前有學過,但是短時間內實現需求恐怕很困難。
是時候展示真正的技術了:
於是,我幫她搭建了基於某平台AI開放平台的批量語義識別的系統,也算進行了某平台【語言處理技術】的開箱測試。
暖男分析
考慮到小姐姐並不是很懂編程,所以要以最簡單的方式來實現需求:
-
儘量減少代碼,能使用工具軟件的儘量使用工具軟件。
-
開發語言使用簡單易學的PHP
-
數據庫工具使用開箱即用的Navicat
-
開發環境使用一鍵安裝工具「LNMP一鍵安裝包」
(別問我為啥沒用Go,畢竟這個故事起碼3年前,哈哈哈)
説幹就幹,馬上開始搞
搞定數據源
小姐姐已經通過某寶拿到了20W+關於房價的微博數據,現在需要做的就是基於語義分析來獲得這20W+數據集對房價走勢的判斷。
小姐姐也是思路廣啊~
- 首先根據數據源和某平台語義接口返回結果,設計MySql表結構。
- 考慮到數據有20萬+,利用了mysql的可視化工具[Navicat]導入數據,也方便小姐姐操作。
注意:要做好表格源字段和目標字段的匹配
- 首次導入選擇直接追加;後續優化模型重複導入數據時選擇更新。
- 點擊開始即可導入Excel源數據到mysql數據庫中
- 導入完成,在Navicat控制枱通過查詢命令,共查詢到231007條數據
搭建開發環境
考慮到小姐姐最終目的是訓練模型,而非學習編程,所以搭建開發環境就怎麼簡單怎麼來了。
所以我就推薦她使用「LNMP一鍵安裝包」,10幾分鐘左右就把LNMP環境搭建好了
敲代碼
腳本關鍵代碼及思路:
字段説明:
mysql語句中 liuXX 是數據庫名 semantic_analysis是表名
代碼設計思路:
使用do while循環,批量循環請求某平台AI語義分析接口,查詢positive_prob=0的數據(即未進行語義分析的數據)。
當查詢不到數據時,説明所有數據已經成功請求某平台語義分析接口,且將返回結果更新到數據表中。
注意問題:
每次查詢之後都會休眠1秒,因為免費版的某平台語義分析接口有QPS限制,避免出現無效請求
實現流程
查詢數據:
-
查詢條件是 positive_prob=0(代表本條數據未請求某平台接口)
-
查詢排序: 根據id倒序
-
查詢翻頁: 每次查詢10條
處理數據,請求某平台接口:
- 將查詢到的數據進行json_encode()處理,進而請求某平台接口
處理某平台返回結果
-
異常處理:當某平台返回的error_code為282131時,表示文本內容過長,超過了某平台語義分析的字數限制。
-
mysql會將不符合某平台語義分析的數據源刪除,不再重複請求
-
輸出返回結果,方便查詢信息,定位問題
將返回結果更新到數據表中
-
當某平台的返回結果 positive_prob 字段的值不為0時,表示語義分析成功,已返回結果
-
將返回的結果更新到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,更不用管什麼框架。
“黑貓白貓,能抓耗子才是好貓”,“這個語言好,那個框架土,能幫你解決問題才是好工具。”
延伸
這篇文章也算迴應一下最近有意和我討論語言高下、框架優劣的朋友。
我確實無意在這類事情上花時間。
想起了“霍元甲”説的一句話:天下武功沒有高下之分,只是習武之人有強弱之別。
一起學習
我們搞了一個有門檻的技術交流羣,歡迎加入我們一起學習:
微信號:wangzhongyang1993
公眾號:程序員升職加薪之旅
B站視頻:王中陽Go
- Go異步任務處理解決方案:Asynq
- 一天約了4個面試,覆盤一下面試題和薪資福利
- 世界上最健康的程序員作息表!「值得一看」
- 8千字詳解Go1.20穩定版
- 不愧是微軟出品的工具,逆天!
- 【視頻 源碼】登錄鑑權的三種方式:token、jwt、session實戰分享
- 程序員副業接單做私活避坑指南
- Git操作不規範,戰友提刀來相見!
- 【簡歷優化】如何寫好項目的亮點難點?項目經歷怎麼寫最好?
- 技術男的春天:小姐姐求助&暖男分析
- 【簡歷優化】如何在簡歷中最大化體現出自己的學習能力?
- 如何快速學一門新語言?關鍵問題是什麼?
- Go WEB進階實戰:GoFrame結合電商項目深入理解Go知識點
- Go容易搞錯的知識點彙總
- 開發gRPC總共分三步
- 【答讀者問】把Go基礎學完後,是學web方向還是區塊鏈方向?
- Go WEB進階實戰:基於GoFrame搭建的電商前後台API系統
- 給想轉Go或者Go進階同學的一些建議
- 聽了大佬們的直播,我決定卷掘金小冊了。| Flag永不倒
- 爆肝兩千字整理《Go學習路線圖》| 文末投稿送投影