关键词匹配类

<?phpnamespace App\Library;use App\Library\Redis;class SensitiveWordFilter
{protected $dict; //生成的词库文件protected $key; //redis键名public function __construct($key){$this->dict = [];$this->key = $key;}public function loadData($data,$time = 7200){ini_set("memory_limit", "2048M");set_time_limit(0);if(!Redis::connection()->hkeys($this->key)){Redis::connection()->del($this->key);}foreach ($data as $v){if (empty($v)) {continue;}$this->addWords(trim($v));}Redis::connection()->setex($this->key,$time,json_encode($this->dict, JSON_UNESCAPED_UNICODE));}public function checkLKey(){return Redis::connection()->exists($this->key);}/*** 分割文本(注意ascii占1个字节, unicode...)** @param string $str** @return string[]*/protected function splitStr($str){return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);}/*** 往dict树中添加语句** @param $wordArr*/protected function addWords($words){$wordArr = $this->splitStr($words);$curNode = &$this->dict;foreach ($wordArr as $char) {if (!isset($curNode)) {$curNode[$char] = [];}$curNode = &$curNode[$char];}// 标记到达当前节点完整路径为"敏感词"$curNode['end'] = 1;}/*** 过滤文本** @param string $str 原始文本* @param string $replace 敏感字替换字符* @param int    $skipDistance 严格程度: 检测时允许跳过的间隔** @return string 返回过滤后的文本*/public function filter($str, $replace = '*', $skipDistance = 0){$finalRes = [];$this->dict = json_decode(Redis::connection()->get($this->key),true);$maxDistance = max($skipDistance, 0) + 1;$strArr = $this->splitStr($str);$length = count($strArr);for ($i = 0; $i < $length; $i++) {$char = $strArr[$i];if (!isset($this->dict[$char])) {continue;}$curNode = &$this->dict[$char];$dist = 0;$matchIndex = [$i];for ($j = $i + 1; $j < $length && $dist < $maxDistance; $j++) {if (!isset($curNode[$strArr[$j]])) {$dist ++;continue;}$matchIndex[] = $j;$curNode = &$curNode[$strArr[$j]];}// 匹配if (isset($curNode['end'])) {$res = [];foreach ($matchIndex as $index) {$res[] = $strArr[$index];$strArr[$index] = $replace;}$finalRes[] = implode("",$res);unset($res);$i = max($matchIndex);}}return $finalRes;  //输出匹配到的关键词
//        return implode('', $strArr);   //输出替换内容}/*** 确认所给语句是否为敏感词** @param $strArr** @return bool|mixed*/public function isMatch($strArr){$strArr = is_array($strArr) ? $strArr : $this->splitStr($strArr);$curNode = &$this->dict;foreach ($strArr as $char) {if (!isset($curNode[$char])) {return false;}}
//        return $curNode['end'] ?? false;  // php 7return isset($curNode['end']) ? $curNode['end'] : false;}}

调用示例

$wordFilter = new SensitiveWordFilter('keywords_dict');
//检查词库文件是否存在,不存在重新生成
if(!$wordFilter->checkLKey()){$keywordData = Keyword::query()->pluck('keyword');if(!empty($keywordData)){$keywordData = $keywordData->toArray();$wordFilter->loadData($keywordData);}unset($keywordData);}
//开始匹配
$keywords = $wordFilter->filter(‘努力读书,报效祖国’);
var_dump($keywords);
//  "读书,祖国"

php自定义词库简单分词,敏感词替换相关推荐

  1. 用python做词云 包含:处理词云形状+分词+绘制词云

    用python制作词云 包含:处理词云形状+分词+绘制词云 以下代码不超过100行 1.处理词云形状 你可能想把词云做成不同的形状,例如方形.圆形,甚至更复杂的,例如一个人体形状. 首先选一张背景为纯 ...

  2. python jieba库分词_Python基于jieba库进行简单分词及词云功能实现方法

    本文实例讲述了Python基于jieba库进行简单分词及词云功能实现方法.分享给大家供大家参考,具体如下: 目标: 1.导入一个文本文件 2.使用jieba对文本进行分词 3.使用wordcloud包 ...

  3. Lucene分词器,使用中文分词器,扩展词库,停用词

    2019独角兽企业重金招聘Python工程师标准>>> Lucene分词器,使用中文分词器,扩展词库,停用词 博客分类: 搜索引擎,爬虫 停止词:lucene的停止词是无功能意义的词 ...

  4. 我用纯C语言开发的中英文混合分词服务器3.0正式发布,词库190多万词,每秒切分5万+,同时提供 c、java、C#、delphi、js调用范例

    我用纯C语言开发的中英文混合分词服务器3.0正式发布,词库190多万词,每秒切分5万+,同时提供 c.java.C#.delphi.js调用范例 百万商业圈中英文混合分词服务器3.0正式发布, 绝对稳 ...

  5. 简单实现敏感词过滤功能

    现在基本所有的网页都存在敏感词过滤的功能,最近开发项目的时候,需要一个敏感词过滤的功能,参考了很多博客,便对此做了总结和自己的开发代码. 一.构建敏感词库 读取文件数据,并保存到HashMap中,构建 ...

  6. Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

    Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类 =========================== ©Copyright 蕃薯耀 2017年9月22日 http://fansh ...

  7. 敏感词过滤程序编写敏感词过滤程序

    敏感词过滤程序编写敏感词过滤程序 前言 Java程序设计语言课程让我们2-3人一个小组,找一个能用集合解决的问题进行介绍.说明,于是我们就找到了这道题目. 一.题目要求 编写敏感词过滤程序编写敏感词过 ...

  8. 5118股市基金行业词库数据【高频词+疑问词+行业根词】

    [所属词库]股市基金 [数据来源]https://www.5118.com/ciku/detail/71?promote=F5834D [导出时间]2022年11月18日,耗时3个多小时 [词库说明] ...

  9. 汇集四大主流停词的中文停词库-7352个停词

    停用词是一些在自然语言处理中被过滤掉的常见词语,如"的"."是"."在"等.它们在文本中出现频率非常高,但通常不包含特定含义,因此被视为噪声 ...

最新文章

  1. Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
  2. php 换行替换成p,php 换行如何替换
  3. SAP Fiori 页面的周期性动态刷新功能的实现步骤
  4. 为了简单起见,Arquillian Chameleon
  5. 前端解读面向切面编程(AOP)
  6. Android 使用控件自定义背景实例
  7. 国内三巨头为什么那么成功
  8. Atitit.远程接口 监控与木马   常用的api 标准化v2 q216
  9. oracle查看asm磁盘,OracleOnLinux-Windows下如何查看ASM磁盘对应的设备
  10. 频繁发送socket命令返回:[WinError 10054] 远程主机强迫关闭了一个现有的连接
  11. hctf-2018-Crypto-xorgame
  12. 给word文档加水印
  13. 程序员之禅10条法则
  14. F28335第七篇——新建项目之编程演示
  15. vue日程安排_vue 时间安排表
  16. 原理图中VCC、VDD、VEE、VSS等符号的意思
  17. python开发bi报表_bi报表
  18. 黑莓几乎转型成纯软件公司 恢复盈利助股价暴涨16%
  19. 信息学奥赛一本通(C++版)NOIP提高组(1820-1829)
  20. 冬天气温寒冷,每周洗澡多少次最合适?

热门文章

  1. 上海域格NB模块主推型号介绍
  2. 小甲鱼Python笔记
  3. bt客户端linux,Ubuntu 16.04安装BT客户端Transmission 2.84
  4. 在家进行硬件升级:入侵Nintendo Joy-Con控制器
  5. vue框架搭建前端登录界面
  6. 扫码枪多次扫码用空格分开
  7. 指纹及设备检索:zoomeye(入门)
  8. 李炎恢Bootstrap视频教程下载
  9. 光模块/BOSA的基础介绍
  10. 【NLP相关】NLP领域经典论文汇总(附代码实现)