前端开发前端导航工具/手册更多栏目
  • 折扣返利
  • 网站投稿
  • 广告赞助
  • 书籍/周边
  • 站内搜索
fly63前端网
提交
提交网站

FastScan

网站地址:https://pyloque.github.com/fastscan
网站描述:用于敏感词过滤的 ahocorasick 算法快速文本搜索JS实现

苦于没有找到一个比较合适的敏感词过滤库,所以我自己花了点时间撸了一个。 它基于广为人知的 ahocorasick 字符串匹配算法,使用原生的 js 实现,浏览器和服务端都可以使用。  


安装方法

# 安装到当前项目
npm install --save fastscan


使用方法

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 words385ms
40000 words654ms
60000 words1108ms
80000 words1273ms
100000 words1659ms

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

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

字数耗时
20000 words14ms
40000 words32ms
60000 words67ms
80000 words71ms
100000 words84ms

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

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

词汇数内存占用
0 words14M
20000 words81M
40000 words135M
60000 words184M
80000 words234M
100000 words277M

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


吐血推荐

1.站长广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入...

2.休闲娱乐: 网页游戏  直播/交友   H5游戏

链接: http://www.fly63.com/nav/2328

more>>
相关网站
fine-uploader
一个采用Ajax技术实现的文件上传组件
官网GitHub
Draggable
一个轻量级、响应式的 JS 拖放库
官网GitHub
vue-i18n
Vue.js的国际化插件
官网GitHub
Kiwi
国际化全流程解决方案
GitHub
Fitty
自动调整文本大小以适应其父容器的 Js库
官网GitHub
Choices.js
一个JS可定制的选择框/文本输入插件
官网GitHub
weapp.socket.io
基于小程序的websocket的socket.io实现
官网GitHub
uos
一个仅 250 字节大小的带有进度的滚动监听库
官网GitHub
ParticleEffectsButtons
一款js点击按钮动画粒子特效
官网GitHub
marktext
一款简洁实用的 Markdown 编辑器
官网GitHub
react-dates
React 日期组件
官网GitHub
React LoadCon
React组件来操作favicon,用于加载或进度
官网GitHub
rainbow
Javascript 编写的简单的语法高亮插件
官网GitHub
Switch.js
一款可以将任意CheckBox控件转换为iOS样式滑动开关按钮的JS插件
官网GitHub
bootstrap-wysiwyg
微型、开源的Bootstrap所见即所得富文本编辑器
官网GitHub
draft-js
Facebook开源一个富文本编辑器组件
官网GitHub