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);
    }



}

效果:

 

posted @ 2021-08-06 11:58  chenjiahao  阅读(71)  评论(0编辑  收藏  举报