关键字过滤(转载)

 最近写了一个关键字过滤器,也就是脏字过滤,由于是新手,所以效率大家可能不敢恭维。

不过总算是实现了哈。

   对于保存脏字的字典,用的是NameValueCollection,他的结构大概为下图:

关键字过滤(转载)    

 

 

 

     一个键值组合,

一个键能对应多个值,

这就使得我们第一次

的匹配能减少很多次。




 

 

 

 

      按照这个结构,我们把关键字的字典读取,每次增加关键字都会历遍Key组,如果相对应的Key已经存在,

则把值添加到对应Key的值组里面,如果不存在则创建新的Key来存放值。

 

      下面是我的流程图:

 关键字过滤(转载)

 

      然后是测试的效率:

      关键字过滤(转载)

      关键字过滤(转载)

 

      最后是实现的代码,需要的兄弟可以用用,但不保证效率哈~

 


 

关键字过滤(转载)
  1关键字过滤(转载)using System;
  2关键字过滤(转载)using
 System.Collections.Specialized;
  3关键字过滤(转载)using
 System.Xml;
  4关键字过滤(转载)using
 System.Text;
  5关键字过滤(转载)using
 System.IO;
  6
关键字过滤(转载)
  7关键字过滤(转载)namespace
 KeyWordFilter
  8关键字过滤(转载)关键字过滤(转载)关键字过滤(转载)
{
  9
关键字过滤(转载)
 10关键字过滤(转载)关键字过滤(转载)    
/**//// <summary>
 11关键字过滤(转载)    /// 脏字过滤
 12关键字过滤(转载)    ///
 脏字字典需命名后放在根目录下。
 13关键字过滤(转载)    /// </summary>

 14关键字过滤(转载)    public class KeyWordFilter
 15关键字过滤(转载)关键字过滤(转载)    关键字过滤(转载)
{
 16关键字过滤(转载)        //保存脏字的字典

 17关键字过滤(转载)        private NameValueCollection KeyWordDictionary = new NameValueCollection();
 18
关键字过滤(转载)
 19关键字过滤(转载)        public
 KeyWordFilter()
 20关键字过滤(转载)关键字过滤(转载)        关键字过滤(转载)
{
 21关键字过滤(转载)            //初始化脏字字典

 22关键字过滤(转载)            GetAllTheKeyWord();
 23关键字过滤(转载)        }

 24关键字过滤(转载)
 25
关键字过滤(转载)
 26
关键字过滤(转载)
 27关键字过滤(转载)        private void
 GetAllTheKeyWord()
 28关键字过滤(转载)关键字过滤(转载)        关键字过滤(转载)
{
 29关键字过滤(转载)            String KeyWord = ""
;
 30
关键字过滤(转载)
 31关键字过滤(转载)            XmlDocument xmlDocument = new
 XmlDocument();
 32
关键字过滤(转载)
 33关键字过滤(转载)            //配置信息,保存脏字字典的位置及名称

 34关键字过滤(转载)            xmlDocument.Load("Config.xml");
 35关键字过滤(转载)            XmlNode node =
 xmlDocument.DocumentElement;
 36
关键字过滤(转载)
 37关键字过滤(转载)            //脏字字典地址

 38关键字过滤(转载)            string File_Name = node.SelectNodes("KeyWordDictionary").Item(0).InnerText.ToString();
 39
关键字过滤(转载)
 40关键字过滤(转载)            //
string File_Name = @".\Dictionary.txt";
 41
关键字过滤(转载)
 42关键字过滤(转载)            //文件存在则开始读取

 43关键字过滤(转载)            if (File.Exists(File_Name))
 44关键字过滤(转载)关键字过滤(转载)            关键字过滤(转载)
{
 45关键字过滤(转载)                //读取脏字符

 46关键字过滤(转载)                StreamReader reader = new StreamReader(File_Name, System.Text.Encoding.GetEncoding("gb2312"));
 47关键字过滤(转载)                String input = ""
;
 48关键字过滤(转载)                while (reader.Peek() > 1
)
 49关键字过滤(转载)关键字过滤(转载)                关键字过滤(转载)
{
 50关键字过滤(转载)                    input =
 (reader.ReadLine());
 51
关键字过滤(转载)
 52关键字过滤(转载)                    //将脏字首字作为键,后续的字符串作为值

 53关键字过滤(转载)                    KeyWordDictionary.Add(input[0].ToString(), input.ToString().Substring(1, input.Length - 1));
 54关键字过滤(转载)                    input = string
.Empty;
 55关键字过滤(转载)                }

 56关键字过滤(转载)            }

 57关键字过滤(转载)        }

 58关键字过滤(转载)
 59关键字过滤(转载)        public
 String CheckTheText(String input)
 60关键字过滤(转载)关键字过滤(转载)        关键字过滤(转载)
{
 61关键字过滤(转载)            //保存新字符的StringBuilder

 62关键字过滤(转载)            StringBuilder newString = new StringBuilder();
 63关键字过滤(转载)            int i = 0
;
 64
关键字过滤(转载)
 65关键字过滤(转载)            //
如果脏字字典不为空,则
 66关键字过滤(转载)            //历遍input,检查是否有非法字

 67关键字过滤(转载)            if (KeyWordDictionary.Keys.Count != 0)
 68关键字过滤(转载)关键字过滤(转载)            关键字过滤(转载)
{
 69关键字过滤(转载)                for (i = 0; i <
 input.Length; )
 70关键字过滤(转载)关键字过滤(转载)                关键字过滤(转载)
{
 71
关键字过滤(转载)
 72关键字过滤(转载)                    foreach (string key in
 KeyWordDictionary.AllKeys)
 73关键字过滤(转载)关键字过滤(转载)                    关键字过滤(转载)
{
 74关键字过滤(转载)                        if (i <
 input.Length)
 75关键字过滤(转载)关键字过滤(转载)                        关键字过滤(转载)
{
 76关键字过滤(转载)                            //input的当前字符是否在脏字字典的键组中

 77关键字过滤(转载)                            if (input[i].ToString() == key)
 78关键字过滤(转载)关键字过滤(转载)                            关键字过滤(转载)
{
 79关键字过滤(转载)                                //历遍当前键所在的脏字值组

 80关键字过滤(转载)                                foreach (string word in KeyWordDictionary.GetValues(key))
 81关键字过滤(转载)关键字过滤(转载)                                关键字过滤(转载)
{
 82
关键字过滤(转载)
 83关键字过滤(转载)                                    if ((i + word.Length) <
 input.Length)
 84关键字过滤(转载)关键字过滤(转载)                                    关键字过滤(转载)
{
 85关键字过滤(转载)                                        //
从当前位置开始,截取与当前值相同长度的字符串与
 86关键字过滤(转载)                                        //当前脏字比较

 87关键字过滤(转载)                                        if (input.Substring(i + 1, word.Length) == word)
 88关键字过滤(转载)关键字过滤(转载)                                        关键字过滤(转载)
{
 89关键字过滤(转载)                                            //如果符合则替换与脏字相同长度的字符

 90关键字过滤(转载)                                            newString.Append(ChangeTheWords(input[i], word.Length));
 91关键字过滤(转载)                                            i += word.Length + 1
;
 92关键字过滤(转载)                                            break
;
 93关键字过滤(转载)                                        }

 94关键字过滤(转载)                                        else
 95关键字过滤(转载)关键字过滤(转载)                                        关键字过滤(转载){
 96关键字过滤(转载)                                            //如果匹配到最后一个仍未有脏字,则把当前字符加入输出字符串

 97关键字过滤(转载)                                            if (word == KeyWordDictionary.GetValues(key)[KeyWordDictionary.GetValues(key).Length - 1])
 98关键字过滤(转载)关键字过滤(转载)                                            关键字过滤(转载)
{
 99
关键字过滤(转载)                                                newString.Append(input[i]);
100关键字过滤(转载)                                                i++
;
101关键字过滤(转载)                                            }

102关键字过滤(转载)                                        }

103关键字过滤(转载)                                    }

104关键字过滤(转载)关键字过滤(转载)                                    else 关键字过滤(转载){ } //如果下个需要匹配的脏字超过了剩下了字符长度,则跳过当前脏字符.
105关键字过滤(转载)
106关键字过滤(转载)                                }

107关键字过滤(转载)                            }

108关键字过滤(转载)                            //如果没有键与当前字符匹配,则把当前字符加入输出字符串
109关键字过滤(转载)                            else if (key == KeyWordDictionary.AllKeys[KeyWordDictionary.Keys.Count - 1])
110关键字过滤(转载)关键字过滤(转载)                            关键字过滤(转载)
{
111
关键字过滤(转载)                                newString.Append(input[i]);
112关键字过滤(转载)                                i++
;
113关键字过滤(转载)                            }

114关键字过滤(转载)                        }

115关键字过滤(转载)                        //catch (Exception e) { }
116关键字过滤(转载)
117关键字过滤(转载)                    }

118关键字过滤(转载)                }

119关键字过滤(转载)            }

120关键字过滤(转载)            else newString.Append(input);  //如果脏字字典为空,则返回原文
121关键字过滤(转载)
122关键字过滤(转载)            return newString.ToString();
123关键字过滤(转载)        }

124关键字过滤(转载)
125关键字过滤(转载)        //根据传入的长度生成屏蔽符号

126关键字过滤(转载)        private string ChangeTheWords(char input, int length)
127关键字过滤(转载)关键字过滤(转载)        关键字过滤(转载)
{
128关键字过滤(转载)            StringBuilder newString = new
 StringBuilder();
129
关键字过滤(转载)
130
关键字过滤(转载)            newString.Append(input);
131
关键字过滤(转载)
132关键字过滤(转载)            for (int i = 0; i < length; i++
)
133关键字过滤(转载)关键字过滤(转载)            关键字过滤(转载)
{
134关键字过滤(转载)                newString.Append("*"
);
135关键字过滤(转载)            }

136关键字过滤(转载)            return newString.ToString();
137关键字过滤(转载)        }

138关键字过滤(转载)    }

139关键字过滤(转载)}

140关键字过滤(转载)
关键字过滤(转载)

 

http://www.cnblogs.com/SinSay/archive/2009/03/28/1424003.html

版权说明

  如果标题未标有<转载、转>等字则属于作者原创,欢迎转载,其版权归作者和博客园共有。
  作      者:温景良
  文章出处:http://wenjl520.cnblogs.com/  或  http://www.cnblogs.com/

posted @ 2009-03-28 21:52 温景良(Jason) Views(409) Comments(0) Edit 收藏
 

公告

本文转自我的程序人生博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2009/03/28/1424128.html,如需转载请自行联系原作者