自动识别地址省市区、手机号、姓名,淘宝的地址自动识别

下载地址 

联想应用商店

        由于公司软件需求,需要将一段字符串进行解析出省、市、区、街道、详细地址、手机、姓名。类似淘宝的地址自动识别,研究了一个下午加一个上午,换了好多种算法。

  • 手机号
    这个不难,将字符串用特定的符号分割,如:英文逗号、中文逗号、空格
    分割出来的数组进行字数统计,找到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

下载地址 联想应用商店

要实现地址自动识别省市区,你可以使用第三方的地址库来辅助实现这个功能。一个常用的地址库是element-china-area-data,它提供了中国省市区的数据。 首先,你需要在你的Vue项目中安装element-china-area-data。你可以通过npm安装它: ```bash npm install element-china-area-data ``` 然后,在你的Vue组件中引入并使用该地址库: ```javascript <template> <div> <input v-model="address" placeholder="请输入地址"> <button @click="recognizeAddress">识别地址</button> <div v-if="recognizedAddress"> <p>省份:{{ recognizedAddress.province }}</p> <p>城市:{{ recognizedAddress.city }}</p> <p>区县:{{ recognizedAddress.district }}</p> </div> </div> </template> <script> import areaData from 'element-china-area-data'; export default { data() { return { address: '', recognizedAddress: null }; }, methods: { recognizeAddress() { // 使用正则表达式提取省市区信息 const regex = /(.*?[省市自治区])(.*?[市州盟])(.*?[区县市旗])/; const matches = this.address.match(regex); if (matches && matches.length >= 4) { const province = matches[1]; const city = matches[2]; const district = matches[3]; // 判断省份、城市、区县是否在地址库中存在,如果存在则赋值给recognizedAddress if (areaData[province] && areaData[province][city] && areaData[province][city][district]) { this.recognizedAddress = { province: province, city: city, district: district }; } else { // 地址不符合规范或不存在于地址库中 this.recognizedAddress = null; console.log('地址不符合规范或不存在于地址库中'); } } else { // 地址不符合规范 this.recognizedAddress = null; console.log('地址不符合规范'); } } } }; </script> ``` 在上面的代码中,我们使用了一个输入框和一个识别按钮,当用户输入地址并点击识别按钮时,调用`recognizeAddress`方法来识别地址。我们使用正则表达式提取地址中的省份、城市和区县信息,并在地址库中进行匹配。如果匹配成功,则赋值给`recognizedAddress`变量,在页面上展示相关信息。 请注意,这只是一个简单的示例,你可以根据实际需求进行修改和扩展。另外,element-china-area-data也提供了更详细的数据,你可以根据实际需求使用更多的地址数据来实现更精确的地址识别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值