예제 #1
0
        /// <summary>
        /// 是否包含
        /// </summary>
        /// <param name="text">要搜索的文本</param>
        /// <returns>是否包含关键词</returns>
        public bool ContainsAny(string text)
        {
            KeyWordTreeNode ptr = _root;

            for (int i = 0; i < text.Length; i++)
            {
                KeyWordTreeNode trans = null;
                while (trans == null)
                {
                    trans = ptr.GetTransition(text[i]);
                    if (ptr == _root)
                    {
                        break;
                    }
                    if (trans == null)
                    {
                        ptr = ptr.Failure;
                    }
                }
                if (trans != null)
                {
                    ptr = trans;
                    if (ptr.Results.Length > 0)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
예제 #2
0
        /// <summary>
        /// 搜索第一个关键词
        /// </summary>
        /// <param name="text">要搜索的文本</param>
        /// <returns>搜索到的对象</returns>
        public KeyWordModel FindFirst(string text)
        {
            ArrayList       ret = new ArrayList();
            KeyWordTreeNode ptr = _root;

            for (int i = 0; i < text.Length; i++)
            {
                KeyWordTreeNode trans = null;
                while (trans == null)
                {
                    trans = ptr.GetTransition(text[i]);
                    if (ptr == _root)
                    {
                        break;
                    }
                    if (trans == null)
                    {
                        ptr = ptr.Failure;
                    }
                }
                if (trans != null)
                {
                    ptr = trans;
                    foreach (string found in ptr.Results)
                    {
                        return(new KeyWordModel(i - found.Length + 1, found));
                    }
                }
            }
            return(KeyWordModel.Empty);
        }
예제 #3
0
 /// <summary>
 /// 生成树
 /// </summary>
 private void BuildTree()
 {
     _root = new KeyWordTreeNode(null, ' ');
     #region 生成树
     foreach (string p in _keywords)
     {
         KeyWordTreeNode nd = _root;
         foreach (char c in p)
         {
             KeyWordTreeNode ndNew = null;
             foreach (KeyWordTreeNode trans in nd.Transitions)
             {
                 if (trans.Char == c)
                 {
                     ndNew = trans;
                     break;
                 }
             }
             if (ndNew == null)
             {
                 ndNew = new KeyWordTreeNode(nd, c);
                 nd.AddTransition(ndNew);
             }
             nd = ndNew;
         }
         nd.AddResult(p);
     }
     #endregion
     ArrayList nodes = new ArrayList();
     //第一层失败节点
     foreach (KeyWordTreeNode nd in _root.Transitions)
     {
         nd.Failure = _root;
         foreach (KeyWordTreeNode trans in nd.Transitions)
         {
             nodes.Add(trans);
         }
     }
     //下级失败节点
     while (nodes.Count != 0)
     {
         ArrayList newNodes = new ArrayList();
         foreach (KeyWordTreeNode nd in nodes)
         {
             KeyWordTreeNode r = nd.Parent.Failure;
             char            c = nd.Char;
             while (r != null && !r.ContainsTransition(c))
             {
                 r = r.Failure;
             }
             if (r == null)
             {
                 nd.Failure = _root;
             }
             else
             {
                 nd.Failure = r.GetTransition(c);
                 foreach (string result in nd.Failure.Results)
                 {
                     nd.AddResult(result);
                 }
             }
             //添加子节点在失败节点中
             foreach (KeyWordTreeNode child in nd.Transitions)
             {
                 newNodes.Add(child);
             }
         }
         nodes = newNodes;
     }
     _root.Failure = _root;
 }