最近遇到一个项目场景,客户有一套自有的标准地址,但是没有经过治理(地理分词)成地理要素。由于地址治理成本太高,并且客户的需求场景为人工搜索场景,所以要求从数据库里面根据输入地址返回一组匹配度最高的标准地址就行,用户根据返回的疑似标准地址通过人工进行选择。
思考了一下,可以将用户输入的关键词经过自动化分词,然后再进行模糊搜索,最后将匹配到的所有地址进行相似度打分就可以,返回给客户Map<标准地址,相似度分值>
直接上代码
public class PoiSearchTest {
public static void main(String[] args) {
PoiSearch ps = new PoiSearch();
ps.addPoi("蔡店乡木兰清凉寨内简餐冷饮");
ps.addPoi("蔡店街82号陈记炸酱面美食城(蔡店街店)");
ps.addPoi("蔡店南街与蔡店西街交叉口北50米华美酒楼(蔡店南街)");
ps.addPoi("蔡店街88号华龙酒店");
ps.addPoi("新车站蔡店街67号天怀餐馆");
ps.addPoi("138乡道附近小红早点");
ps.addPoi("蔡店乡道士冲村锦里沟内山村作坊");
ps.addPoi("武汉锦里沟景区入口处锦里沟土家风味馆");
ps.addPoi("蔡店镇锦里沟风景区内刘三姐农家乐");
ps.addPoi("田家湾土家风情园");
ps.addPoi("双河村刘家湾双河村村委会旁(罗家祠堂北)双河渔庄");
ps.addPoi("姚集大道223号派乐汉堡");
ps.addPoi("双龙路与百业街交叉口东150米金福缘餐厅");
ps.addPoi("双龙路与百业街交叉口东200米实惠餐厅");
ps.addPoi("姚家集街八角门路1号铁脑壳农家乐");
ps.addPoi("012县道与013乡道交叉口北50米向家嘴土菜馆");
ps.addPoi("长轩岭街朱家山湾17号兵兵农家乐饭庄");
ps.addPoi("长轩岭镇石门山木兰天池度假酒店木兰天池将军府");
// 第一个为标准地址 后面为这个标准地址对应的其他别名 可以传多个别名
ps.addPoi("长轩岭镇石门山木兰天池度假酒店木兰天池将军府","花木兰故居","武汉花木兰故居");
// ps.search("阿达西烧烤店");
System.out.println(ps.search("蔡甸区天怀餐馆"));
System.out.println(ps.search("三姐农家乐"));
System.out.println(ps.search("度假酒店木兰天池"));
System.out.println(ps.search("花木兰故居"));
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
System.out.println("开始时间" + formatter.format(date));
for(int i=0;i<50000;i++){
ps.search("风景区三姐农家乐");
}
date = new Date(System.currentTimeMillis());
System.out.println("结束时间" + formatter.format(date));
}
}
打印输出结果
{新车站蔡店街67号天怀餐馆=0.38461536169052124}
{蔡店镇锦里沟风景区内刘三姐农家乐=0.25}
{长轩岭镇石门山木兰天池度假酒店木兰天池将军府=0.3636363744735718}
{长轩岭镇石门山木兰天池度假酒店木兰天池将军府=1.0}
开始时间2024-04-08 at 11:40:06 CST
结束时间2024-04-08 at 11:40:09 CST
算法符合预期
速度还挺快,达到1.5万/秒
java资源下载
https://download.csdn.net/download/u011024436/89035851
源码学习
https://gitee.com/addresstool/address
使用中有问题或者建议,欢迎联系邮箱addresstool@163.com