纳金网

标题: 高效关键词过滤算法(转载) [打印本页]

作者: 狂风大尉    时间: 2014-7-31 21:58
标题: 高效关键词过滤算法(转载)

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

作者: HIDEOKOJIMA    时间: 2014-7-31 22:01
Thanks for sharing this !
作者: hyui    时间: 2014-7-31 22:18
Thanks for sharing !
作者: 我不再年轻    时间: 2014-8-1 11:14
不错, 多谢, 会很有用
作者: Kadina    时间: 2014-8-2 07:05
谢谢楼主分享!
作者: MaiFeo    时间: 2014-8-4 11:48
感谢楼主奉献




欢迎光临 纳金网 (http://rs.narkii.com/club/) Powered by Discuz! X2.5