iOS 开发问题日志程序员iOS开发

iOS实现敏感词的过滤

2017-04-25  本文已影响2050人  豆大人007

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

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

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

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

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

附上工程的github地址:https://github.com/tandepeng/minganci.git

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

简单的说一下思路:

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;

}

上一篇 下一篇

猜你喜欢

热点阅读