自動識別地址省市區、手機號、姓名,淘寶的地址自動識別
阿新 • • 發佈:2019-01-24
模糊 軟件 class 詳細 是不是 下午 true 統計 pan
由於公司軟件需求,需要將一段字符串進行解析出省、市、區、街道、詳細地址、手機、姓名。類似淘寶的地址自動識別,研究了一個下午加一個上午,換了好多種算法。
- 手機號
這個不難,將字符串用特定的符號分割,如:英文逗號、中文逗號、空格
分割出來的數組進行字數統計,找到11位字符且可以轉換為數字的就是手機號,當然不嫌麻煩也可以用正則 - 姓名
這個不簡單,如果輸入的都是正常的姓名那也簡單,做一個百家姓的數據表。匹配第一個字,且字數不要超過4個。中國4個字的姓名真的不多。
但現在地址裏寫的可能都不會是真實姓名,且超過5個字的昵稱,那就麻煩了。
所以現在用的就是長度對比,數組裏長度最長的當作地址來解析,排去手機號,剩下的當作姓名。(暫時沒有想到更好的方法) - 地址
真的走了好多彎路
- 省市區分割
這個思路是最早的思路一串字符串用省市區去分割,顯然對正規的地址是有效的。但我如果"浙江寧波海曙",這樣就找不到了。
失敗! - 模糊查詢(統計法)
既然地址裏的省市區都可能不全,那我就用模糊查詢,然後查詢到的數據存入數組,且做次數統計。
如地址是:河南鄭州100號100幢
先搜索“河”,如圖
總計1600多條匹配信息,OK!加入數組下一步
搜索“河南”,如圖:
總計32條信息,數組裏都存在,那次數+1
接著搜“河南鄭”,結果0條數據。
如果數據是0,那就從前面刪除一位接著搜
搜索“南鄭”,如圖:1條數據,好加入數組。
然後查看數組發現統計出來次數是2的有32條,還是確定不了。
失敗! -
模糊查詢(概率法)
再加改造,上面的思路是沒有錯的,就是要去查詢數據匹配出最優的選擇,那該怎麽辦呢
如 “河南”,數據庫存儲的“河南省”,3個字對了2個,那就是66%的正確率
如 “河南”,數據庫存儲的“河南岸街道”(一個廣東惠州的街道),5個字對了2個,那就是66%的正確率40%
ok,這樣就區分開來了,按照每個詞語的正確率去排序
但是!字數一樣的呢?“河南鄉“(中國,四川省,雅安市,漢源縣,河南鄉),正確率也是一樣的66%
這就真的區分不開了,誰都不知道用戶指的河南是哪一個 - 模糊查詢(概率最終版)
“北京” 對應數據庫的 “北京” 正確率是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,可以寫遞歸或者循環省代碼的,但是頭太疼了就不寫了。
下面放一下效果圖
- 正常地址
- 順序隨便換
- 空格分割
- 中文逗號分割
- 不寫省市只寫區
- 只寫街道
- 簡短的地址測試
有不懂的可以加我 QQ1124391467
自動識別地址省市區、手機號、姓名,淘寶的地址自動識別