关键词查找【Aho-Corasick 算法】
创始人
2024-11-21 13:34:41
0

【全程干货】程序员必备算法!AC自动机算法敏感词匹配算法!动画演示讲解,看完轻松掌握,面试官都被你唬住!!_哔哩哔哩_bilibili

著名的多模匹配算法

引入依赖:

    org.ahocorasick    ahocorasick    0.6.3 
public List findKeywordsInText(String text, List keywords) {    Trie trie = Trie.builder()          .addKeywords(keywords)          .build();      long start = System.currentTimeMillis();    Collection emits = trie.parseText(text);    logger.info("trie: " + (System.currentTimeMillis() - start));      List matchedKeywords = new ArrayList<>();    for (Emit emit : emits) {       matchedKeywords.add(emit.getKeyword());    }      return matchedKeywords; }

main demo

public static void main(String[] args) {    String BASE_URL = "https://www.baidu.com/s?wd=";      String text = "abcd";    List wordList = new ArrayList<>();    wordList.add("ab");    wordList.add("bc");    wordList.add("cd");    wordList.add("a");    wordList.add("bcd");    wordList.add("abc");      // 构建 Trie 时忽略大小写  Trie trie = Trie.builder()          .ignoreCase()          .addKeywords(wordList)          .build();      Collection emits = trie.parseText(text);      // 按照关键词长度降序排序  List sortedEmits = new ArrayList<>(emits);    sortedEmits.sort((e1, e2) -> e2.getKeyword().length() - e1.getKeyword().length());      // 移除开始位置在前面词的开始和结束中间的关键词  Set processedKeywords = new HashSet<>();    List filteredEmits = new ArrayList<>();    for (Emit emit : sortedEmits) {       String keyword = emit.getKeyword();       boolean shouldAdd = true;       for (Emit filteredEmit : filteredEmits) {          if (emit.getStart() >= filteredEmit.getStart() && emit.getStart() <= filteredEmit.getEnd()) {             shouldAdd = false;             break;          }       }       if (shouldAdd) {          filteredEmits.add(emit);          processedKeywords.add(keyword);       }    }      // 使用TreeMap来保持emit的start位置顺序  TreeMap firstOccurrences = new TreeMap<>();    for (Emit emit : filteredEmits) {       firstOccurrences.putIfAbsent(emit.getStart(), emit);    }      StringBuilder result = new StringBuilder(text);    int offset = 0;    processedKeywords.clear();    for (Emit emit : firstOccurrences.values()) {       String keyword = emit.getKeyword();       if (!processedKeywords.contains(keyword)) {          int startIndex = emit.getStart() + offset;          int endIndex = emit.getEnd() + 1 + offset;          String link = "" + keyword + "";          result.replace(startIndex, endIndex, link);          offset += link.length() - keyword.length();          processedKeywords.add(keyword);       }    }    System.out.println(result.toString()); }

相关内容

热门资讯

绝活儿辅助!广西老友玩老是输怎... 绝活儿辅助!广西老友玩老是输怎么办(辅助挂)都是真的有辅助app(讲解有挂)在进入广西老友玩老是输怎...
法门辅助!福建13水插件(辅助... 法门辅助!福建13水插件(辅助挂)一贯是有辅助技巧(有挂技术)1、许多玩家不知道福建13水插件辅助怎...
办法辅助!潮友会app下载官方... 办法辅助!潮友会app下载官方辅助器(辅助挂)真是真的是有辅助app(有挂教程)该软件可以轻松地帮助...
妙招辅助!邯郸胡乐挂辅助(辅助... 妙招辅助!邯郸胡乐挂辅助(辅助挂)好像存在有辅助插件(有挂方略)1、上手简单,内置详细流程视频教学,...
教程书辅助!乐酷辅助(辅助挂)... 教程书辅助!乐酷辅助(辅助挂)其实存在有辅助脚本(有挂细节)乐酷辅助能透视中分为三种模型:乐酷辅助模...
学习辅助!决战卡五星辅助(辅助... 学习辅助!决战卡五星辅助(辅助挂)本来真的是有辅助软件(有人有挂)学习辅助!决战卡五星辅助(辅助挂)...
绝活辅助!边锋嘉兴麻将辅助器(... 绝活辅助!边锋嘉兴麻将辅助器(辅助挂)真是真的有辅助神器(新版有挂)1、边锋嘉兴麻将辅助器公共底牌简...
举措辅助!枫叶辅助器(辅助挂)... 举措辅助!枫叶辅助器(辅助挂)本来存在有辅助技巧(竟然有挂)1、下载好枫叶辅助器正确养号方法之后点击...
讲义辅助!点我达辅助(辅助挂)... 讲义辅助!点我达辅助(辅助挂)一直存在有辅助技巧(有人有挂)1、点我达辅助辅助器安装包、点我达辅助辅...
模块辅助!威信茶馆有挂的吗(辅... 模块辅助!威信茶馆有挂的吗(辅助挂)一直真的是有辅助脚本(揭秘有挂)1、玩家可以在威信茶馆有挂的吗线...