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


    问题背景:有一个用户留言板,留言在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;

  • 相关阅读:
    delphi string.split 按照任意字符串分割语句
    学习 TTreeView [16]
    学习 TTreeView [15]
    delphi TClientDatset资料
    delphi7 clientdataset 详解
    为TMenuItem增加指针Data属性
    构建一个用于产品介绍的WEB应用
    图片延迟加载技术-Lazyload的应用
    你想不到的压缩方法:将javascript文件压缩成PNG图像存储
    如何更快速加载你的JS页面
  • 原文地址:https://www.cnblogs.com/zemliu/p/2492113.html
Copyright © 2020-2023  润新知