`
高军威
  • 浏览: 181041 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 敏感词过滤 并显示内容所包含的敏感词

阅读更多


参考网上的一篇博客改写的 测了几次,这个比上一个http://360193550.iteye.com/blog/1856753好用。效率也高了点

package com.gjw.filters;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class KeywordFilter
{
    /** 直接禁止的 */
    private HashMap keysMap   = new HashMap();
    private int     matchType = 1;            // 1:最小长度匹配 2:最大长度匹配

    public void addKeywords(List<String> keywords)
    {
        for (int i = 0; i < keywords.size(); i++)
        {
            String key = keywords.get(i).trim();
            HashMap nowhash = null;
            nowhash = keysMap;
            for (int j = 0; j < key.length(); j++)
            {
                char word = key.charAt(j);
                Object wordMap = nowhash.get(word);
                if (wordMap != null)
                {
                    nowhash = (HashMap) wordMap;
                } else
                {
                    HashMap<String, String> newWordHash = new HashMap<String, String>();
                    newWordHash.put("isEnd", "0");
                    nowhash.put(word, newWordHash);
                    nowhash = newWordHash;
                }
                if (j == key.length() - 1)
                {
                    nowhash.put("isEnd", "1");
                }
            }
        }
    }

    /**
     * 重置关键词
     */
    public void clearKeywords()
    {
        keysMap.clear();
    }

    /**
     * 检查一个字符串从begin位置起开始是否有keyword符合, 如果有符合的keyword值,返回值为匹配keyword的长度,否则返回零
     * flag 1:最小长度匹配 2:最大长度匹配
     */
    private int checkKeyWords(String txt, int begin, int flag)
    {
        HashMap nowhash = null;
        nowhash = keysMap;
        int maxMatchRes = 0;
        int res = 0;
        int l = txt.length();
        char word = 0;
        for (int i = begin; i < l; i++)
        {
            word = txt.charAt(i);
            Object wordMap = nowhash.get(word);
            if (wordMap != null)
            {
                res++;
                nowhash = (HashMap) wordMap;
                if (((String) nowhash.get("isEnd")).equals("1"))
                {
                    if (flag == 1)
                    {
                        wordMap = null;
                        nowhash = null;
                        txt = null;
                        return res;
                    } else
                    {
                        maxMatchRes = res;
                    }
                }
            } else
            {
                txt = null;
                nowhash = null;
                return maxMatchRes;
            }
        }
        txt = null;
        nowhash = null;
        return maxMatchRes;
    }

    /**
     * 返回txt中关键字的列表
     */
    public List<String> getTxtKeyWords(String txt)
    {
        //使用hashset 集合返回 包含那几个 敏感字 不重复显示
        List<String> list = new ArrayList<String>();
        int l = txt.length();
        for (int i = 0; i < l;)
        {
            int len = checkKeyWords(txt, i, matchType);
            if (len > 0)
            {
                String tt = "<font color='#ff0000'>" + txt.substring(i, i + len) + "</font>";
                list.add(tt);
                i += len;
            } else
            {
                i++;
            }
        }
        txt = null;
        return list;
    }

    /**
     * 仅判断txt中是否有关键字
     */
    public boolean isContentKeyWords(String txt)
    {
        for (int i = 0; i < txt.length(); i++)
        {
            int len = checkKeyWords(txt, i, 1);
            if (len > 0)
            {
                return true;
            }
        }
        txt = null;
        return false;
    }
    /**
     * 初始化敏感词列表
     * */
    public void initfiltercode()
    {
        List<String> keywords = new ArrayList<String>();

        InputStream in = KeywordFilter.class.getClassLoader().getResourceAsStream("words.properties");
        Properties pro = new Properties();
        try
        {
            pro.load(in);
            in.close();
        } catch (IOException e1)
        {
            e1.printStackTrace();
        }
        Enumeration<String> enu = (Enumeration<String>) pro.propertyNames();
        while (enu.hasMoreElements())
        {
            try
            {
                String dd = (String) enu.nextElement();
                dd = new String(dd.getBytes("ISO8859-1"), "UTF-8");
                keywords.add(dd);
            } catch (UnsupportedEncodingException e)
            {
                e.printStackTrace();
            }
        }
        addKeywords(keywords);
    }
    public int getMatchType()
    {
        return matchType;
    }

    public void setMatchType(int matchType)
    {
        this.matchType = matchType;
    }

    public static void main(String[] args) throws IOException
    {
        Date date = new Date();
        KeywordFilter filter = new KeywordFilter();
        filter.initfiltercode();
        String txt = "她长孙家提携恩情,FL大法不会有人去追查这件事的,中南海权力斗争就一次,就一次,好吗?";
        boolean boo = filter.isContentKeyWords(txt);
        System.out.println(boo);
        List<String> set = filter.getTxtKeyWords(txt);
        System.out.println("包含的敏感词如下:"+set);
        Date date2 = new Date();
        float ss = date2.getTime() - date.getTime();
        System.out.println(ss + "毫秒");
    }
}
0
6
分享到:
评论
2 楼 高军威 2014-05-05  
/** 
     * 返回txt中关键字的列表 
     */  
    public HashSet<String> getTxtKeyWords(String txt)  
    {  
        //使用hashset 集合返回 包含那几个 敏感字 不重复显示  
        HashSet<String> list = new HashSet<String>();
        int l = txt.length();  
        for (int i = 0; i < l;)  
        {  
            int len = checkKeyWords(txt, i, matchType);  
            if (len > 0)  
            {  
                String tt = "<font color='#ff0000'>" + txt.substring(i, i + len) + "</font>";  
                list.add(tt);  
                i += len;  
            } else  
            {  
                i++;  
            }  
        }  
        txt = null;  
        return list;  
    }  
1 楼 u010244357 2014-03-20  
首先感谢楼主,有个不明白的地方是,输出时一下子输出了好几遍getReplaceStrTxtKeyWords

相关推荐

    java敏感词过滤功能

    在Java开发中,实现敏感词过滤功能是一项常见的需求,特别是在社交媒体、论坛或评论系统中,以防止用户发布不当或违规内容。本项目的核心是通过Java编程实现敏感词的检测和替换,确保信息的安全和合规性。 `...

    java利用DFA算法实现敏感词过滤功能

    以下是对DFA算法及其在Java敏感词过滤中的应用的详细解释。 ### 一、敏感词过滤的重要性 敏感词过滤的目标是检测和处理用户输入中可能存在的敏感词汇。这可以防止不良信息的传播,维护网络环境的和谐。常见的做法...

    JAVA 敏感词过滤

    2. SensitiveWordFilter:一个简单的Java敏感词过滤库,提供了多种过滤策略。 3. SnowNLP:虽然主要用于中文文本处理,但也可用于敏感词过滤。 在实际开发中,应结合具体需求选择合适的过滤方法,并考虑性能、准确...

    java敏感词过滤(支持指定字段过滤)

    在Java开发中,敏感词过滤是一项重要的功能,尤其在处理用户输入、评论或者社交媒体内容时,需要确保不包含任何可能引发争议或不适当的内容。本项目适用于基于SSM(Spring、SpringMVC、MyBatis)和SpringBoot框架的...

    java实现敏感词过滤

    以下是关于这个Java敏感词过滤实现的详细知识讲解。 首先,我们要理解敏感词过滤的基本原理。通常,敏感词过滤系统会维护一个敏感词库,包含各种禁止或限制使用的词汇。当输入的字符串被检查时,系统会遍历每个单词...

    java敏感词过滤

    1. **敏感词库**:一个有效的敏感词过滤系统通常会有一个维护敏感词的数据库或列表,这些词可能包括政治敏感词、不雅词汇等。在Java中,可以使用ArrayList、HashSet或者TreeSet等数据结构来存储这些敏感词,其中...

    Java敏感词过滤Java敏感词过滤

    本篇文章详细介绍了Java敏感词过滤技术的实现方法,包括敏感词库的加载、正则表达式的构建以及过滤逻辑的具体实现。通过对这些关键技术点的理解,可以帮助开发者更好地设计和实现自己的敏感词过滤系统。

    java敏感词检索工具

    Java敏感词检索工具是一种在社区问答、论坛等网络环境中用于过滤和检索可能涉及敏感内容的文本工具。在当今数字化时代,信息安全与言论管理变得尤为重要,此类工具能够帮助平台管理者及时发现并处理潜在的违规信息,...

    Java敏感词过滤源码

    本资源"Java敏感词过滤源码"提供了一个实现这一功能的Java解决方案,它包含了三个关键文件:一个敏感词库和两个Java类。以下是关于这些知识点的详细解释: 1. **敏感词**: 敏感词是指那些可能引起法律、道德或...

    java 敏感词过滤

    在Java编程环境中,敏感词过滤是一项重要的任务,特别是在处理用户输入、社交媒体监控或者内容审查时。这个主题主要涉及如何在文本中检测并移除或替换指定的敏感词汇,以确保内容的安全性和合规性。以下是对这个知识...

    java。dfa算法实现敏感词过滤

    本篇将重点介绍如何使用Java实现基于DFA(Deterministic Finite Automaton,确定有限状态自动机)算法的敏感词过滤。 首先,DFA算法是一种图论概念,它可以被视作一种特殊的有向图,每个节点代表一个状态,每条边...

    基于多种敏感词过滤算法的Java敏感词过滤设计源码

    该项目是一款基于Java实现的敏感词过滤系统源码,包含60个文件,其中Java源文件41个,支持多种敏感词过滤算法,包括TTMP、DFA、DAT、hash bucket和Tire算法。系统提供文本高亮、过滤、判词、替换的接口支持,适用于...

    敏感词过滤

    在IT行业中,敏感词过滤是一项至关重要的技术,特别是在网络内容管理、社交媒体监控、以及各种在线交互平台中。这个话题涉及到网络安全、用户隐私保护以及社会责任等多个方面。本文将深入探讨敏感词过滤的概念、工作...

    高效Java敏感词过滤系统AC自动机算法源码,支持独立部署与集成注册中心

    本项目是一款高效的Java敏感词过滤系统,基于AC自动机算法实现。系统支持独立部署,同时可便捷集成至注册中心,为各类项目提供敏感词过滤服务。包含文件共117个,其中主要构成如下: - Java源文件:49个 - Class...

    基于Java语言的敏感词过滤服务设计源码

    该项目是一款基于Java语言的敏感词过滤服务设计源码,包含22个文件,主要由16个Java源文件、2个Markdown文档、1个Git忽略规则文件、1个开源协议文件、1个XML配置文件、1个YAML配置文件组成。该服务旨在提供高效的...

    DFA实例敏感词过滤实例,附带关键词文件

    在这个实例中,我们关注的是一个基于DFA(Deterministic Finite Automaton,确定有限状态自动机)的敏感词过滤系统,它用于检查并移除或替换文本中的敏感词汇。这个系统包括一个Java实现的工具类`SensitiveWordUtil`...

Global site tag (gtag.js) - Google Analytics