feature(地址清洗):地址清洗开发

1. 地址分为3类(单套、楼栋、小区、包含多个楼栋或者单套)
2. 基于联城数库中的路名拆分,保证联城中的路名完全匹配;
3. 联城数库中的小区路名清洗(XX路、XX大道)
This commit is contained in:
purple 2020-08-04 18:49:19 +08:00
parent d552b7da05
commit b80679e94e
9 changed files with 83049 additions and 300 deletions

View File

@ -43,7 +43,7 @@ public class CleanAddress {
* 楼层
* 和地下有关系
*/
private Integer floor;
private String floor;
/**
* 小区地址
*/
@ -67,9 +67,11 @@ public class CleanAddress {
/**
* 多个地址
*/
private List<PartialAddress> addressList;
private List<PartialAddress> addressList = new LinkedList<>();
/**
* 是否包含特殊字符
*/
private Boolean containsSpecialChar;
private static List<String> specialChar = new LinkedList<>();
@ -144,11 +146,11 @@ public class CleanAddress {
this.communityName = communityName;
}
public Integer getFloor() {
public String getFloor() {
return floor;
}
public void setFloor(Integer floor) {
public void setFloor(String floor) {
this.floor = floor;
}
@ -188,8 +190,8 @@ public class CleanAddress {
return addressList;
}
public void setAddressList(List<PartialAddress> addressList) {
this.addressList = addressList;
public void addAddress(PartialAddress partialAddress) {
this.addressList.add(partialAddress);
}
public Boolean getIndependent() {
@ -218,4 +220,24 @@ public class CleanAddress {
return false;
}
@Override
public String toString() {
return "CleanAddress{" +
"rawAddress='" + rawAddress + '\'' +
", district='" + district + '\'' +
", region='" + region + '\'' +
", block='" + block + '\'' +
", road='" + road + '\'' +
", communityName='" + communityName + '\'' +
", floor=" + floor +
", communityAddress=" + communityAddress +
", buildingAddress=" + buildingAddress +
", condoAddress=" + condoAddress +
", propertyType='" + propertyType + '\'' +
", independent=" + independent +
", addressList=" + addressList +
", containsSpecialChar=" + containsSpecialChar +
'}';
}
}

View File

@ -1,9 +1,12 @@
package com.ruoyi.project.tool.address.model;
import com.ruoyi.common.utils.LoadUtil;
import com.ruoyi.common.utils.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 清洗地址构建
@ -15,7 +18,18 @@ public class CleanAddressBuilder {
private Map<String, String> districtMap = LoadUtil.loadDict("address-dict/district.dict");
private List<String> regionList = LoadUtil.loadList("address-dict/region.dict");
private List<String> blockList = LoadUtil.loadList("address-dict/block.dict");
private List<String> roadList = LoadUtil.loadList("address-dict/road.dict");
private CleanAddress cleanAddress;
private static final int DISTRICT_LENGTH = 8;
private static final String SHANGHAI_SHI = "上海市";
private static final String SHANGHAI = "上海";
private static final String SHANG = "";
private static final String HAO = "";
private static final String SHANG_SHANG = "上上";
private static final String SHI_PATTERN = "([\\dA-Za-z]+)(室?)$";
private static final String CHINESE_FLOOR_PATTERN = "([一二三四五六七八九十]+)层";
private static final String NUMBER_FLOOR_PATTERN = "(\\d+)层";
private static final String HAO_PATTERN = "([\\dA-Za-z]+)号";
private CleanAddressBuilder(CleanAddress cleanAddress) {
this.cleanAddress = cleanAddress;
@ -31,14 +45,26 @@ public class CleanAddressBuilder {
*
* @return
*/
public void parseDistrict() {
String shanghaiAndDistrict = "" + cleanAddress.getBoundAddress().substring(0, 7).replace("上上", "");
public CleanAddressBuilder parseDistrict() {
String shanghaiAndDistrict = null;
if (cleanAddress.getBoundAddress().length() >= DISTRICT_LENGTH) {
shanghaiAndDistrict = (SHANG + cleanAddress.getBoundAddress().substring(0, 7)).replace(SHANG_SHANG, SHANG);
} else {
shanghaiAndDistrict = (SHANG + cleanAddress.getBoundAddress()).replace(SHANG_SHANG, SHANG);
}
//
if (!shanghaiAndDistrict.startsWith(SHANGHAI_SHI) && !shanghaiAndDistrict.startsWith(SHANGHAI) && shanghaiAndDistrict.startsWith(SHANG)) {
shanghaiAndDistrict = shanghaiAndDistrict.substring(1, shanghaiAndDistrict.length() - 1);
}
for (Map.Entry<String, String> district : districtMap.entrySet()) {
if (shanghaiAndDistrict.startsWith(district.getKey())) {
cleanAddress.setDistrict(district.getKey());
cleanAddress.setDistrict(district.getValue());
break;
}
}
return this;
}
/**
@ -46,44 +72,156 @@ public class CleanAddressBuilder {
*
* @return
*/
public void parseRegion() {
public CleanAddressBuilder parseRegion() {
for (int i = 0; i < regionList.size(); i++) {
if (-1 != cleanAddress.getBoundAddress().indexOf(regionList.get(i))) {
cleanAddress.setRegion(regionList.get(i));
}
}
return this;
}
/**
* 解析板块
*/
public void parseBlock() {
public CleanAddressBuilder parseBlock() {
for (int i = 0; i < blockList.size(); i++) {
if (-1 != cleanAddress.getBoundAddress().indexOf(blockList.get(i))) {
cleanAddress.setBlock(regionList.get(i));
}
}
return this;
}
/**
* 解析路可能缺失
*/
public void parseRoad() {
public CleanAddressBuilder parseRoad() {
for (int i = 0; i < roadList.size(); i++) {
if (-1 != cleanAddress.getBoundAddress().indexOf(roadList.get(i))) {
cleanAddress.setRoad(roadList.get(i));
}
}
//
if (StringUtils.isEmpty(cleanAddress.getRoad())) {
for (int i = 0; i < roadList.size(); i++) {
// 砍掉
String noRoad = roadList.get(i);
if (noRoad.endsWith("")) {
noRoad = noRoad.substring(0, noRoad.length() - 1);
}
if (-1 != cleanAddress.getBoundAddress().indexOf(noRoad)) {
cleanAddress.setRoad(noRoad);
}
}
}
return this;
}
/**
* 解析小区名称路名和小区名称重定义
*/
public void parseCommunityName() {
public CleanAddressBuilder parseCommunityName() {
return this;
}
/**
* 是否独栋全幢
* 别墅
*/
public void parseIndependent() {
public CleanAddressBuilder parseIndependent() {
Pattern shiPattern = Pattern.compile(SHI_PATTERN);
Matcher matcher = shiPattern.matcher(cleanAddress.getBoundAddress());
if (matcher.find()) {
getCondoAddress();
cleanAddress.setIndependent(Boolean.FALSE);
} else {
cleanAddress.setIndependent(Boolean.TRUE);
}
return this;
}
/**
* 解析地址
*
* @return
*/
public void parseAddress() {
getCondoAddress();
}
/**
* 获取楼层
*/
private void getFloorText() {
Pattern pattern = Pattern.compile(CHINESE_FLOOR_PATTERN);
Matcher matcher = pattern.matcher(cleanAddress.getBoundAddress());
if (matcher.find()) {
cleanAddress.setFloor(matcher.group(1));
return;
}
pattern = Pattern.compile(NUMBER_FLOOR_PATTERN);
matcher = pattern.matcher(cleanAddress.getBoundAddress());
if (matcher.find()) {
cleanAddress.setFloor(matcher.group(1));
return;
}
}
/**
* 小区地址
*/
private void getCommunityAddress(String buildingAddressText) {
// 只有号号号(支弄)
Pattern pattern = Pattern.compile(HAO_PATTERN);
Matcher matcher = pattern.matcher(buildingAddressText);
if (matcher.find()) {
String communityText = buildingAddressText.replace(matcher.group(0), "");
CommunityAddress communityAddress = new CommunityAddress(communityText);
this.cleanAddress.addAddress(communityAddress);
}
}
/**
* 获取清洗地址
*/
private void getCondoAddress() {
getFloorText();
// 有路
if (!StringUtils.isEmpty(cleanAddress.getRoad())) {
int roadIndex = cleanAddress.getBoundAddress().indexOf(cleanAddress.getRoad());
String condoAddressText =
cleanAddress.getBoundAddress().substring(roadIndex);
// 单套
CondoAddress condoAddress = new CondoAddress(condoAddressText);
cleanAddress.setCondoAddress(condoAddress);
cleanAddress.addAddress(condoAddress);
int haoIndex = condoAddressText.lastIndexOf(HAO);
String buildingAddressText = condoAddressText.substring(0, haoIndex + 1);
BuildingAddress buildingAddress = new BuildingAddress(buildingAddressText);
// 楼栋
cleanAddress.setBuildingAddress(buildingAddress);
cleanAddress.addAddress(condoAddress);
cleanAddress.addAddress(buildingAddress);
cleanAddress.addAddress(condoAddress);
cleanAddress.addAddress(buildingAddress);
getCommunityAddress(buildingAddressText);
} else if (!StringUtils.isEmpty(cleanAddress.getCommunityName())) {
} else {
// 没有路没有小区
}
// 从路找到最后面
// 把室号去掉
// 把号去掉
// 单套地址楼栋地址小区地址
}
}

View File

@ -13,19 +13,13 @@ public class CondoAddress extends PartialAddress {
public CondoAddress(String address) {
super(address);
this.shi = parseShi();
this.floor = parseFloor();
this.hao = parseHAO();
}
@Override
public List<PartialAddress> getPartialAddress() {
Pattern pattern = Pattern.compile(SHI_PATTERN);
Matcher matcher = pattern.matcher(this.address);
// 这个需要优化地下层没有考虑
if (matcher.find()) {
this.shi = parseShi();
this.floor = parseFloor();
this.hao = parseHAO();
}
return null;
}
}

View File

@ -102,4 +102,12 @@ public abstract class PartialAddress {
return null;
}
@Override
public String toString() {
return "PartialAddress{" +
"hao='" + hao + '\'' +
", shi='" + shi + '\'' +
", floor=" + floor +
'}';
}
}

View File

@ -13,6 +13,12 @@ public class NoSignalAddressHandler implements AddressHandler {
@Override
public void clear(CleanAddress cleanAddress) {
CleanAddressBuilder.builder(cleanAddress).parseDistrict();
CleanAddressBuilder.builder(cleanAddress)
.parseDistrict()
.parseRegion()
.parseBlock()
.parseRoad()
.parseIndependent()
.parseAddress();
}
}

View File

@ -1,70 +1,70 @@
宝山
宝山区
长宁
长宁区
崇明
崇明区
奉贤
奉贤区
虹口
虹口区
黄浦
黄浦区
嘉定
嘉定区
金山
金山区
静安
静安区
卢湾
闵行
闵行区
普陀
普陀区
浦东
浦东南汇
浦东新区
青浦
青浦区
上海市宝山
上海市宝山区
上海市长宁
上海市长宁区
上海市崇明
上海市崇明区
上海市奉贤
上海市奉贤区
上海市虹口
上海市虹口区
上海市黄浦
上海市黄浦区
上海市嘉定
上海市嘉定区
上海市金山
上海市金山区
上海市静安
上海市静安区
上海市卢湾区
上海市闵行
上海市闵行区
上海市南汇区
上海市普陀
上海市普陀区
上海市浦东
上海市浦东新区
上海市青浦
上海市青浦区
上海市松江
上海市松江区
上海市徐汇
上海市徐汇区
上海市杨浦
上海市杨浦区
上海市闸北区
松江
松江区
徐汇
徐汇区
杨浦
杨浦
闸北
上海市浦东新区 浦东
上海市宝山区 宝山
上海市长宁区 长宁
上海市崇明区 崇明
上海市奉贤区 奉贤
上海市虹口区 虹口
上海市黄浦区 黄浦
上海市嘉定区 嘉定
上海市金山区 金山
上海市静安区 静安
上海市卢湾区 卢湾
上海市闵行区 闵行
上海市南汇区 浦东
上海市普陀区 普陀
上海市青浦区 青浦
上海市松江区 松江
上海市徐汇区 徐汇
上海市杨浦区 杨浦
上海市闸北区 闸北
上海市宝山 宝山
上海市长宁 长宁
上海市崇明 崇明
上海市奉贤 奉贤
上海市虹口 虹口
上海市黄浦 黄浦
上海市嘉定 嘉定
上海市金山 金山
上海市静安 静安
上海市闵行 闵行
上海市普陀 普陀
上海市浦东 浦东
上海市青浦 青浦
上海市松江 松江
上海市徐汇 徐汇
上海市杨浦 杨浦
浦东南汇 浦东
浦东新区 浦东
宝山区 宝山
长宁区 长宁
崇明区 崇明
奉贤区 奉贤
虹口区 虹口
黄浦区 黄浦
嘉定区 嘉定
金山区 金山
静安区 静安
闵行区 闵行
普陀区 普陀
青浦区 青浦
松江区 松江
徐汇区 徐汇
杨浦区 杨浦
宝山 宝山
长宁 长宁
崇明 崇明
奉贤 奉贤
虹口 虹口
黄浦 黄浦
嘉定 嘉定
金山 金山
静安 静安
卢湾 卢湾
闵行 闵行
普陀 普陀
浦东 浦东
青浦 青浦
松江 松江
徐汇 徐汇
杨浦 杨浦
闸北 闸北

View File

@ -0,0 +1,56 @@
package com.ruoyi;
import com.ruoyi.common.utils.LoadUtil;
import com.ruoyi.project.tool.address.CleanUtil;
import com.ruoyi.project.tool.address.model.CleanAddress;
import org.junit.Assert;
import org.junit.Test;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.util.List;
public class CleanUtilTests {
@Test
public void testSortDistrict() {
List<String> textList = LoadUtil.loadList("temp.dict");
textList.sort((x, y) -> y.length() - x.length());
textList.forEach(item -> {
System.out.println(item);
});
}
@Test
public void testClear() {
List<String> textList = LoadUtil.loadList("icbc.dict");
textList.forEach(item -> {
CleanAddress cleanAddress = CleanUtil.clear(item);
System.out.println(cleanAddress);
});
// Assert.assertEquals(cleanAddress.getDistrict(), "");
// Assert.assertEquals(cleanAddress.getDistrict(), "");
// Assert.assertEquals(cleanAddress.getDistrict(), "");
// Assert.assertEquals(cleanAddress.getDistrict(), "");
// Assert.assertEquals(cleanAddress.getDistrict(), "");
// Assert.assertEquals(cleanAddress.getDistrict(), "");
}
@Test
public void testBase64() throws IOException {
Base64.Decoder decoder = Base64.getDecoder();
byte[] buffer = decoder.decode(
"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");
FileOutputStream out = new FileOutputStream("C:\\Work\\uv\\fonts2.woff");
out.write(buffer);
out.close();
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,204 +1,70 @@
世博大道1859号
世博大道2095号
世界大道1710号
世纪大道100号
世纪大道1065号,世纪大道1701号
世纪大道1118号
世纪大道1128号
世纪大道1168号
世纪大道1192号
世纪大道1200号
世纪大道1217号
世纪大道1500号
世纪大道1501号
世纪大道1568号
世纪大道1589号
世纪大道1600号
世纪大道1700号
世纪大道1777号
世纪大道199号
世纪大道2000号
世纪大道201号
世纪大道210号
世纪大道211号
世纪大道800号
世纪大道88号
世纪大道88号
世纪大道8号
东方路69号,浦东大道555号
东方路与张扬路交叉口,福山路268号,世纪大道1217号,张杨路980号
五莲路201弄,莱阳路451弄,利津路158弄,浦东大道2970弄
五莲路201弄,莱阳路451弄,利津路158弄,浦东大道2970弄
商城路800号,世纪大道1090号
大道站路94弄,迎博路94弄(旧)
奉浦大道95弄
奉浦大道95弄
奉浦大道95弄
奉浦大道95弄
奉浦大道95弄
奉浦大道97号,奉浦大道99号,环城东路455弄,环城东路465弄
山兰路446-462号,申港大道87号,水芸路445-473号
崂山路80弄,浦东大道290弄,浦东大道310号,浦东大道312号
崧泽大道6066号
崧泽大道9188弄
崧泽大道9288弄
崧泽大道崧盈路
巨野路22号,浦东大道1638号(旧)
德平路12弄10号,浦东大道2346号
德平路25弄,浦东大道2388弄,龙居路30弄
新园路508弄,新园路509弄,崧泽大道9190弄
昌邑路588弄,浦东大道580号
昌邑路600号,浦东大道599号
朱家角镇绿舟路228弄,朱家角镇绿舟路188弄,淀山湖大道3699弄
杭州湾大道118弄
杭州湾大道1858号
杭州湾大道88号
林荫大道1888弄,林荫新路255弄
梅川路1518号,浦东大道2238号
沪太路1717号,浦东大道1476号,浦东大道1482号
浦东大道1000弄
浦东大道1081-1089号,浦东大道1081号,浦东大道1083号,浦东大道1085号,浦东大道1087号,浦东大道1089号
浦东大道1081-1089号,浦东大道1081号,浦东大道1083号,浦东大道1085号,浦东大道1087号,浦东大道1089号
浦东大道1081号,浦东大道1085号,浦东大道1089号A座,浦东大道1089号B座
浦东大道1093弄
浦东大道1093弄
浦东大道1093弄5号,浦东大道1093弄6号,浦东大道1093弄11号,浦东大道1093弄12号,浦东大道1093弄15号,浦东大道1093弄16号
浦东大道1097弄
浦东大道1097弄
浦东大道1097弄12-16号
浦东大道1139号,浦东大道1139弄
浦东大道1139弄
浦东大道1200号
浦东大道1235号
浦东大道136弄
浦东大道138号
浦东大道140弄
浦东大道1460弄
浦东大道1464-1470号
浦东大道1525号,浦东大道1535号,浦东大道1539号
浦东大道1585弄,浦东大道1615弄,浦东大道1591-1617号(单)
浦东大道1608号
浦东大道1608号
浦东大道1623弄
浦东大道1695弄16-51号
浦东大道1695弄1号
浦东大道1700弄
浦东大道1700弄,浦东大道1666号
浦东大道1819弄
浦东大道1851弄
浦东大道1868号
浦东大道1号
浦东大道2000号
浦东大道2123号
浦东大道2139弄
浦东大道2160号,浦东大道2220号
浦东大道2164、2188、2212号,浦东大道2160号,浦东大道2164号,浦东大道2188号,浦东大道2212号,浦东大道2220号
浦东大道2330号
浦东大道2406弄
浦东大道2406弄
浦东大道2440号
浦东大道2511弄
浦东大道2511弄
浦东大道2515号
浦东大道2515号,浦东大道2521号
浦东大道2536号
浦东大道2554号
浦东大道2554弄
浦东大道2556号
浦东大道2567弄
浦东大道2567弄
浦东大道2568弄
浦东大道2641弄,浦东大道2639弄
浦东大道2738号
浦东大道2742弄
浦东大道2742弄2号,浦东大道2742弄3号
浦东大道2762、2776号,浦东大道2762号,浦东大道2776号
浦东大道2762、2776号,浦东大道2762号,浦东大道2776号
浦东大道2769号,浦东大道2771号,浦东大道2773号
浦东大道2778弄
浦东大道2789号
浦东大道288号
浦东大道2926号,浦东大道2930号,五莲路2、4、6、18、20、28号,五莲路22号
浦东大道2970弄
浦东大道2970弄3号,浦东大道2970弄4号,浦东大道2970弄5号
浦东大道3000号
浦东大道3036弄
浦东大道3040弄
浦东大道3076弄,浦东大道3080弄
浦东大道3号
浦东大道3号,东城路180号
浦东大道435号,浦东大道437号,浦东大道437号甲
浦东大道501弄
浦东大道592号
浦东大道599号,昌邑路600号
浦东大道604弄
浦东大道637号
浦东大道637号
浦东大道651弄,浦东大道691弄
浦东大道666号
浦东大道720号
浦东大道727弄
浦东大道814号
浦东大道834弄
浦东大道900-988号,浦东大道900号,浦东大道988号
浦东大道981号
浦东大道988弄
海港大道和沪城环路转角内侧
海秀路83-139号,金山大道3898弄,卫宏路530号
淀山湖大道218号
淀山湖大道3600弄,淀山湖大道3800弄
淀山湖大道399号
淀山湖大道851号
滨江大道1380弄,滨江大道1399弄
滨江大道1773弄
滨江大道1777号
滨江大道399弄
滨江大道999号、滨江大道993弄
物流大道600弄
环湖西二路568-624号,龙竹路102-120号,申港大道153-177号,云鹃路473-527号,申港大道588号
瑞木路130号,申港大道158号,云娟路628号,云鹃路628_4号
申港大道133号
申港大道1号,申港大道33号,水芸路418号
申港大道200号
申港大道88号,水芸路501号,水芸路505号,水芸路523号,水芸路525号,水芸路527号
福山路,浦东大道729号
福山路268号,世纪大道1217号,张杨路980号
莱阳路201弄,莱阳路301弄,浦东大道2920弄,五莲路100弄
诸陆西路1088弄,崧泽大道2333弄
金山大道2335号
金山大道2335弄,卫零路886弄
金山大道2335弄,卫零路886弄
金山大道2335弄,卫零路886弄
金桥路301弄,金桥路351弄,浦东大道2746弄
青浦镇淀山湖大道199弄
龙东大道1288号
龙东大道1号
龙东大道1号,龙东大道415弄
龙东大道1号,龙东大道415弄
龙东大道1号,龙东大道415弄
龙东大道1号,龙东大道415弄
龙东大道1号,龙东大道415弄
龙东大道2001弄
龙东大道2001弄
龙东大道2001弄
龙东大道2211弄
龙东大道2211弄
龙东大道2211弄
龙东大道2255弄
龙东大道2255弄
龙东大道2255弄
龙东大道2255弄
龙东大道3000号
龙东大道3158弄
龙东大道3800弄
龙东大道4028弄
龙东大道4288弄
龙东大道4288弄
龙东大道4288弄
龙东大道5385号
龙东大道5401弄
龙东大道5401弄
龙东大道666弄,松涛路200弄
龙东大道华东路
龙腾大道2555-9
龙腾大道2815号,龙腾大道2835号,龙腾大道2865号
宝山
宝山区
长宁
长宁区
崇明
崇明区
奉贤
奉贤区
虹口
虹口区
黄浦
黄浦区
嘉定
嘉定区
金山
金山区
静安
静安区
卢湾
闵行
闵行区
普陀
普陀区
浦东
浦东南汇
浦东新区
青浦
青浦区
上海市宝山
上海市宝山区
上海市长宁
上海市长宁区
上海市崇明
上海市崇明区
上海市奉贤
上海市奉贤区
上海市虹口
上海市虹口区
上海市黄浦
上海市黄浦区
上海市嘉定
上海市嘉定区
上海市金山
上海市金山区
上海市静安
上海市静安区
上海市卢湾区
上海市闵行
上海市闵行区
上海市南汇区
上海市普陀
上海市普陀区
上海市浦东
上海市浦东新区
上海市青浦
上海市青浦区
上海市松江
上海市松江区
上海市徐汇
上海市徐汇区
上海市杨浦
上海市杨浦区
上海市闸北区
松江
松江区
徐汇
徐汇区
杨浦
杨浦区
闸北