Android 敏感词过滤实现

本文介绍了在Android中实现敏感词过滤的需求,通过DFA算法进行敏感词匹配。然而,遇到问题:单个字符无法有效过滤,因为算法会尝试匹配后续可能的敏感词组合,导致无法正确识别和替换单个敏感字。需要进一步优化算法来解决这个问题。
摘要由CSDN通过智能技术生成

Android 敏感词过滤实现

今天公司提出来一个在手机端输入文字的时候直接过滤敏感词并替换成“”的需求。想想很简单嘛,不就是把EditText的内容拿到,然后转换成char[],再和敏感词库的一一对比。网上应该有很多才对。所以就直接百度了一下,敏感词过滤,网上果然很多,而且大部分都是提出使用DFA算法,我**,牵扯到算法啊,好高大上的感觉有没有,于是认真的看看简介.
在这里插入图片描述 (图是我从别人那抄来的)
看到这张图是不是很熟悉,树形结构。于是开始copy(能抄的时候从来不动脑子去写)别人的代码过来修改修改就能用。

public class SensitiveWordsUtils {
   

    /**
     * 敏感词匹配规则
     */
    public static final int MinMatchTYpe = 1;      //最小匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国]人
    public static final int MaxMatchType = 2;      //最大匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国人]

    /**
     * 敏感词集合
     */
    public static HashMap sensitiveWordMap;

    /**
     * 初始化敏感词库,构建DFA算法模型
     *
     * @param
     */
    public static synchronized void init(Context context) {
   
        try {
   
            initSensitiveWordMap(context);
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }

    //这里直接从asstes读敏感词文件,然后加入到set集合
    public static Set<String> readSensitiveWordFile(Context context) throws Exception{
   
        Set<String> set = null;
        
        InputStreamReader read = new InputStreamReader(context.getResources().getAssets().open(“文件名称”),"UTF-8");
        try {
   
            set = new HashSet<String>();
            BufferedReader bufferedReader = new BufferedReader(read);
            String txt = null;
            while((txt = bufferedReader.readLine()) != null){
       //读取文件,将文件内容放入到set中
                set.add(txt);
            }
        } catch (Exception e) {
   
            throw e;
        }finally{
   
            read.close();     //关闭文件流
        }
        Log.e("ryan","set=="+set.toString());
        return set;
    }

    /**
     * 初始化敏感词库,构建DFA算法模型
     *
     */
    private static void initSensitiveWordMap(Context context) throws Exception {
   
        Set<String> sensitiveWordSet = readSensitiveWordFile(context);
        //初始化敏感词容器,减少扩容操作
        if (null != sensitiveWordSet && sensitiveWordSet.size() > 0){
   
            sensitiveWordMap = new HashMap(sensitiveWordSet.size());
            String key;
            Map nowMap;
            Map<String, String> newWorMap;
            //迭代sensitiveWordSet
            Iterator<String> iterator = sensitiveWordSet.iterator();
            while (iterator.hasNext()) {
   
                
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值