做者:讓天涯html
最近筆者在某小程序上購物時發現,無論公司大小、客戶多少,凡是涉及到電商基本上都有本身的下單系統,業務十分紅熟。想到各家快遞公司,都有獨立的下單平臺,出於好奇筆者在網上搜索了下,發現百度大腦居然有地址識別接口,趕忙來試一波。測試後發現,這個接口能大幅提高地址文本的處理效率,很是適合物流、快遞、電商、貿易行業,有了它就能夠本身搭建快遞下單平臺了。算法
1、 百度大腦地址識別的功能和亮點json
經過百度大腦地址識別產品頁面上的介紹,筆者羅列了這個接口的一些功能點和亮點:小程序
1.針對快遞、電商行業客戶在線提交的大量非結構化地址單據,該接口能夠幫助提取單據中的姓名、電話、地址信息;安全
2. 融合百度地圖權威數據,自動補全地址中缺失的信息和錯誤糾正,地址信息的識別準召率可達到88%;app
3. 融合詞法分析技術,自動識別文本中的人名和電話信息,識別準確率可達97%以上;dom
4. 基於語義分析構建的智能算法與場景策略相配合,平均準召率可達95%。async
2、百度大腦地址識別的應用場景函數
從接口名稱能夠了解到,地址識別能夠用於快遞下單發貨以及電商客戶訂單處理等場景。post
3、百度大腦地址識別的使用攻略
接下來一步步帶領你們調用地址識別API接口。須要說明的是,[X1] 本文采用C# 語言,開發環境爲.Net Core 3.1,採用在線API接口方式實現。
(1)平臺接入
登錄 百度智能雲-管理中心 建立 「天然語言處理」應用,獲取 「API Key 」和 「Secret Key」:https://console.bce.baidu.com/ai/?_=1578390135051&fromai=1#/ai/nlp/app/list
(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兩種格式的編碼。
一、GBK支持:默認按GBK進行編碼,輸入內容爲GBK編碼,輸出內容爲GBK編碼,不然會接口報錯編碼錯誤
二、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, 0, 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, 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; } /// /// 生成一個隨機惟一文件名(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; }
4、效果測試
一、頁面:
二、筆者輸入了5個地址,識別結果以下:
2.1
2.2
2.3
2.4
2.5
5、測試結果及建議
從上面的測試結果能夠了解到,百度大腦地址識別API接口的識別速度基本上可以在半秒識別出來,而且準確度也不錯,還能自動補齊或糾正地址信息,很方便。
考慮到百度大腦還有豐富的OCR技術和語音識別技術,在將來能夠將文本輸入、語音輸入和圖片輸入考慮在內,作成綜合的地址識別解決方案,方便各大快遞公司或電商企業使用。
不過,聯想到人們對地址、電話信息安全方面愈來愈重視,一些企業能夠在隱私安全保護這方面下功夫。好比聯合各大商城、快遞公司,搭建統一地址管理平臺,生成惟一的識別碼/二維碼,客戶能夠在平臺填寫身份地址信息,進行實名認證,而後使用惟一的識別碼/二維碼發送快遞信息,既方便客戶管理我的地址信息(不用再在各個平臺去分別更新地址信息、進行實名認證),又增強了隱私安全保護。
一些我的想法,不過百度大腦地址識別是個可直接用於業務生產的接口,仍是十分推薦的(*^▽^*)