敏感词替换简单实现

前言

我们在论坛、博客等社交场景中发送文章时,都会涉及到敏感词的问题,都需要进行删除或者替换。

maven依赖

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>sensitive-word</artifactId>
    <version>0.2.0</version>
</dependency>

代码实现

原始文本为 “这是五星红旗 这是毛主席 这是中国”,将五星红旗替换为国家红旗,毛主席替换为教员。

package com.imooc;

import com.github.houbb.sensitive.word.api.ISensitiveWordReplace;
import com.github.houbb.sensitive.word.api.ISensitiveWordReplaceContext;
import com.github.houbb.sensitive.word.bs.SensitiveWordBs;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class TestSensitiveWord {
    public static void main(String[] args) {

        SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
                .wordDeny(() -> new ArrayList<>(sensitiveWords().keySet()))
                .ignoreCase(true)
                .ignoreWidth(true)
                .ignoreNumStyle(false) // 设置为true会将 五 转换为 5
                .ignoreChineseStyle(true)
                .ignoreEnglishStyle(true)
                .ignoreRepeat(true)
                .enableNumCheck(false)
                .enableEmailCheck(false)
                .enableUrlCheck(false)
                .init();
        String result = wordBs.replace("这是五星红旗 这是毛主席 这是中国", new MySensitiveWordReplace());
        System.out.println(result);//这是国家旗帜 这是教员 这是中国
    }

    // 场景: 将"五星红旗"替换为"国家旗帜","毛主席"替换为"教员"。
    public static class MySensitiveWordReplace implements ISensitiveWordReplace {

        @Override
        public String replace(ISensitiveWordReplaceContext context) {
            System.out.println(context.sensitiveWord());
            return sensitiveWords().getOrDefault(context.sensitiveWord(), "*");
        }
    }

    private static Map<String, String> sensitiveWords() {
        Map<String, String> map = new HashMap<>();
        map.put("五星红旗", "国家旗帜");
        map.put("毛主席", "教员");
        return map;
    }
}

实现原理

DFA介绍

通过 DFA(Deterministic Finite Automaton,确定有限状态自动机) 算法构建敏感词的树,内部使用Map实现,具体结构如下

{
    "五": {
        "ED": false,
        "星": {
            "红": {
                "ED": false,
                "旗": {
                    "ED": true
                }
            },
            "ED": false
        }
    },
    "毛": {
        "主": {
            "席": {
                "ED": true
            },
            "ED": false
        },
        "ED": false
    }
}

DFA和String.replace对比

项目 DFA String.replace
时间复杂度 O(n) O(n*m)(m为敏感词数量)
内存使用 低(构建一次后可重复使用) 高(每次替换都创建新字符串)
匹配效率 高(单次扫描完成) 低(每次匹配都要重新扫描)
大规模敏感词 优秀(与敏感词数量无关) 差(敏感词越多,性能越差)
单次匹配 一般 优秀(简单场景)
posted @ 2025-12-27 12:01  strongmore  阅读(4)  评论(0)    收藏  举报