手把手教你使用百度大腦地址識別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, 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;
}

四、效果測試

1、頁面:

2、筆者輸入了5個地址,識別結果如下:

2.1

2.2

2.3

2.4

2.5

五、測試結果及建議

從上面的測試結果可以瞭解到,百度大腦地址識別API接口的識別速度基本上能夠在半秒識別出來,並且準確度也不錯,還能自動補齊或糾正地址信息,很方便。

考慮到百度大腦還有豐富的OCR技術和語音識別技術,在未來可以將文本輸入、語音輸入和圖片輸入考慮在內,做成綜合的地址識別解決方案,方便各大快遞公司或電商企業使用。

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章