AC算法使关键词搞亮
转载:https://www.cnblogs.com/bincoding/p/13613492.html
<dependency> <groupId>com.hankcs</groupId> <artifactId>hanlp</artifactId> <version>portable-1.7.8</version> </dependency>
代码:
package com.redis.redislock.config; import com.hankcs.hanlp.collection.AhoCorasick.AhoCorasickDoubleArrayTrie; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.TreeMap; /** * @author cjh * @company * @create 2021-08-05 9:38 */ public class KeywordMatch { /** * 构建ac自动机 */ public static AhoCorasickDoubleArrayTrie<String> buildAcdt(List<String> keywords){ AhoCorasickDoubleArrayTrie<String> acdt = new AhoCorasickDoubleArrayTrie<>(); TreeMap<String, String> map = new TreeMap<>(); for(String keyword : keywords){ map.put(keyword, keyword); } acdt.build(map); return acdt; } public static String highLight(String originText, AhoCorasickDoubleArrayTrie<String> acdt){ List<int[]> hitLocationList = new ArrayList<>(); // ac算法匹配关键词 acdt.parseText(originText, (begin, end, value)->{ int[] indexPair = new int[2]; indexPair[0] = begin; indexPair[1] = end-1; hitLocationList.add(indexPair); }); // 构建bitmap byte[] posStatus = new byte[originText.length()]; for(int[] item : hitLocationList){ posStatus[item[0]] = 1; for(int i=item[0]; i<=item[1]; i++){ posStatus[i] = 1; } } // 字符串拼接 int lastStatus = 0; char[] charArray = originText.toCharArray(); StringBuilder stringBuilder = new StringBuilder(); for(int i=0; i<posStatus.length; i++){ if(posStatus[i] == lastStatus){ stringBuilder.append(charArray[i]); }else if(0 == lastStatus){ stringBuilder.append("<span class='keyword-colour'>").append(charArray[i]); lastStatus = 1; }else if(1 == lastStatus){ stringBuilder.append("</span>").append(charArray[i]); lastStatus = 0; } if(i == posStatus.length-1 && 1 == lastStatus){ stringBuilder.append("</span>"); } } return stringBuilder.toString(); } public static void main(String[] args) { String text = "根据《长沙市农业农村局长沙市财政局关于认真组织做好长沙市2020年度农业综合开发示范项目(农业产业园)申报工作的通知》(长农计〔2020〕21号),我局委托第三方机构对20个项目单位进行了实地验收和资料审查,并出具了验收结论,现将结果公示如下。公示日期为2021年7月21日-25日,如有单位或个人对验收结果有异议的,请于公示期内向市农业农村局反映,逾期不予受理。联系电话:88665655长沙市农业农村局2021年7月21日附件长沙市2020年度农业综合开发项目(农业产业园)验收结果汇总表序号项目单位验收建设内容(不包括附属设施)验收结果投资审计金额拟拨付金额1长沙县青山铺镇洪河村村民委员会基础设施部分:改造塘堰(坝)2处,新修或整修渠道5条长1261.11m,新修机耕道3条长1290.1m 产业设施部分:无合格107.68万元100万元2长沙县金井镇新沙村村民委员会基础设施部分:土地平整13.34公顷,改造渠道6条长1113m、新修机耕道6条长1793.7m 产业设施部分:无合格103.96万元100万元3望城区白箬铺镇光明村村民委员会基础设施部分:整修渠道1806.8m,新修大棚周围土质渠道425m,新修机耕路4条长821.4m;产业设施部分:新建单体大棚3008㎡,合格126.2万元100万元4望城区白箬铺镇黄泥铺村村民委员会基础设施部分:新建或整修渠道9条长1395.8m,新修大棚周围渠道140m,山塘护砌2座产业设施部分:新建连栋大棚2000㎡合格107.51万元100万元5望城区茶亭镇狮子岭村经济合作社基础设施部分:新修泵房2座,水塔2座,新修渠道1条长286.9m,新修生产道339.3m,土地平整260亩产业设施部分:无合格100.02万元100万元6望城区桥驿镇群力村村民委员会基础设施部分:新修机耕道1条长264m,新修或整修渠道3条长582.5m 产业设施部分:单体大棚3200㎡,连栋大棚2240㎡不合格7望城区茶亭镇九峰山村村民委员会基础设施部分:山塘清淤护砌2座,新修游道337.8m,新修渠道4条长1075.9m,土地平整3.5亩,新修机耕道634m 产业设施部分:无合格109.83万元100万元8浏阳市北盛镇边洲村经济合作社基础设施部分:新修或整修渠道4条长1185.7m,新修机耕道1条长485.7m 产业设施部分:无不合格9浏阳市沿溪镇沿溪桥村经济合作社基础设施部分:土地平整7736平方米,新修或整修渠道6条长1459.9m,新修机耕道5条长614.1m;产业设施部分:连栋大棚1344㎡,普通钢架大棚6m*30m*10个,泵站设备2台合格74.95万元74.95万10浏阳市官渡镇竹联村经济合作社基础设施部分:新修或整修渠道4条长763m,新修机耕道2条长640.7m,土地平整46亩产业设施部分:农产品交易设施2处待确认101.63万元100万元11浏阳市永和镇永福村股份经济合作社基础设施部分:新修或整修渠道4条长1120.2m,新修机耕道2条长1535.4m 产业设施部分:普通钢架蔬菜大棚19800㎡,冷库及设备86m³合格84.48万元84.48万元12浏阳市永安镇永和村经济合作社基础设施部分:新修或整修渠道5条长1472.4m,新修机耕道4条长1414.2m 产业设施部分:连栋大棚2880㎡、普通钢筋大棚8000㎡合格123.34万元100万元13浏阳市古港镇梅田湖村股份经济合作社基础设施部分:新修或整修渠道3条长527.9m,新修机耕道2条长1200.7m,浆砌石挡墙1处产业设施部分:无合格97.33万元97.33万元14浏阳市官桥镇苏故村股份经济合作社基础设施部分:新修或整修渠道8条长1059.9m,新修机耕道3条长397m,渠道清淤967.6m,土地平整85.74亩、土地翻耕131亩;产业设施部分:集装箱5个,精品菜园整治1383.28㎡合格76.44万元76.44万元15宁乡市回龙铺镇回龙铺村经济合作社基础设施部分:新修生产道4条长1879.2m 产业设施部分:新建水果加工厂房980㎡,冻库82.8㎡合格102.04万元100万元16宁乡市沙田乡石梅村经济合作社基础设施部分:新修机耕路4条长2356m,新修渠道7条长836.7m,改建山塘(林家冲塘)1口产业设施部分:新建育苗大棚756㎡,冻库47.97㎡合格116.01万元100万元17宁乡市横市镇云山村经济合作社基础设施部分:整修机耕路3条长1761.3m,新建泵房3处及取水池3处,新修渠道1条长925.4m 产业设施部分:喷滴灌460亩合格115.3万元100万元18宁乡市喻家坳乡高田村经济合作社基础设施部分:整修渠道1条长229.6m,整修机耕路5条长3110.9m(其中170m未铺石),整修加固山塘7口产业设施部分:无合格101.93万元100万元19宁乡市煤炭坝镇贺家湾村经济合作社基础设施部分:土地平整200亩,新修机耕道2189m,浆砌石护坡1处(一侧长40m,一侧长64.7m),水杉454棵;产业设施部分:喷滴灌200亩,停车坪1处255.06㎡,厕所1个合格105.04万元100万元20宁乡市菁华铺乡陈家桥村经济合作社基础设施部分:整修渠道13条长1858.1m,整修机耕道4处长1090.4m,新修土边沟410.4m 产业设施部分:无合格107.7万元100万元"; List<String> keywords = Arrays.asList("长沙","长沙市"); long start = System.currentTimeMillis(); AhoCorasickDoubleArrayTrie<String> acdt = KeywordMatch.buildAcdt(keywords); String result = KeywordMatch.highLight(text, acdt); long end = System.currentTimeMillis(); long total = end - start; System.out.println("耗时:" + total + "ms"); System.out.println("inpu:" + text); System.out.println("result:" + result); } }
效果: