zoukankan      html  css  js  c++  java
  • 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());
    

      

  • 相关阅读:
    JavaScript DOM API初步(整理)
    MySQL与Oracle之间互相拷贝数据的Java程序
    MySQL与Oracle的区别之我见
    js原生:封装document.getElementByClassName()函数
    js和jquery获取父级元素、子级元素、兄弟元素的方法
    封装bt轮播图淡入淡出效果样式
    Bootstrap每天必学之导航条
    全面解析Bootstrap图片轮播效果
    JS如何获取页面可见区域高度
    怎样才能成为优秀的前端工程师
  • 原文地址:https://www.cnblogs.com/guoxiongfei/p/3372517.html
Copyright © 2011-2022 走看看