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