• 关于敏感词过滤的一点想法


    问题背景:有一个用户留言板,留言在100字内,另外有一个滤词表,现在需要对用户留言进行过滤,清楚留言中出现并且出现在滤词表中的单词

    针对留言长度相对于滤词表单词而言较短,可采用如下滤词法

    1.构建滤词表的HashMap(filterMap)

    对滤词表中的每个单词做一次Hash,以Hash散列值作为Key,单词内容作为Value

    2.构建滤词表单词的起始符表和结束符表

    2.1起始符表

    将滤词表中每个单词的起始字符构建成一个表,作为起始符表(startList)

    2.2结束符表

    将滤词表中每个单词的结束字符构建成一个表,作为结束符表(endList)

    3.搜索留言敏感词

    1)从留言第一个字开始,与startList中的字符匹配

    1.1)如果匹配到起始字符,搜索ai的下一个字符ai+1,查看ai+1是否存在endList

    1.1.1)如果匹配到则截取留言a1到ai+1的n个字符,并在filterMap中查找这n个字符hash值

    1.1.1.1)如果filterMap中查找到了这n个字符,则清除或记录敏感词后从ai+2继续重复1)

    1.1.1.2)如果filterMap没有查找到这n个字符,则从ai+1个字符开始重复1)

    1.1.2)如果ai+1不存在于endList,则从ai+2开始重复1.1)

    1.2)如果没有匹配到起始字符,则继续往后搜索,在startList中查找留言中的ai+1,重复1),直到留言所有字符搜索完成

    例子:

    留言"fuckfucok"

    滤词表"fuck" "damn"

    滤词表单词最大长度maxLenth = 4;

    filterMap(假设hash值如下)

    "1" => "fuck"

    "2" => "damn"

    startList {"f", "d"}

    endList{"k", "n"}

    首先查找"fuckfucok"的第一个字符f

    在startList中找到了f,然后查找u,不存在于endList,再查找c,不存在于endList,再查找k,存在于endList,就可以对fuck进行hash然后在filterMap中匹配了,匹配到后清除fuck,然后从k的下一个字符f再次开始匹配,发现f在startList中,重复上述操作,找到最后一个字符k,发现长度已经超过maxLenth,匹配结束

    最后滤词结果****fucok;

  • 相关阅读:
    Scanner和BufferedReader
    java annotation
    java获取短uuid
    定时任务线程
    sql 查询最近30分钟或者自定义时间数据
    查看base64编码图片
    oracle 的PACKAGE恢复过程
    Oracle BFILE备忘
    读取Spring的配置文件applicationContext.xml的5种方法
    解决eclipse ctrl+鼠标左键不能用
  • 原文地址:https://www.cnblogs.com/zemliu/p/2492113.html
Copyright © 2020-2023  润新知