V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sanyang001
V2EX  ›  Android

求靠谱敏感词过滤方案

  •  
  •   sanyang001 · 2023-09-14 10:06:57 +08:00 · 12304 次点击
    这是一个创建于 428 天前的主题,其中的信息可能已经有所发展或是发生改变。

    事情是这样子的: 我们项目需要移动端本地的敏感词检测服务,之前使用三方的收费太贵,现在打算自研。

    这几天调研了 DFA 、Trie 、AC 这类的实现方案,对于几 w 的敏感词库,CPU 、内存尚可,有误杀的几率;老板比较有野心,说要搞几十 w 的敏感词库,我觉得移动端方案估计靠不住了。

    求 V 站大佬提供一些本地化的检测方案,主要性能要可靠,感激不尽。

    53 条回复    2023-09-16 15:01:13 +08:00
    adminvtoex
        1
    adminvtoex  
       2023-09-14 10:26:19 +08:00
    DFA 、Trie 这些基于搜索的方案只要遇上谐音、特殊字符混淆等、相似字符等基本就白瞎。第三方基本都是模型审核+人工审核兜底,想又可靠又成本低,目前来说别想了。
    stinkytofu
        2
    stinkytofu  
       2023-09-14 10:29:53 +08:00   ❤️ 1
    几十万的敏感词库!!! 汉字的排列组合都被你们干完了
    binbin0915jjpp
        3
    binbin0915jjpp  
       2023-09-14 10:30:21 +08:00   ❤️ 5
    调用文心一言 如果他说换个话题 就敏感(手动狗头)
    c2const
        4
    c2const  
       2023-09-14 10:35:40 +08:00
    自研可能需要长时间实践来迭代哦 :(
    特别是各种谐音、拼音、英文,还有 unicode 特殊字符,unicode 超平面字符(比如 emoji 表情)之类的,规则太多了,还要不断更新 :(
    WillBeethoven
        5
    WillBeethoven  
       2023-09-14 10:36:28 +08:00
    三国杀是我见过的最强文字狱。
    babyoung
        6
    babyoung  
       2023-09-14 10:41:02 +08:00 via iPhone
    有那么多敏感词吗
    SilentRhythm
        7
    SilentRhythm  
       2023-09-14 10:41:56 +08:00   ❤️ 1
    自研最大的问题还是维护词库,新闻天天有,敏感词也一样。
    NessajCN
        8
    NessajCN  
       2023-09-14 10:44:01 +08:00
    建议禁用整个 CJK 编码
    tomczhen
        9
    tomczhen  
       2023-09-14 10:44:10 +08:00 via Android
    自研,还要比现有收费贵的第三方服务效果好?
    凭啥啊,搞出来自己成立个公司专门提供收费服务不香吗?
    sanyang001
        10
    sanyang001  
    OP
       2023-09-14 10:48:07 +08:00
    哦哦,忘记告知了,我们是海外产品,不需要处理中文。
    sanyang001
        11
    sanyang001  
    OP
       2023-09-14 10:50:03 +08:00
    @stinkytofu 忘记说了,我们海外的产品,不用考虑太多中文。
    1996v
        12
    1996v  
       2023-09-14 10:52:23 +08:00
    github 很多共享的词库
    buaacss
        13
    buaacss  
       2023-09-14 10:54:36 +08:00   ❤️ 1
    贡献个低成本的方案

    首先是分词,用 hanlp 的多语言分词模型就不错,tok 的分词效率很高。可以把自家的敏感词当作 force 字典加进去,然后对于误杀的,只要保证词长度比敏感词更长就能解决。

    然后对每个分词作 ac 自动机检测,只要有一个命中就报错出来。

    然后可以再做一层 zero-shot-classification ,把每个敏感词分个类,比如刀属于管制器械,但是刀剑神域是游戏,命中的时候判断刀剑神域是不是管制器械,可以进一步降低误杀概率,hg 上一大堆 zsc 的模型。随便搞一个,之后还能积累一波数据做个微调。

    我们的场景相对来说没有太多敏感词,所以主要的性能消耗在 hanlp 的分词,实际运行效率非常高。10 万量级的词库,50 个 30-50 个字符的检测差不多 200-300ms 。
    danhahaha
        14
    danhahaha  
       2023-09-14 11:01:04 +08:00
    这么复杂不如加一个举报按钮
    wyk111wyk
        15
    wyk111wyk  
       2023-09-14 11:06:30 +08:00
    你们不如自研一个专门的大模型算了
    pengtdyd
        16
    pengtdyd  
       2023-09-14 11:13:09 +08:00   ❤️ 3
    《三方的收费太贵,现在打算自研》这句话根本不成立,自研的成本肯定远远大于使用第三方的成本,你们老板不是一个聪明人。
    vivisidea
        17
    vivisidea  
       2023-09-14 11:17:18 +08:00
    @sanyang001 实际情况会复杂很多,即使是外语,简单的以骂人为例,你以为会规规矩矩的骂"fuck you" 么?
    实际上可能是这样的

    f*ck you!
    fuuuuuck you!
    f[emoji]ck you!
    f.u.c.k you!
    f.......u...---c*k you!
    ……
    unii23i
        18
    unii23i  
       2023-09-14 11:20:31 +08:00
    海外产品也这么怕审查吗,还以为可以绕过去
    我倒是做了一个常用骂人词库,基本上已经覆盖我们平台的骂人词汇了,这些词汇我们也接了第三方,第三方过滤不了
    sketcherly
        19
    sketcherly  
       2023-09-14 11:45:36 +08:00
    Trie 只缓存前一部分,命中的部分再延迟加载?这样肯定不如全部缓存快
    Trie 本身就是空间换时间,又不想空间占用又想快的方案应该是没有,只能尝试一个折中的方案
    然后自建逻辑过了的话再走一遍三方服务应该能在保证准确度的前提下降本,但是耗时又会有增加
    又快资源占用又小还省钱的方案,em...
    sketcherly
        20
    sketcherly  
       2023-09-14 12:02:17 +08:00
    @sketcherly #19 忽略我,想多了,审核的时候大多应该是正常的,然后还要走一遍三方,没啥效果,当我没说。
    streamrx
        21
    streamrx  
       2023-09-14 12:04:09 +08:00 via iPhone
    你想做一个比第三方好用的 还要比用他便宜,这东西又不是靠什么技术,要一直维护一直更新。 不可能做的比第三方提供的好用还比他便宜
    jackOff
        22
    jackOff  
       2023-09-14 12:37:36 +08:00 via Android
    几十万条必须要设计特殊的 trie 树结构字典来减少判断基数字典(把几十万跳规则里剔除基本不可能有交集的规则,参考 adguardhome 的那种对域名进行的结构拆分),然后匹配规则肯定需要相似度百分比阈值,前缀,后缀,去除基础无意义符号(空格,.、_-这种),这个在各种智能识别里算是最基础的。最主要的是这个字典应该是精简的,无垃圾无意义符号加空格的
    smilenceX
        23
    smilenceX  
       2023-09-14 12:37:45 +08:00 via Android
    问 chatgpt ,它说有就有
    jackOff
        24
    jackOff  
       2023-09-14 12:50:01 +08:00 via Android
    @sanyang001 海外的话好像简单一点,trie 树似乎可以试试,字典的数据要剔除无意义字符(,.、这种不可能产生图示意义的符号)加空格,全部最小化,这个规则也对查询的对象使用进行入参清洗,然后是相似度判断是不是敏感词,清洗后的入参应该可以通过关键字,前后缀什么的识别出一些简单的有问题的东西,或者把入参打印成图像再通过图像识别类似于降噪处理啥的丢弃一些无关键的对象来清洗获得一个比较简单的图像识别的文字结果,之后通过人脸识别的机制来进行相似度匹配,这个大部分场景的物体识别还是很成熟和准确的,它允许丢弃不少细节。入参的筛选还可以通过盲审核这句话能不能通读成日常交流语来减少进入上述复杂匹配机制,这个感觉需要 ai 还是啥?
    sanyang001
        25
    sanyang001  
    OP
       2023-09-14 13:43:25 +08:00
    @buaacss 非常感谢
    sighforever
        26
    sighforever  
       2023-09-14 13:59:20 +08:00
    还不如接入 gpt 呢
    sanyang001
        27
    sanyang001  
    OP
       2023-09-14 14:21:35 +08:00
    @jackOff 感谢大佬
    codeself
        28
    codeself  
       2023-09-14 14:22:30 +08:00   ❤️ 4
    不存在完美的,自然语言太灵活了,前几天看到两个 B 站的评论,是这样的,啥机器都反应不过来的.

    《诗经·梅木》
    梅木冬溪,思慕晚意
    飞舞洒碧,碧漾东西
    梅覆梅木,梅游佳亭
    泉佳似广,梅忧寂极
    糙泥马壁,坻石洞溪
    时复思母,消愁东曦​

    初生东曦贴绯雾,赤石去罢嘶笺中。
    逆马抽鞭草拦路,无恼晚意日宁朦。
    akring
        29
    akring  
       2023-09-14 14:38:02 +08:00
    建议花小钱省大麻烦
    timnottom
        30
    timnottom  
       2023-09-14 14:49:12 +08:00   ❤️ 3
    nrtEBH
        31
    nrtEBH  
       2023-09-14 14:50:41 +08:00
    敏感词需要定期更新的 不然出了什么热点你没过滤踩到雷就很危险
    不建议在这里省钱 这是在中国大陆做 ICP 必备的合规成本
    cbythe434
        32
    cbythe434  
       2023-09-14 15:27:50 +08:00
    老板比较有野心。。老板铁憨憨要扛锅吧。。
    本来有锅了 pua 乙方,现在等着自己扛吧
    chrosing
        33
    chrosing  
       2023-09-14 15:45:53 +08:00
    @binbin0915jjpp 真机灵啊
    polo3584
        34
    polo3584  
       2023-09-14 16:01:27 +08:00
    我司是自己维护屏蔽库,时不时更新,客服和网警会给反馈,按时加就完事了。但是图片就不好搞了,人工审核成本不低。
    17681880207
        35
    17681880207  
       2023-09-14 16:39:03 +08:00   ❤️ 3
    最终方案:
    一个下拉框,内置了相关的发言条目,例如:
    1. 你是 GG 还是 MM ?
    2. 快点吧,我等到花儿也谢了。
    3. 你的牌打的太好啦~
    4. 怎么又断线了网络怎么这么差。

    与其规定别人不能说什么,不如规定别人只能说什么来的安全。🤓
    PiersSoCool
        36
    PiersSoCool  
       2023-09-14 16:53:04 +08:00
    有没有 chatgpt 过滤敏感词,好像 embedding 适合做这件事?
    islandempty
        37
    islandempty  
       2023-09-14 19:09:46 +08:00
    抖音的敏感词库用的 ac 自动机,几百万 qps
    Tyrant1984
        38
    Tyrant1984  
       2023-09-14 19:25:22 +08:00
    各家用的敏感词库都是自家的,而且都是不公开的,干过一段审核,也干过一段运营搬砖,自己用的敏感词都是自己写的,或者有人会明确告诉你那些敏感了,你记住。然后去试别人的敏感词库就非常痛苦,经常是一旦提交提示失败需要修改,就知道踩中敏感词了,但是找不到,或者说太难找,直接放弃,不浪费这时间了。
    cest
        39
    cest  
       2023-09-14 19:32:07 +08:00
    @17681880207 #35
    他是出海的
    用定式句也还是要注意各种尊重
    同一句话在不同文化或同文化不同场合/不同相对身份也可能出事
    需要真有能力的地区化专家来设计不冒犯任何东西的万用句子
    cncmmdwl
        40
    cncmmdwl  
       2023-09-14 19:53:30 +08:00
    @17681880207 打的不错 抱歉 你看,炉石这样都能嘲讽他人
    dingyaguang117
        41
    dingyaguang117  
       2023-09-15 08:51:17 +08:00
    AC 自动机 O(N) 时间复杂度,主要是内存占用问题
    sanyang001
        42
    sanyang001  
    OP
       2023-09-15 09:51:11 +08:00
    @dingyaguang117 是的,试了几个 AC 方案,内存占用居高不下。
    dif
        43
    dif  
       2023-09-15 10:03:29 +08:00
    直接学国内,一刀切不就行了。之前在某游戏论坛,打了不到几十个字,说我敏感了,我翻来覆去的看也不知道哪里敏感了。所以,懂了吧。
    kangkkk
        44
    kangkkk  
       2023-09-15 11:46:18 +08:00
    第三方阿里的不贵吧
    noyidoit
        45
    noyidoit  
       2023-09-15 14:08:54 +08:00
    我之前做过服务端的敏感词过滤,好奇你们是什么业务背景,需要在移动端本地进行
    cosiner
        46
    cosiner  
       2023-09-15 14:51:37 +08:00
    要全, 要快, 要小, 要本地....................
    777777
        47
    777777  
       2023-09-15 14:55:43 +08:00
    采用 NFA ,内存占用小,还能支持正则。
    codelover2016
        48
    codelover2016  
       2023-09-15 15:14:30 +08:00
    @stinkytofu 你过于小看劳动人民的智慧了
    lbfjkaou
        49
    lbfjkaou  
       2023-09-15 16:28:00 +08:00
    移动端本地的敏感词检测服务 -> 能不能拆成请求服务器
    lbfjkaou
        50
    lbfjkaou  
       2023-09-15 17:18:56 +08:00
    @noyidoit #45 求问 这边服务端的敏感词过滤的大致思路
    noyidoit
        51
    noyidoit  
       2023-09-15 17:56:50 +08:00   ❤️ 1
    @lbfjkaou 两年前做的,具体细节已经忘了......大体上,初始化单例时载入审核方提供的词库,几万个词,对内存没什么影响(叠甲:单例可以满足当时的需求);算法印象中是基于 AC 自动机,可以检出特殊字符混淆,但谐音只能靠扩充词库。其他应该没什么好说的了,网上类似的解决方案一大堆,github 也有现成的库,实在不行也有第三方接口可以用
    jimczj007
        52
    jimczj007  
       2023-09-15 19:46:58 +08:00
    本地敏感词检测完,服务器不用检测了么
    hellomynameis
        53
    hellomynameis  
       2023-09-16 15:01:13 +08:00
    @codeself #28 只是因为你这首诗里没有真正涉敏的关键词,阿瓦隆放行了。

    bilibili 阿瓦隆其实完全支持谐音、拼音识别。

    不信你可以用小号发条 “戏婧乒” “鹏灾周” 之类的 b 站评论,用大号看能不能看到
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5390 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:12 · PVG 15:12 · LAX 23:12 · JFK 02:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.