关键字过滤(转载)

简介:

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

不过总算是实现了哈。

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

   

 

 

 

     一个键值组合,

一个键能对应多个值,

这就使得我们第一次

的匹配能减少很多次。




 

 

 

 

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

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

 

      下面是我的流程图:

 

 

      然后是测试的效率:

     

     

 

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

 


 

复制代码
  1using  System;
  2using
 System.Collections.Specialized;
  3using
 System.Xml;
  4using
 System.Text;
  5using
 System.IO;
  6

  7namespace
 KeyWordFilter
  8ExpandedBlockStart.gifContractedBlock.gif
{
  9

 10ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
 11    /// 脏字过滤
 12    ///
 脏字字典需命名后放在根目录下。
 13    /// </summary>

 14    public class KeyWordFilter
 15ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
 16        //保存脏字的字典

 17        private NameValueCollection KeyWordDictionary = new NameValueCollection();
 18

 19        public
 KeyWordFilter()
 20ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
 21            //初始化脏字字典

 22            GetAllTheKeyWord();
 23        }

 24
 25

 26

 27        private void
 GetAllTheKeyWord()
 28ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
 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))
 44ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
 45                //读取脏字符

 46                StreamReader reader = new StreamReader(File_Name, System.Text.Encoding.GetEncoding("gb2312"));
 47                String input = ""
;
 48                while (reader.Peek() > 1
)
 49ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
 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)
 60ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
 61            //保存新字符的StringBuilder

 62            StringBuilder newString = new StringBuilder();
 63            int i = 0
;
 64

 65            //
如果脏字字典不为空,则
 66            //历遍input,检查是否有非法字

 67            if (KeyWordDictionary.Keys.Count != 0)
 68ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
 69                for (i = 0; i <
 input.Length; )
 70ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
 71

 72                    foreach (string key in
 KeyWordDictionary.AllKeys)
 73ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
 74                        if (i <
 input.Length)
 75ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
 76                            //input的当前字符是否在脏字字典的键组中

 77                            if (input[i].ToString() == key)
 78ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
 79                                //历遍当前键所在的脏字值组

 80                                foreach (string word in KeyWordDictionary.GetValues(key))
 81ExpandedSubBlockStart.gifContractedSubBlock.gif                                
{
 82

 83                                    if ((i + word.Length) <
 input.Length)
 84ExpandedSubBlockStart.gifContractedSubBlock.gif                                    
{
 85                                        //
从当前位置开始,截取与当前值相同长度的字符串与
 86                                        //当前脏字比较

 87                                        if (input.Substring(i + 1, word.Length) == word)
 88ExpandedSubBlockStart.gifContractedSubBlock.gif                                        
{
 89                                            //如果符合则替换与脏字相同长度的字符

 90                                            newString.Append(ChangeTheWords(input[i], word.Length));
 91                                            i += word.Length + 1
;
 92                                            break
;
 93                                        }

 94                                        else
 95ExpandedSubBlockStart.gifContractedSubBlock.gif                                        {
 96                                            //如果匹配到最后一个仍未有脏字,则把当前字符加入输出字符串

 97                                            if (word == KeyWordDictionary.GetValues(key)[KeyWordDictionary.GetValues(key).Length - 1])
 98ExpandedSubBlockStart.gifContractedSubBlock.gif                                            
{
 99
                                                newString.Append(input[i]);
100                                                i++
;
101                                            }

102                                        }

103                                    }

104ExpandedSubBlockStart.gifContractedSubBlock.gif                                    else { } //如果下个需要匹配的脏字超过了剩下了字符长度,则跳过当前脏字符.
105
106                                }

107                            }

108                            //如果没有键与当前字符匹配,则把当前字符加入输出字符串
109                            else if (key == KeyWordDictionary.AllKeys[KeyWordDictionary.Keys.Count - 1])
110ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
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)
127ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
128            StringBuilder newString = new
 StringBuilder();
129

130
            newString.Append(input);
131

132            for (int i = 0; i < length; i++
)
133ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
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,如需转载请自行联系原作者
 
 
 
相关文章
|
1月前
|
C++
|
3月前
|
人工智能 Python
条件过滤检索
向量检索服务DashVector支持条件过滤和向量相似性检索相结合,在精确满足过滤条件的前提下进行高效的向量检索。
网站关键字匹配度不高怎么办?
恰当的关键字能为网站带来流量,关键字也能得到良好的排名,从而为企业带来更多的客户,因此关键字的选择对网站来说非常重要。那怎样选择关键字呢?选择流量稳定的关键字。
65 0
网站关键字匹配度不高怎么办?
|
BI 数据库 JavaScript
多值关联过滤
多值关联过滤
650 0
|
缓存 Java
volitile关键字
1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
1119 0
|
JavaScript 前端开发 数据格式