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

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

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

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

上一篇:Android-Kotlin-枚举enum


下一篇:从安装Mac OS X虚拟机到第一个IOS程序