如何设计一个敏感词过滤系统

发布于:2025-06-18 ⋅ 阅读:(15) ⋅ 点赞:(0)

在Java项目中,设计一个敏感词过滤系统可以通过以下步骤进行:

  1. 敏感词的存储:敏感词可以存储在数据库中,也可以存储在内存中的集合(如HashSet)中,便于快速查找。
  2. 数据结构的选择:为提高效率,可以使用 Trie(前缀树) 数据结构来存储敏感词,因为它能够高效地进行前缀匹配。
  3. 过滤过程:在过滤时,通过逐字符遍历文本,使用Trie树来查找并替换敏感词。

代码实现

以下是一个简单的敏感词过滤系统的实现:

1. Trie(前缀树)数据结构
import java.util.HashMap;
import java.util.Map;

class TrieNode {
    Map<Character, TrieNode> children = new HashMap<>();
    boolean isEndOfWord = false;
}

public class SensitiveWordFilter {
    private TrieNode root;

    public SensitiveWordFilter() {
        root = new TrieNode();
    }

    // 插入敏感词到 Trie 树
    public void addSensitiveWord(String word) {
        TrieNode currentNode = root;
        for (char c : word.toCharArray()) {
            currentNode = currentNode.children.computeIfAbsent(c, k -> new TrieNode());
        }
        currentNode.isEndOfWord = true;
    }

    // 判断一个字符是否是敏感词的开始字符
    public boolean containsSensitiveWord(String text) {
        TrieNode currentNode = root;
        for (char c : text.toCharArray()) {
            currentNode = currentNode.children.get(c);
            if (currentNode == null) {
                return false;
            }
            if (currentNode.isEndOfWord) {
                return true;
            }
        }
        return false;
    }

    // 过滤文本中的敏感词
    public String filter(String input) {
        StringBuilder result = new StringBuilder();
        int start = 0;
        while (start < input.length()) {
            TrieNode currentNode = root;
            int end = start;
            while (end < input.length() && currentNode.children.containsKey(input.charAt(end))) {
                currentNode = currentNode.children.get(input.charAt(end));
                end++;
                if (currentNode.isEndOfWord) {
                    break;
                }
            }

            if (end > start) {
                result.append("***"); // 如果匹配到敏感词,替换为 ***
                start = end; // 跳过已匹配的敏感词
            } else {
                result.append(input.charAt(start));
                start++;
            }
        }
        return result.toString();
    }
}
2. 使用敏感词过滤系统
public class Main {
    public static void main(String[] args) {
        SensitiveWordFilter filter = new SensitiveWordFilter();
        
        // 添加敏感词
        filter.addSensitiveWord("敏感词");
        filter.addSensitiveWord("禁止");
        
        // 测试过滤功能
        String text = "这是一个包含敏感词的文本,需要禁止某些词汇";
        
        // 打印过滤后的文本
        String result = filter.filter(text);
        System.out.println("过滤后的文本: " + result);
    }
}

解释

  1. TrieNode 类
    • children:存储每个字符的子节点。
    • isEndOfWord:标记该节点是否是一个敏感词的结尾。
  2. SensitiveWordFilter 类
    • addSensitiveWord:将敏感词添加到Trie树中。
    • containsSensitiveWord:检查输入的文本中是否包含敏感词。
    • filter:替换文本中的敏感词为***

扩展功能

  • 灵活性:你可以根据需要扩展为动态加载敏感词,也可以从数据库中加载敏感词。
  • 模糊匹配:可以进一步改进,支持模糊匹配,比如支持类似“禁**”这种变种敏感词。

网站公告

今日签到

点亮在社区的每一天
去签到