通过Trie字典树实现敏感词过滤

1.首先将基本模型构建出来

     创建一个名为TrieNode的类,该类就是我们需要去完善形成的一个Trie的数据结构类。其中有一个Node内部类,Node用来代表Trie中的每一个节点,其中isWord表示首节点到该节点的路径是一个单词,next指向了下一个节点。

 
public class TrieNode {
    //是不是敏感词的结尾
    private boolean end = false;
    //Character代表当前节点的字符,TrieNode代表了下一个节点
    private Map<Character, TrieNode> subNodes = new HashMap<>();
 
    public void addSubNode(Character key, TrieNode node) {
        subNodes.put(key, node);
    }
 
    //查看下一个节点有没有对应的字符
    TrieNode getNextSubNode(Character key) {
        return subNodes.get(key);
    }
 
    boolean isEndWord() {
        return end;
    }
 
    void setEndWord(boolean end) {
        this.end = end;
    }
}

2.构建添加敏感词方法

private TrieNode root = new TrieNode();
    public void addWord(String word){
        TrieNode tempNode = root;
        for(int i = 0 ; i < word.length();i++){
            Character c = word.charAt(i);
            //判断该字符是否已存在
            TrieNode node = tempNode.getNextSubNode(c);
            //若不存在则添加
            if(node == null){
                node = new TrieNode();
                tempNode.addSubNode(c,node);
            }
            tempNode = node;
 
            if(i == word.length()-1){
                tempNode.setEndWord(true);
            }
        }
    }

3.构建过滤敏感词的方法

需要将待查询的word的每个字符遍历看是否存在,将传入的字符串中不是敏感词的就加入到StringBuilder中,如果是敏感词则用***代替。

public String filter(String words){
        String replacement = "***";
        TrieNode tempNode = root;

        int position = 0;

        StringBuilder result = new StringBuilder();
        while(position < words.length()){
            char c = words.charAt(position);
            tempNode = tempNode.getNextSubNode(c);

            //如果这个字符不在敏感词中则添加到结果中
            if(tempNode == null){
                result.append(words.charAt(position));
                tempNode = root;
            }else if(tempNode.isEndWord()){
                //发现敏感词进行打码
                result.append(replacement);
                tempNode = root;
            }
            position++;
        }
        return result.toString();
    }

4.测试代码

public class main {
    public static void main(String[] args) {
        Trie trie = new Trie();
        trie.addWord("色情");
 
        System.out.println(trie.filter("hello,色情"));
    }
}

 可以看到将敏感词色情过滤成了***  

猜你喜欢

转载自blog.csdn.net/h2498864708/article/details/107474787
今日推荐