博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS实现敏感词的过滤
阅读量:7071 次
发布时间:2019-06-28

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

咳咳~~好久又没有写简书了,虽然经常性在的简书上搜索一些好的学习资料,但自己写的博客却少的可怜,并不是自己没有遇到过问题,也不是没有解决过问题。闲暇的时候仔细的想了想,大致的原因可以分为三个,请听我慢慢道来:

1.我认为最关键的一点:懒。。。奥!不对!应该是太懒,其实有很多问题都可以通过博客的形式记录下来,一方面可以给也遇到该类问题的同伴一种帮助,也可以加深一下自己对一些问题的深入了解和认识。 但一直被自己内心的那种慵懒所阻碍着!!

2.文学水平很差,有的时候在语言的表述上逻辑不够明了,非常的混乱。也不会使用什么华丽的辞藻,就是一通白话文,丝毫没有吸引力。

3.自己的开发水平有限,对有些问题的理解上可能还过于肤浅,或者说研究的不够深入。怕被大牛看见了笑话。

不管怎么说:大胆的把自己的理解和想法说出来,把自己的经历分享给大家是没有错的。也希望各位同伴在阅读的时候,多多指教,多多包涵。好了,废话就不多说了,言归正传。最近因为项目的需要,需要在手机端发送聊天消息的时候对消息的内容进行检索,过滤掉敏感的词汇,这可使我有点慌。因为在百度上搜索了一通发现,敏感词过滤都是在后台进行的,没有发现在手机端过滤的,但是工作需要,就不得不自己找资料研究了。

附上工程的github地址:

欢迎大家下载使用并指正问题,谢谢~~

简单的说一下思路:

1.将本地的敏感词库加入到工程中,当进入到聊天界面的时候,就将这些敏感词都加载到内存中,大概有3000 -- 5000 吧,根据自己的实际情况不同而有差距。

1)将这个TXT文件中的字符串读取出来,根据‘|’将整段敏感词字符串切分中一个个的词,并存到一个数组中。

2)然后将数组中的词都通过字典树的形式进行重新排序处理,最终形成一个NSDictionary类型的字典对象

//核心代码如下:(self.rootArray---存储敏感词的数组)

for (NSString *words in self.rootArray) {

//插入字符,构造节点

NSMutableDictionary *node = self.root;

for (int i = 0; i < words.length; i ++) {

NSString *word = [words substringWithRange:NSMakeRange(i, 1)];

if (node[word] == nil) {

node[word] = [NSMutableDictionary dictionary];

}

node = node[word];

}

//敏感词最后一个字符标识

node[EXIST] = [NSNumber numberWithInt:1];

}

3)将字符串中的敏感词替换成”*“

//核心代码

  • (NSString *)filter:(NSString *)str{

if (self.isFilterClose || !self.root) {

return str;

}

NSMutableString *result = result = [str mutableCopy];

for (int i = 0; i < str.length; i ++) {

NSString *subString = [str substringFromIndex:i];

NSMutableDictionary *node = [self.root mutableCopy] ;

int num = 0;

for (int j = 0; j < subString.length; j ++) {

NSString *word = [subString substringWithRange:NSMakeRange(j, 1)];

if (node[word] == nil) {

break;

}else{

num ++;

node = node[word];

}

//敏感词匹配成功

if ([node[EXIST]integerValue] == 1) {

NSMutableString *symbolStr = [NSMutableString string];

for (int k = 0; k < num; k ++) {

[symbolStr appendString:@"*"];

}

[result replaceCharactersInRange:NSMakeRange(i, num) withString:symbolStr];

i += j;

break;

}

}

}

return result;

}

转载于:https://juejin.im/post/5c6faf5af265da2da67c2f9e

你可能感兴趣的文章
Android studio 使用心得(十)---android studio 多渠道打包(三)
查看>>
数据库选型的一些看法
查看>>
PHP接口&抽象类验证笔记
查看>>
Spark Streaming源码解读之No Receivers
查看>>
使用背景图的div宽高自适应
查看>>
sql注入工具
查看>>
MongoDB 开启用户认证登录
查看>>
ADO.NET操作数据库(一)
查看>>
指针与引用的本质区别
查看>>
Auto Layout 使用心得(五)—— 根据文字、图片自动计算 UITableViewCell
查看>>
M3U8在线视频文件下载合成MP4视频(自己想看电影)
查看>>
HTML5的布局的使用
查看>>
hdu 1068 二分图的最大匹配匈牙利算法
查看>>
一个IT人的非典型职场十年 (4)
查看>>
Netty之Recycler实现对象池
查看>>
Netty5入门学习笔记004-使用Netty传输POJO对象(上)
查看>>
Eclipse的快捷键总结
查看>>
RandomAccessFile相关(读写文件) --本文的正确性有待您验证。
查看>>
结构体对齐详解
查看>>
关于索引的基础知识
查看>>