我要知道博客技术分享

DFA有限无穷自动机的应用-敏感关键字的过滤

DFA核心代码

public class DFA
    {
        public static Node rootNode = new Node('R');

        /// <summary>
        /// 根据用户输入的关键词列表查找
        /// </summary>
        public List<string> SearchWord(string userStr)
        {
            List<String> words = new List<String>();

            List<String> word = new List<String>();
            int a = 0;

            char[] chars = userStr.ToCharArray();
            Node node = rootNode;
            while (a < chars.Count())
            {
                node = findNode(node, chars[a]);
                if (node == null)
                {
                    node = rootNode;
                    a = a - word.Count;
                    word.Clear();
                }
                else if (node.flag == 1)
                {
                    word.Add(chars[a].ToString());
                    StringBuilder sb = new StringBuilder();
                    foreach (String str in word)
                    {
                        sb.Append(str);
                    }
                    words.Add(sb.ToString());
                    a = a - word.Count + 1;
                    word.Clear();
                    node = rootNode;
                }
                else
                {
                    word.Add(chars[a].ToString());
                }
                a++;
            }

            return words;
        }

        /// <summary>
        /// 创建树
        /// </summary>
        public static Node CreateTree(List<string> slist)
        {
            foreach (string str in slist)
            {
                char[] chars = str.ToCharArray();
                if (chars.Count() > 0)
                {
                    //node.nodes.Add(CreateNode(rootNode, chars, 0));
                    CreateNode(rootNode, chars, 0);
                }
            }
            return rootNode;
        }

        private static Node CreateNode(Node node, char[] cs, int index)
        {
            Node n = findNode(node, cs[index]);
            if (n == null)
            {
                n = new Node(cs[index]);
                node.nodes.Add(n);
            }

            if (index == (cs.Count() - 1))
                n.flag = 1;

            index++;
            if (index < cs.Count())
            {
                CreateNode(n, cs, index);
            }

            return node;

        }

        private static Node findNode(Node node, char c)
        {
            List<Node> nodes = node.nodes;
            Node rn = null;
            foreach (Node n in nodes)
            {
                if (n.c == c)
                {
                    rn = n;
                    break;
                }
            }
            return rn;
        }
    }

    public class Node
    {
        public char c;
        public int flag; //1:表示终结,0:延续   
        public List<Node> nodes = new List<Node>();

        public Node(char c)
        {
            this.c = c;
            this.flag = 0;
        }

        public Node(char c, int flag)
        {
            this.c = c;
            this.flag = flag;
        }
    }

  

 

搜索查找代码

//过滤脏词
string cacheKeyName = “cacheKeyName”;
Node node = System.Web.HttpRuntime.Cache.Get(cacheKeyName) as Node;
if (null == node)//缓存为空则添加
{
IList<FiltKeywordsVM> listVM = KeywordManage.GetProFiltKeywordList();
List<string> list = new List<string>();
foreach (FiltKeywordsVM item in listVM)
{
list.Add(item.NAME.ToUpper());
}
node = DFA.CreateTree(list);
DateTime time = DateTime.Now.AddHours(ConstClass.FiltKeywordsCacheTime);//Web缓存过期时间
System.Web.HttpRuntime.Cache.Add(cacheRsultKeyName, node, null,
time, TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal, null);
}

//DFA去过滤脏词
DFA dfa = new DFA();
List<string> c = dfa.SearchWord(title.ToUpper());

  

 

posted @ 2013-10-16 16:43  mylove温纯  阅读(366)  评论(0编辑  收藏  举报
我要知道 Copyright ©2011-2015 mylove温纯