查看: 1389|回复: 5
打印 上一主题 下一主题

[其他] 高效关键词过滤算法(转载)

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-7-31 21:58:27 |只看该作者 |倒序浏览

前一段时间项目需要用到关键词过滤功能,在网上找了找,现成的好像都不太好用,调用麻烦不说,测试了一下还经常出错,所以一狠心自己写了一套,也没有想象中的麻烦。
最简单的算法,就是直接取出过滤词表里的所有词,直接替换,但是策划同学们提出了一个额外需求,需要可以控制过滤的深度,比如说一个关键字是“哈哈”,那么策划需要可以控制是否过滤“哈1哈”和“哈12哈”这样的词,这就比较麻烦了。

翻了翻正则表达式,没什么头绪(个人不太擅长正则),最后还是用的字符串比对的方法,先检查一下目标字符串里有没有关键词的第一个字,有的话检查有没有第二个,还有的话判断一下这两个字之间的距离,是否大于了策划需要的深度,以此类推。

最后直接上源码了,需要注意的是使用之前要传一个字符串数组(过滤词数组)进来给s_filters
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;

  6. public abstract class WordFilter
  7. {
  8.         public static string[] s_filters = null;

  9.         public static bool filter(string content, out string result_str, int filter_deep = 1, bool check_only = false, bool bTrim = false, string replace_str = "*")
  10.         {
  11.                 string result = content;
  12.                 if (bTrim)
  13.                 {
  14.                         result = result.Trim();
  15.                 }
  16.                 result_str = result;

  17.                 if (s_filters == null)
  18.                 {
  19.                         return false;
  20.                 }

  21.                 bool check = false;
  22.                 foreach (string str in s_filters)
  23.                 {
  24.                         string s = str.Replace(replace_str, "");
  25.                         if (s.Length == 0)
  26.                         {
  27.                                 continue;
  28.                         }

  29.                         bool bFiltered = true;
  30.                         while (bFiltered)
  31.                         {
  32.                                 int result_index_start = -1;
  33.                                 int result_index_end = -1;
  34.                                 int idx = 0;
  35.                                 while (idx < s.Length)
  36.                                 {
  37.                                         string one_s = s.Substring(idx, 1);
  38.                                         if (one_s == replace_str)
  39.                                         {
  40.                                                 continue;
  41.                                         }
  42.                                         if (result_index_end + 1 >= result.Length)
  43.                                         {
  44.                                                 break;
  45.                                         }
  46.                                         int new_index = result.IndexOf(one_s, result_index_end + 1, StringComparison.OrdinalIgnoreCase);
  47.                                         if (new_index == -1)
  48.                                         {
  49.                                                 bFiltered = false;
  50.                                                 break;
  51.                                         }
  52.                                         if (idx > 0 && new_index - result_index_end > filter_deep + 1)
  53.                                         {
  54.                                                 bFiltered = false;
  55.                                                 break;
  56.                                         }
  57.                                         result_index_end = new_index;

  58.                                         if (result_index_start == -1)
  59.                                         {
  60.                                                 result_index_start = new_index;
  61.                                         }
  62.                                         idx++;
  63.                                 }

  64.                                 if (bFiltered)
  65.                                 {
  66.                                         if (check_only)
  67.                                         {
  68.                                                 return true;
  69.                                         }
  70.                                         check = true;
  71.                                         string result_left = result.Substring(0, result_index_start);
  72.                                         for (int i = result_index_start; i <= result_index_end; i++)
  73.                                         {
  74.                                                 result_left += replace_str;
  75.                                         }
  76.                                         string result_right = result.Substring(result_index_end + 1);
  77.                                         result = result_left + result_right;
  78.                                 }
  79.                         }
  80.                 }
  81.                 result_str = result;
  82.                 return check;
  83.         }
  84. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-7-31 22:01:21 |只看该作者
Thanks for sharing this !
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-7-31 22:18:04 |只看该作者
Thanks for sharing !
回复

使用道具 举报

16

主题

1

听众

1万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
3
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-8-1 11:14:08 |只看该作者
不错, 多谢, 会很有用
回复

使用道具 举报

0

主题

2

听众

4092

积分

中级设计师

Rank: 5Rank: 5

纳金币
530
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2014-8-2 07:05:53 |只看该作者
谢谢楼主分享!
回复

使用道具 举报

0

主题

1

听众

206

积分

设计实习生

Rank: 2

纳金币
33
精华
0

最佳新人

6#
发表于 2014-8-4 11:48:26 |只看该作者
感谢楼主奉献
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-23 20:13 , Processed in 0.089326 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部