`
高军威
  • 浏览: 175408 次
  • 性别: 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敏感词过滤系统AC自动机算法源码,支持独立部署与集成注册中心

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

    java实现敏感词过滤

    用java实现根据用户传进来的话语是否包含敏感词,如果包含敏感词用*来替代输出。

    java程序敏感词分析

    基于简单的java基础,制作的java敏感词程序,可用于学生提交作业

    使用DFA算法实现的内容安全反垃圾智能鉴黄敏感词过滤

    使用DFA算法实现的内容安全,反垃圾,智能鉴黄,敏感词过滤,不良信息检测,文本校验,敏感词检测,包括关键词提取,过滤html标签等。

    PHP敏感词过滤系统.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发Node.js、C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

    基于AC自动机算法的敏感词过滤项目.zip

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】...

    基于树莓派和Java的实时敏感词识别系统设计源码

    本实时敏感词识别系统项目基于树莓派和Java开发,包含98个文件,其中36个Java文件,31个XML文件,以及其他相关配置和资源文件。系统利用Python脚本辅助,实现对敏感词的实时识别,并立即提供反馈。用户可通过配套的...

    Java+BBS校园论坛

    Java开发的校园论坛,java,JavaSpring+JDBC+Mysql,校园论坛 对于一个用户,使用论坛进行交流时,首先要注册一个 账户,然后登录后才能进行对帖子的回复,如果不登录,就 只能查看帖子而不能进行回复和发表帖子。...

    基于Java的UGC内容过滤架构源码:DFA与贝叶斯学习

    项目概述:基于Java语言开发的UGC内容过滤系统,运用DFA算法进行敏感词汇识别,并计划引入贝叶斯学习优化过滤效果。当前项目包含57个文件,其中Java源文件43个,以及其他配置和资源文件。项目正处于实验阶段,中文...

    JAVA文本相似度查重代码及示例

    JAVA查重算法,包括HanLP 相似度比较、二叉树、DFA算法实现、敏感词处理工具、IKAnalyzer中文分词工具、分词进行敏感词过滤等查重算法,可以计算海明距离、余弦相似性、莱文斯坦距离、Jaccard 相似度、Sorensen Dice...

    基于SpringBoot+Mybatis实现的仿写知乎问答的网站源码+项目说明.zip

    基于前缀树的敏感词过滤 异步框架的设计,底层使用的是Redis的异步队列,使用异步队列实现站内信,点赞,邮件等功能 solr结合IKAnalyzer自定义中文分词,实现搜索引擎 timeline推拉模式结合的时间轴,渲染新鲜事,...

    Java 实现文章汉字关键词(违禁词)识别

    需求很简单,就是从数据库中读取内容,包括资讯,产品,公司简介之类,看看是否存在违禁词,有的话就把这条记录的ID存入违禁词文档。可以应用于分词库匹配检索,如关键字、敏感词的标识,起到过滤的作用。

    基于SpringBoot与Netty的WebSocket弹幕系统设计源码

    本源码是一个基于SpringBoot、Netty、Redis和...系统还采用DFA算法模型对敏感词进行过滤,确保内容的安全性。整个项目包含62个Java文件、12个PNG图像文件等,共92个文件,为用户提供了一个高效、安全的弹幕互动体验。

    模仿知乎做的SpringBoot问答社交网站项目,爬虫进行数据填充.zip

    模仿知乎做的SpringBoot问答社交网站项目,项目技术点SpringBoot+Mybatis+Mysql+redis+solr+velocity+python爬虫进行数据填充,项目亮点有手写异步消息框架、敏感词过滤等 软件开发设计:应用软件开发、系统软件开发...

    快问仿百度知道问答系统 动态-静态-互转版 build 100303.exe

    本系统,采用网络中已经成熟、稳定地技术ASP Access/SQL开发而成,是最早最优秀的问答系统,拥有广大的用户群  通过它,您可以很方便地管理自己网站。... 20、强大而灵活的敏感词过滤功能 100303 更新导航地址

    csw5.0中文分词组件

    此功能可对拆分出的汉语词组进行词性标注,辅以开发人员理解分析文本序列中所包含的语义或意图。其广泛应用于互联网信息搜索以提高搜索精度、智能聊天机器人理解对方话语的含义等领域。整个分词标注以北京大学词性...

    论坛bbs系统源码(springboot+web)

    bbs论坛源码系统,采用springboot+web项目框架,前端采用原生js,jsp,jquery,源码包括后台管理系统,项目包含发帖,回复,敏感词过滤等功能,提供前期部署指导,项目包括完整的mysql数据库文件,可直接部署运行,...

    基于Javaweb中国古典文集网设计与实现源码

    古典文集管理是指对文集的信息进行添加、修改和删除,主要包括文集名称、作者、朝代、内容、译文及注释、赏析和创造背景等内容,管理员有权限查看用户对文集的评论,对包含敏感词的非法评论有权限进行删除。

    qa::kissing_face_with_closed_eyes:基于Spring Boot的问答网站

    在以上UGC (用户生成的内容,用户产生的内容)中,系统都会进行HTML标签及敏感词过滤,这在一定程度上阻止了网站被注入脚本或者充斥着着不良信息。 如果没有对HTML标签进行处理,当用户发布的内容包含如[removed]...

Global site tag (gtag.js) - Google Analytics