博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
消灭敏感词是每个公民义不容辞的责任
阅读量:6479 次
发布时间:2019-06-23

本文共 2101 字,大约阅读时间需要 7 分钟。

a41d20c2dcff0e541d250bd956689de6db531d5f

最近在做一个项目,寻遍了 Node 开源社区居然没有发现一个好用的敏感词过滤库,有那么几个库外观上看起来似乎还不错,用起来却一塌糊涂,震惊有余,失望至极。于是花了一天时间自己撸了一个库,库名叫 fastscan,这是我的第一个 Node 开源项目,它也可以用于浏览器环境。fastscan 基于广为人知的 ahocorasick 高性能字符串匹配算法。

项目地址:https://github.com/pyloque/fastscan

演示地址:https://pyloque.github.com/fastscan

ac29b2ae382d0f93085002d5dca00933f0c2e344

考虑到太多的违禁词汇,所以缩小化显示,缩小到让你看不清楚。如果好奇心强烈,还是要去演示地址里面看(文末点击「阅读原文」)。消灭敏感词是每个公民义不容辞的责任!读者们在日常生活中一定要使用 FastScan 自觉审核身边的内容啊!

安装方法

# 安装到当前项目 npm install --save fastscan # 写了不少单元测试,感兴趣运行一下 npm test

使用方法

import FastScanner from fastscan var words = ["今日头条","微信", "支付宝"] var scanner = new FastScanner(words) var content = "今日头条小程序终于来了,这是继微信、支付宝、百度后,第四个推出小程序功能的App。猫眼电影率先试水,出现在今日头条。" var offWords = scanner.search(content) console.log(offWords) var hits = scanner.hits(content) console.log(hits) ------------- [ [ 0, '今日头条' ], [ 15, '微信' ], [ 18, '支付宝' ], [ 53, '今日头条' ] ] { '今日头条': 2, '微信': 1, '支付宝': 1 }

API

  1. 查询匹配的词汇以及所在字符串的位置 search(content, option={})

  2. 查询匹配词汇的命中数量 hits(content, options={})

  3. 临时动态增加词汇,不修正其它词汇的回溯指针 add(word)

options = {quick: false, longest: false}
  1. quick 选项表示快速模式,匹配到一个就立即返回

  2. longest 表示最长模式,同一个位置出现多个词汇(中国、中国人),选择最长的一个(中国人)

  3. 默认匹配出所有的词汇,同一个位置可能会出现多个词汇

性能

项目代码使用原生的 js 实现,我开始非常担心词汇树的构建速度会不会太慢。经测试后发现虽然性能不算太快,不过也不是太差,对于绝大多数项目来说已经绰绰有余了。我分别测试了构造 20000~100000 个词汇的树结构,每个词汇随机在 10~20之间,耗时情况如下

20000 words 385ms
40000 words 654ms
60000 words 1108ms
80000 words 1273ms
100000 words 1659ms

如果你的词汇比较短小,构建树的速度还会更快。

查询性能我并不担心,因为 ahocorasick 算法在词汇长度较短的情况下复杂度是 O(n),性能和被过滤内容的长度乘线性变化。下面我使用 100000 词汇量构建的树分别对 20000 ~ 100000字的内容进行了过滤,耗时情况如下

20000 words 12ms
40000 words 28ms
60000 words 35ms
80000 words 49ms
100000 words 51ms

fastscan 可以做到以迅雷不及掩耳的速度扫遍一幅 10w 字的长文,10w 大概就是一部中篇小说的长度了。如果你要扫百万字的长篇小说,那还是建议你分章分节来扫吧。

内存占用也是需要考虑的点,内存对于 Node 程序来说本来就非常有限,如果因为敏感词树占据了太大的内存那是非常要不得的大问题。所以我也对内存占用进行了测试,下面是测试的结果

0 words 14M
20000 words 81M
40000 words 135M
60000 words 184M
80000 words 234M
100000 words 277M

词汇量不是太大的话,这样的内存占用还是可以接受的。如果你对内存占用不满意,那就只能使用 Node 的 C 语言扩展来打造更高性能的库了,考虑到成本问题,恕我目前无能为力。

注:不得不说,node 社区发布开源类库太方便了,npm login && npm publish 轻松搞定。个人觉得这大概就是 node 轮子多的罪魁祸首。对比之前发布 java 社区开源项目,感觉自己头发都快掉光了,造轮子比发布轮子还要轻松。

原文发布时间为:2018-10-26

本文作者:码洞
本文来自云栖社区合作伙伴“”,了解相关信息可以关注“”。

转载地址:http://axwuo.baihongyu.com/

你可能感兴趣的文章
QSignalMapper类处理多信号关联同一个槽的方法(1)
查看>>
JAVA多线程和并发基础面试问答(转载)
查看>>
每周一书-《程序开发心理学(银年纪念版)》获奖公布
查看>>
atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性
查看>>
jquery之onchange事件2
查看>>
Vsftpd服务的搭建
查看>>
javascript 使用btoa和atob来进行Base64转码和解码
查看>>
线程中的同步辅助类CountDownLatch
查看>>
weui 搜索框
查看>>
docker应用-3(搭建hadoop以及hbase集群)
查看>>
[svc]linux iptables实战
查看>>
delphi 查看编译版本
查看>>
MySQL学习笔记(七)使用AutoMySQLBackup工具自动备份MySQL数据库
查看>>
Web Frame 跨域调用Session 丢失问题
查看>>
重定向标准流
查看>>
WCF中的自定义集合类型传输
查看>>
虚拟CentOS访问Windows下共享文件(三)
查看>>
去掉‘为帮助保护您的安全,internet explorer已经限制此文件显示可能访问您的计算机的活动内容’提示...
查看>>
invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’...
查看>>
java server faces
查看>>