手把手教你使用百度大腦地址識別API
作者:讓天涯
最近筆者在某小程式上購物時發現,不管公司大小、客戶多少,凡是涉及到電商基本上都有自己的下單系統,業務十分成熟。想到各家快遞公司,都有獨立的下單平臺,出於好奇筆者在網上搜索了下,發現百度大腦竟然有地址識別介面,趕緊來試一波。測試後發現,這個介面能大幅提升地址文字的處理效率,非常適合物流、快遞、電商、貿易行業,有了它就可以自己搭建快遞下單平臺了。
一、 百度大腦地址識別的功能和亮點
通過百度大腦地址識別產品頁面上的介紹,筆者羅列了這個介面的一些功能點和亮點:
1.針對快遞、電商行業客戶線上提交的大量非結構化地址單據,該介面可以幫助提取單據中的姓名、電話、地址資訊;
2. 融合百度地圖權威資料,自動補全地址中缺失的資訊和錯誤糾正,地址資訊的識別準召率可達到88%;
3. 融合詞法分析技術,自動識別文字中的人名和電話資訊,識別準確率可達97%以上;
4. 基於語義分析構建的智慧演算法與場景策略相配合,平均準召率可達95%。
二、百度大腦地址識別的應用場景
從介面名稱可以瞭解到,地址識別可以用於快遞下單發貨以及電商客戶訂單處理等場景。
三、百度大腦地址識別的使用攻略
接下來一步步帶領大家呼叫地址識別API介面。需要說明的是,[X1]本文采用C# 語言,開發環境為.Net Core 3.1,採用線上API介面方式實現。
(1)平臺接入
登陸 百度智慧雲-管理中心 建立 “自然語言處理”應用,獲取 “API Key ”和 “Secret Key”:
(2)介面文件
文件地址:https://ai.baidu.com/ai-doc/NLP/vk6z52h5n
請求說明
HTTP方法:POST
請求URL:https://aip.baidubce.com/rpc/2.0/nlp/v1/address
URL引數:
Header如下:
Body中放置請求引數,引數詳情如下:
{ "text": "上海市浦東新區納賢路701號百度上海研發中心 F4A000 張三" }
body整體文字內容可以支援GBK和UTF-8兩種格式的編碼。
1、GBK支援:預設按GBK進行編碼,輸入內容為GBK編碼,輸出內容為GBK編碼,否則會介面報錯編碼錯誤
2、UTF-8支援:若文字需要使用UTF-8編碼,請在url引數中新增charset=UTF-8 (大小寫敏感) 例如 https://aip.baidubce.com/rpc/2.0/nlp/v1/lexer?charset=UTF-8&access_token=24.f9ba9c5241b67688bb4adbed8bc91dec.2592000.1485570332.282335-8574074
請求引數
返回說明
返回引數
返回格式
JSON格式
預設返回內容為GBK編碼
若使用者指定輸入為UTF-8編碼(通過指定charset引數),則返回內容為UTF-8編碼
返回示例:
{ "province": "上海市","city": "上海市","province_code": "310000","log_id": 1420038644986026316,"text": "上海市浦東新區納賢路701號百度上海研發中心 F4A000 張三","town": "張江鎮","phonenum": "","detail": "納賢路701號百度上海研發中心F4A000","county": "浦東新區","person": "張三","town_code": "310115125","county_code": "310115","city_code": "310100" }
(3)原始碼共享
(3-1)根據 API Key 和 Secret Key 獲取 AccessToken
/// /// 獲取百度access_token /// /// API Key /// Secret Key /// public static string GetAccessToken(string clientId,string clientSecret) { string authHost = "https://aip.baidubce.com/oauth/2.0/token"; HttpClient client = new HttpClient(); List paraList = new List(); paraList.Add(new KeyValuePair("grant_type","client_credentials")); paraList.Add(new KeyValuePair("client_id",clientId)); paraList.Add(new KeyValuePair("client_secret",clientSecret)); HttpResponseMessage response = client.PostAsync(authHost,new FormUrlEncodedContent(paraList)).Result; string result = response.Content.ReadAsStringAsync().Result; JObject jo = (JObject)JsonConvert.DeserializeObject(result); string token = jo["access_token"].ToString(); return token; }
(3-2)呼叫API介面獲取識別結果
(3-2-1) 建立Index.cshtml檔案
(3-2-1-1)前臺程式碼:
由於html程式碼無法原生顯示,只能簡單說明一下:
主要是一個form表單,需要設定屬性method="post";
form表單裡面有幾個控制元件:
一個Input:type="file",asp-for="Text" ,輸入地址資訊; 一個Input:type="submit",asp-page-handler="Address" ,提交請求。
(3-2-1-2) 後臺程式碼:
主程式程式碼:
[BindProperty] public string Text { get; set; } public List msg = new List(); public string curPath { get; set; } string NLP_API_KEY="你的API KEY"; string NLP_SECRET_KEY="你的SECRET KEY"; public async Task OnPostAddressAsync() { if (string.IsNullOrEmpty(Text)) { ModelState.AddModelError(string.Empty,"請輸入具體內容!"); } if (!ModelState.IsValid) { return Page(); } msg = new List(); DateTime startTime = DateTime.Now; string result = GetNLPJson(Text,NLP_API_KEY,NLP_SECRET_KEY); DateTime endTime = DateTime.Now; TimeSpan ts = endTime - startTime; JObject jo = (JObject)JsonStringToObj(result); try { msg.Add("地址識別結果(耗時" + ts.TotalSeconds + "秒):\n"); msg.Add("聯絡人"); msg.Add("姓名:" + jo["person"].ToString()); msg.Add("電話號碼:" + jo["phonenum"].ToString()); msg.Add("地址"); msg.Add("省:" + jo["province"].ToString()); msg.Add("市:" + jo["city"].ToString()); msg.Add("區(縣):" + jo["county"].ToString()); msg.Add("街道(鄉/鎮):" + jo["town"].ToString()); msg.Add("詳細地址:" + jo["detail"].ToString()); msg.Add(result); } catch (Exception e) { msg.Add(result); } return Page(); }
其他相關函式:
/// /// 自然語言處理Json字串 /// /// 內容 /// API Key /// Secret Key /// public static string GetNLPJson(string text,string clientId,string clientSecret) { string token = GetAccessToken(clientId,clientSecret); string host = "https://aip.baidubce.com/rpc/2.0/nlp/v1/address?charset=UTF-8&access_token=" + token; Encoding encoding = Encoding.Default; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host); request.Method = "post"; request.ContentType = "application/json"; request.KeepAlive = true; string str = "{\"text\":\"" + text; str += "\"}"; byte[] buffer = encoding.GetBytes(str); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer,buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(),Encoding.UTF8); string result = reader.ReadToEnd(); return result; } /// /// 獲取百度access_token /// /// API Key /// Secret Key /// public static string GetAccessToken(string clientId,new FormUrlEncodedContent(paraList)).Result; string result = response.Content.ReadAsStringAsync().Result; JObject jo = (JObject)JsonConvert.DeserializeObject(result); string token = jo["access_token"].ToString(); return token; } /// /// 生成一個隨機唯一檔名(Guid) /// /// public static string GetRandomName() { return Guid.NewGuid().ToString("N"); } /// /// json轉為物件 /// /// Json字串 /// public static Object JsonStringToObj(string jsonString) { Object s = JsonConvert.DeserializeObject(jsonString); return s; }
四、效果測試
1、頁面:
2、筆者輸入了5個地址,識別結果如下:
2.1
2.2
2.3
2.4
2.5
五、測試結果及建議
從上面的測試結果可以瞭解到,百度大腦地址識別API介面的識別速度基本上能夠在半秒識別出來,並且準確度也不錯,還能自動補齊或糾正地址資訊,很方便。
考慮到百度大腦還有豐富的OCR技術和語音識別技術,在未來可以將文字輸入、語音輸入和圖片輸入考慮在內,做成綜合的地址識別解決方案,方便各大快遞公司或電商企業使用。
不過,聯想到人們對地址、電話資訊保安方面越來越重視,一些企業可以在隱私安全保護這方面下功夫。比如聯合各大商城、快遞公司,搭建統一地址管理平臺,生成唯一的識別碼/二維碼,客戶可以在平臺填寫身份地址資訊,進行實名認證,然後使用唯一的識別碼/二維碼傳送快遞資訊,既方便客戶管理個人地址資訊(不用再在各個平臺去分別更新地址資訊、進行實名認證),又加強了隱私安全保護。
一些個人想法,不過百度大腦地址識別是個可直接用於業務生產的介面,還是十分推薦的(*^▽^*)