文本地址智能识别组件(三)

前言

姓名+电话+地址识别,前面的文本地址智能识别组件(一)文本地址智能识别组件(二)可以满足地址识别的基本需求,但是经过不断的测试和真实场景的使用, 发现还是存在一些细节问题, 本着不到黄河心不死呕心沥血的实现了终极版本文本地址智能识别组件(三) . 通过参考快递公司的识别功能, 自己重新写了一下,功夫不负有心人, 终于达到了作者想要的效果.

方案

首先我们仓考之前的思路,通过处理字符串来达到匹配的结果. 电话肯定是可以获取到的, 地址的话, 我们单独去数据库获取
1.匹配需要识别文本中的电话号码
2.假设地址的省市区输入完全正确,我们直接匹配库里面的数据,然后对比省市区的名称,省市区名称前面的就是姓名, 如果姓名在详细地址后面,那就无法识别了
3.地址输入只有两级或者一级, 这种情况就需要多处理几次了, 首先查询省名称, 省名称为空责查询市名称,查询到市名称就根据市名称查询出对应的省名称, 在查询市名称下面的区名称, 然后和文本中的地址比较.
话不多说, 直接放大招

/**
	这是service的实现方法
	text传入参数为需要识别的文本信息
	姓名为匹配到的地址前面一截
*/

@Override
	public Map<String, Object> getTextRecognitionInfo(String text) {
   
		//去除所有标点符号和特殊符号
		String details = text.replaceAll("\\pP|\\pS|\\s+", "").trim();
		Map<String, Object> data = new HashMap<String, Object> ();

		//匹配文本中的电话号码
		String phone = "";
		Pattern phoneReg = Pattern.compile("\\d{7,17}");
		Matcher phoneMatcher = phoneReg.matcher(details);
		while (phoneMatcher.find()) {
   
			phone = phoneMatcher.group();
		}
		phoneReg = Pattern.compile("1[345678]\\d{9}");
		phoneMatcher = phoneReg.matcher(details);
		while(phoneMatcher.find()) {
   
			phone = phoneMatcher.group();
			details = details.replaceFirst(phone, "");
		}
		data.put("phone", phone);
		details = details.replaceFirst(phone, "");

		//直接完整匹配省市区
		RegionDTO region = regionMapper.getMatchingRecognition(details);
		//解析省
		int provinceLength = 0;
		String provinceTemp = "";
		//可以完整匹配出来地址
		if (region != null) {
   
			data.put("region", region);
			String name = details.substring(0, details.indexOf(region.getProvince()));
			data.put("name", name);
			details = details.replaceFirst(name, "");
			data.put("details", details.replaceFirst(region.getProvince()+region.getCity()+region.getCounty(), ""));
			return data;
		} else {
   
			region = new RegionDTO();
			//查询所有的省
			List<KdRegion> provinceList = regionMapper.getRegionListByType(1);
			for (KdRegion province : provinceList) {
   
				String tem;
				if (province.getRegionName().contains("省")) {
   
					tem = province.getRegionName().replace("省","");
				} else if (province.getRegionName().contains("市")) {
   
					tem = province.getRegionName().replace("市","");
				} else if (province.getRegionName().contains("自治区")) {
   
					tem = province.getRegionName().replace("自治区","");
				} else {
   
					tem = province.getRegionName();
				}
				if (details.
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值