分享一个基于AC自动机实现的关键词匹配替换工具(附源码)

yihleego · · 616 次点击 · 开始浏览    置顶

### 介绍 基于AC自动机(Aho-Corasick algorithm)实现的关键词、敏感词、非法词、停用词等匹配替换工具,支持结果分词,忽略大小写,替换文本等功能。适用于在文章中查找关键词;过滤聊天、评论、留言中的敏感词等。 --- ### 使用方法 #### 匹配所有关键词 ```go trie := NewTrie("雨疏", "风骤", "残酒", "卷帘人", "知否") emits := trie.FindAll("昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否,知否?应是绿肥红瘦。", false) // [2:4=雨疏, 4:6=风骤, 11:13=残酒, 16:19=卷帘人, 27:29=知否, 30:32=知否] ``` #### 匹配首个关键词 ```go trie := NewTrie("雨疏", "风骤", "残酒", "卷帘人", "知否") emit := trie.FindFirst("昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否,知否?应是绿肥红瘦。", false) // 2:4=雨疏 ``` #### 匹配所有关键词 忽略大小写 ```go trie := NewTrie("poetry", "TRANSLATION") emits := trie.FindAll("Poetry is what gets lost in translation.", true) // [0:6=poetry, 28:39=TRANSLATION] ``` #### 匹配首个关键词 忽略大小写 ```go trie := NewTrie("poetry", "TRANSLATION") emit := trie.FindFirst("Poetry is what gets lost in translation.", true) // 0:6=poetry ``` #### 切分词 ```go trie := NewTrie("溪亭", "归路", "藕花", "争渡") emits := trie.FindAll("常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。", false) tokens := Tokenize(emits, text) // ["常记", "溪亭(2:4=溪亭)", "日暮,沉醉不知", "归路(11:13=归路)", "。兴尽晚回舟,误入", "藕花(22:24=藕花)", "深处。", "争渡(27:29=争渡)", ",", "争渡(30:32=争渡)", ",惊起一滩鸥鹭。"] ``` #### 替换关键词 ```go trie := NewTrie("0元", "砍一刀", "免费拿", "免费领") emits := trie.FindAll("我正在参加砍价,砍到0元就可以免费拿啦。亲~帮我砍一刀呗,咱们一起免费领好货。", false) r1 := Replace(emits, text, "*") r2 := Replace(emits, text, "@#$%^&*") // 我正在参加砍价,砍到**就可以***啦。亲~帮我***呗,咱们一起***好货。 // 我正在参加砍价,砍到%^就可以#$%啦。亲~帮我%^&呗,咱们一起&*@好货。 ``` --- ### 源码 GitHub: https://github.com/yihleego/trie

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

616 次点击  ∙  2 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传