纳金网
标题:
高效关键词过滤算法(转载)
[打印本页]
作者:
狂风大尉
时间:
2014-7-31 21:58
标题:
高效关键词过滤算法(转载)
前一段时间项目需要用到关键词过滤功能,在网上找了找,现成的好像都不太好用,调用麻烦不说,测试了一下还经常出错,所以一狠心自己写了一套,也没有想象中的麻烦。
最简单的算法,就是直接取出过滤词表里的所有词,直接替换,但是策划同学们提出了一个额外需求,需要可以控制过滤的深度,比如说一个关键字是“哈哈”,那么策划需要可以控制是否过滤“哈1哈”和“哈12哈”这样的词,这就比较麻烦了。
翻了翻正则表达式,没什么头绪(个人不太擅长正则),最后还是用的字符串比对的方法,先检查一下目标字符串里有没有关键词的第一个字,有的话检查有没有第二个,还有的话判断一下这两个字之间的距离,是否大于了策划需要的深度,以此类推。
最后直接上源码了,需要注意的是使用之前要传一个字符串数组(过滤词数组)进来给
s_filters
。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
public abstract class WordFilter
{
public static string[] s_filters = null;
public static bool filter(string content, out string result_str, int filter_deep = 1, bool check_only = false, bool bTrim = false, string replace_str = "*")
{
string result = content;
if (bTrim)
{
result = result.Trim();
}
result_str = result;
if (s_filters == null)
{
return false;
}
bool check = false;
foreach (string str in s_filters)
{
string s = str.Replace(replace_str, "");
if (s.Length == 0)
{
continue;
}
bool bFiltered = true;
while (bFiltered)
{
int result_index_start = -1;
int result_index_end = -1;
int idx = 0;
while (idx < s.Length)
{
string one_s = s.Substring(idx, 1);
if (one_s == replace_str)
{
continue;
}
if (result_index_end + 1 >= result.Length)
{
break;
}
int new_index = result.IndexOf(one_s, result_index_end + 1, StringComparison.OrdinalIgnoreCase);
if (new_index == -1)
{
bFiltered = false;
break;
}
if (idx > 0 && new_index - result_index_end > filter_deep + 1)
{
bFiltered = false;
break;
}
result_index_end = new_index;
if (result_index_start == -1)
{
result_index_start = new_index;
}
idx++;
}
if (bFiltered)
{
if (check_only)
{
return true;
}
check = true;
string result_left = result.Substring(0, result_index_start);
for (int i = result_index_start; i <= result_index_end; i++)
{
result_left += replace_str;
}
string result_right = result.Substring(result_index_end + 1);
result = result_left + result_right;
}
}
}
result_str = result;
return check;
}
}
复制代码
作者:
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