一分一毛也是爱

微信

微信

支付宝

支付宝

观海听潮

观海听潮博客

登录
还没有账号?去注册
观海听潮

观海听潮博客

注册
×

我的名片

网名:观海听潮

职业:PHP开发工程师

现居:山东省-青岛市

Email:1256699215@qq.com

网站统计

  • 观海听潮•博客
  • 81篇
  • 151条
  • 192233次
  • 663次
  • 美国弗吉尼亚州

您现在的位置是:首页  > 技术杂谈  > php  > elasticsearch elasticsearch

观海听潮

关于敏感词过滤实现思路

摘要
有搜索功能就免不了要有敏感词过滤的功能,敏感词包括政治、色情、广告、网址、违法等。当用户在输入框搜索敏感词时,可以自动过滤返回空或者将敏感词用其他符号替换掉

有搜索功能就免不了要有敏感词过滤的功能,敏感词包括政治、色情、广告、网址、违法等。当用户在输入框搜索敏感词时,可以自动过滤返回空或者将敏感词用其他符号替换掉

实现思路(推荐第4种):

1、将敏感词存入数组中,然后判断搜索词是否在数组中即可,这种方式适用于敏感词很少并且对性能要求不高的情况。

2、使用搜索引擎的停用词,例如ES的停用词,将远程停用词库作为敏感词库使用,这样敏感词的分词效果就是空,可以起到过滤的效果。但是即使这样,也还是有些敏感词是可以查到数据的,尽管查到的数据不带有敏感词。这种方式性能很高但不能百分之百做到过滤后的数据为空

3、采用搜索引擎模式,例如使用ES搜索引擎,将敏感词单独作为索引去搜索,然后利用关键字查询来判断搜索词是否是敏感词,但是如果用这种方式的话,在判断完是否敏感词后,如果是,直接返回空,但如果不是,还需要再进行一次搜索,而且通常情况下就会出现两次搜索,一次是敏感词索引搜索,一次是商品或者文章索引搜索。这种方式能满足需求,只是性能方面会下降一下,毕竟进行了两次ES搜索。

4、DFA算法过滤,具体DFA算法的原理就不讲了,只说下具体实现和这种方式的特点。这种方式是目前运用很广的一种方式,性能很高,而且完全可以满足需求。

DFA算法过滤PHP实现:

1、安装扩展

composer require lustre/php-dfa-sensitive

2、引入

use DfaFilter\SensitiveHelper;

3、调用

1)、数组调用

$wordData = array(
    '察象蚂',
    '拆迁灭',
    '车牌隐',
    '成人电',
    '成人卡通',
    ......
);
$handle = SensitiveHelper::init()->setTree($wordData);

2)、文件调用

$wordFilePath = 'tests/data/words.txt';//文件中每个词一行
$handle = SensitiveHelper::init()->setTreeByFile($wordFilePath);

4、检测是否有敏感词

$islegal = $handle->islegal($content);

5、敏感词过滤

// 敏感词替换为*为例(会替换为相同字符长度的*)
$filterContent = $handle->replace($content, '*', true);
 // 或敏感词替换为***为例
 $filterContent = $handle->replace($content, '***');

6、标记敏感词

$markedContent = $handle->mark($content, '<mark>', '</mark>');

7、获取文字中的敏感词

// 获取内容中所有的敏感词
$sensitiveWordGroup = $handle->getBadWord($content);
// 仅且获取一个敏感词
$sensitiveWordGroup = $handle->getBadWord($content, 1);

参考文档:https://packagist.org/packages/lustre/php-dfa-sensitive


讨厌 (0)
微博logo QQ空间logo QQlogo 豆瓣logo 人人logo 百度贴吧logo 有道云笔记logo

文章评论

表情表情
×
图片图片

评论列表