自動識別地址省市區、手機號、姓名,仿淘寶的地址自動識別


  由於公司軟件需求,需要將一段字符串進行解析出省、市、區、街道、詳細地址、手機、姓名。類似淘寶的地址自動識別,研究了一個下午加一個上午,換了好多種算法。

  • 手機號
    這個不難,將字符串用特定的符號分割,如:英文逗號、中文逗號、空格
    分割出來的數組進行字數統計,找到11位字符且可以轉換為數字的就是手機號,當然不嫌麻煩也可以用正則
  • 姓名
    這個不簡單,如果輸入的都是正常的姓名那也簡單,做一個百家姓的數據表。匹配第一個字,且字數不要超過4個。中國4個字的姓名真的不多。
    但現在地址里寫的可能都不會是真實姓名,且超過5個字的昵稱,那就麻煩了。
    所以現在用的就是長度對比,數組里長度最長的當作地址來解析,排去手機號,剩下的當作姓名。(暫時沒有想到更好的方法)
  • 地址
    真的走了好多彎路
  1. 省市區分割
    這個思路是最早的思路一串字符串用省市區去分割,顯然對正規的地址是有效的。但如果"浙江寧波海曙",這樣就找不到了。
    失敗!
  2. 模糊查詢(統計法)
    既然地址里的省市區都可能不全,那我就用模糊查詢,然后查詢到的數據存入數組,且做次數統計。
    如地址是:河南鄭州100號100幢
    先搜索“河”,如圖

    總計1600多條匹配信息,OK!加入數組下一步
    搜索“河南”,如圖:
    總計32條信息,數組里都存在,那次數+1
    接着搜“河南鄭”,結果0條數據。
    如果數據是0,那就從前面刪除一位接着搜
    搜索“南鄭”,如圖:

    1條數據,好加入數組。
    然后查看數組發現統計出來次數是2的有32條,還是確定不了。
    失敗!

  3.  模糊查詢(概率法)
    再加改造,上面的思路是沒有錯的,就是要去查詢數據匹配出最優的選擇,那該怎么辦呢
    如 “河南”,數據庫存儲的“河南省”,3個字對了2個,那就是66%的正確率
    如 “河南”,數據庫存儲的“河南岸街道”(一個廣東惠州的街道),5個字對了2個,那就是66%的正確率40%
    ok,這樣就區分開來了,按照每個詞語的正確率去排序
    但是!字數一樣的呢?“河南鄉“(中國,四川省,雅安市,漢源縣,河南鄉),正確率也是一樣的66%
    這就真的區分不開了,誰都不知道用戶指的河南是哪一個

  4.  模糊查詢(概率最終版)
    “北京” 對應數據庫的 “北京” 正確率是100%
    “北京” 對應數據庫的 “北京市” 正確率是66%
    是不是區分不開客戶到底是要哪一個地址呢?
    這還是和字數有關系,所以還要升級
    “呼和浩特市”對應數據庫“呼和浩特市”正確率是100%
    這個正確率和北京的100%正確率一樣,這就不對了,比較呼和浩特市這個已經是100%確定了,北京還是沒有100%確定到底是 省 還是 市(代碼中需要區分)
    升級版出來了就是概率之后再加上一個正確的字數
    “呼和浩特市”對應數據庫“呼和浩特市”正確率是100%+正確字數5=105%正確率
    “北京” 對應數據庫的 “北京” 正確率是100%+正確字數2=102%正確率
 int GetProbability(string str1, string str2)
{
            decimal fm = str1.Length;
            str1 = str1.Replace(str2, "");
            decimal fz = fm - str1.Length;
            return (int)Math.Floor(fz / fm * 100) + (int)fz;
}

這樣的正確率計算就沒什么大問題了,接下來就是處理。篩選出來的 省市區街道,進行篩選,確定最終結果了,下面都是 if else 的判斷。
總計代碼量寫了300多行沒有優化,因為全是if else,可以寫遞歸或者循環省代碼的,但是頭太疼了就不寫了。

下面放一下效果圖

  1. 正常地址 
  2. 順序隨便換 
  3. 空格分割 
  4. 中文逗號分割 
  5. 不寫省市只寫區 

  6. 只寫街道 

     

  7. 簡短的地址測試 

有不懂的可以加我  QQ1124391467


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM