1. 程式人生 > WINDOWS開發 >手把手教你使用百度大腦地址識別API

手把手教你使用百度大腦地址識別API

作者:讓天涯

最近筆者在某小程式上購物時發現,不管公司大小、客戶多少,凡是涉及到電商基本上都有自己的下單系統,業務十分成熟。想到各家快遞公司,都有獨立的下單平臺,出於好奇筆者在網上搜索了下,發現百度大腦竟然有地址識別介面,趕緊來試一波。測試後發現,這個介面能大幅提升地址文字的處理效率,非常適合物流、快遞、電商、貿易行業,有了它就可以自己搭建快遞下單平臺了。

一、 百度大腦地址識別的功能和亮點

通過百度大腦地址識別產品頁面上的介紹,筆者羅列了這個介面的一些功能點和亮點:

1.針對快遞、電商行業客戶線上提交的大量非結構化地址單據,該介面可以幫助提取單據中的姓名、電話、地址資訊;

2. 融合百度地圖權威資料,自動補全地址中缺失的資訊和錯誤糾正,地址資訊的識別準召率可達到88%;

3. 融合詞法分析技術,自動識別文字中的人名和電話資訊,識別準確率可達97%以上;

4. 基於語義分析構建的智慧演算法與場景策略相配合,平均準召率可達95%。

二、百度大腦地址識別的應用場景

從介面名稱可以瞭解到,地址識別可以用於快遞下單發貨以及電商客戶訂單處理等場景。

三、百度大腦地址識別的使用攻略

接下來一步步帶領大家呼叫地址識別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兩種格式的編碼。

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技術和語音識別技術,在未來可以將文字輸入、語音輸入和圖片輸入考慮在內,做成綜合的地址識別解決方案,方便各大快遞公司或電商企業使用。

不過,聯想到人們對地址、電話資訊保安方面越來越重視,一些企業可以在隱私安全保護這方面下功夫。比如聯合各大商城、快遞公司,搭建統一地址管理平臺,生成唯一的識別碼/二維碼,客戶可以在平臺填寫身份地址資訊,進行實名認證,然後使用唯一的識別碼/二維碼傳送快遞資訊,既方便客戶管理個人地址資訊(不用再在各個平臺去分別更新地址資訊、進行實名認證),又加強了隱私安全保護。

一些個人想法,不過百度大腦地址識別是個可直接用於業務生產的介面,還是十分推薦的(*^▽^*)