一个简单的关键字过滤算法

早上看到老赵的《一个较完整的关键字过滤解决方案(上)》文章,讲到怎样在项目中嵌 入过滤方案的问题,以及提到 xingd 和 sumtec 两位大师发表的系列互拼的文章,在此我也 忍不住谈谈自己遇到的问题以及一个的简化版的算法。

因为过滤关键字机制到处可见,于是聪明的网友就会想到各种各样的方法突破,例如:

1、中文会用繁体字的方法避开关键字扫描

2、在关键字中间插入无意思的特殊字符,例如 * & # @ 等,而且个数可变

3、使用谐音或拆字法变换关键字

在实现自己的算法时也有些问题:

4、随着时间推移,关键字列表会越来越大,有些论坛常用的正则表达式N次扫描的方法显 得效率很低。

5、关键字有不同的严重级别,有些需要禁止,有些只需要替换,还有一些可能记录一下 即可。

针对这些问题,可采用的应对方法:

1、加载关键字列表时,将所有的关键字转换成繁体字一份,以扫描繁体版的关键字;

这个转换工作只需一句就可以实现了:

s=Microsoft.VisualBasic.Strings.StrConv(word, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0);

2、在扫描原文本时,如果遇到关键字的首个文字,忽略其后的特殊字符,直到下一个有 意义的文字为止,当然这里需要在定义关键字列表时指定哪些才需要这样扫描,并不是所有 关键字都采用这种方式;

例如有关键字 “你好”经常会被人输入成“你x好”或者“你xxxxx好”,那么在关键字 列表里就需要定义成“你*好”,在匹配关键字时,如果遇到星号就忽略原文本下一个为特殊 的字符。

3、遇到谐音和拆字时,没什么好办法了,只好将这些谐音词和拆分词也加入到关键字列 表。

4、不用正则表达式或者 String.IndexOf方法,可以将所有关键字的首字相同的组成一个 一个小组,然后在将首字放到一个散列表(HashTable/Dictionary<T>),在扫描原文 本时先在散列表里扫描,如果碰到了首字再扫描同组的关键字,这样简单处理一下效率可以 提高很多。

还有一个比用散列表更好的方法,将散列表改成一个大小为char.MaxValue的数组,然后 将首个文字转成int,即char->int,然后将关键词集合放到相应下标里。这样在扫描原文 本时,将被扫描的字符转成int,然后试探数组相应下标的元素是否不为NULL。这样比用散列 表会更快一些。

时间: 2024-11-03 21:42:43

一个简单的关键字过滤算法的相关文章

艾伟:一个简单的关键字过滤算法

早上看到老赵的<一个较完整的关键字过滤解决方案(上)>文章,讲到怎样在项目中嵌入过滤方案的问题,以及提到 xingd 和 sumtec 两位大师发表的系列互拼的文章,在此我也忍不住谈谈自己遇到的问题以及一个的简化版的算法. 因为过滤关键字机制到处可见,于是聪明的网友就会想到各种各样的方法突破,例如: 1.中文会用繁体字的方法避开关键字扫描2.在关键字中间插入无意思的特殊字符,例如 * & # @ 等,而且个数可变3.使用谐音或拆字法变换关键字 在实现自己的算法时也有些问题: 4.随着时

如何构造一个简单的USB过滤驱动程序

本文分三部分来介绍如何构造一个简单的USB过滤驱动程序,包括"基本原理"."程序的实现"."使用INF安装".此文的目的在于希望读者了解基本原理后,可以使用除DDK以外最流行也最方便的驱动开发工具DriverStudio来实现一个自己的过滤驱动,并正确地安装. 一.基本原理     我们知道,WDM(和KDM)是分层的,在构造设备栈时,IO管理器可以使一个设备对象附加到另外一个初始驱动程序创建的设备对象上.与初始设备对象相关的驱动程序决定的IRP

下个2的幂-一个简单而优雅的算法优化介绍

在并行计算和图形图像等处理中,经常会遇到一类叫做"下个2的幂"的问题,简单说来就是给定一个数,需要找到满足如下条件的一个数: 1. 最靠近这个数 2. 大于或等于这个数 3. 是2的N次方 简单函数描述就是int nextPowerOfTwo(int num); 首先想到的一般算法可能是: int nextPowerOfTwo(int num) { int npot = 1; while( npot < num ) npot <<= 1; return npot; }

一个较完整的关键字过滤解决方案(上)

如果您希望看到关键字过滤算法的话那么可能就要失望了.博客园中已经有不少关于此类 算法的文章(例如这里和这里),虽然可能无法直接满足特定需求,但是已经足够作为参考 使用.而本文的目的,是给出一个较为完整的关键字过滤功能,也就是将用户输入中的敏感 字符进行替换--这两者有什么区别?那么就请继续看下去吧.:) 有趣的需求 关键字过滤功能自然无比重要,但是如果要在代码中对每个输入进行检查和替换则会是一 件非常费神费事的事情.尤其是如果网站已经有了一定规模,用户输入功能已经遍及各处, 而急需对所有输入进行

艾伟:一个较完整的关键字过滤解决方案(上)

如果您希望看到关键字过滤算法的话那么可能就要失望了.博客园中已经有不少关于此类算法的文章(例如这里和这里),虽然可能无法直接满足特定需求,但是已经足够作为参考使用.而本文的目的,是给出一个较为完整的关键字过滤功能,也就是将用户输入中的敏感字符进行替换--这两者有什么区别?那么就请继续看下去吧.:) 有趣的需求 关键字过滤功能自然无比重要,但是如果要在代码中对每个输入进行检查和替换则会是一件非常费神费事的事情.尤其是如果网站已经有了一定规模,用户输入功能已经遍及各处,而急需对所有输入进行关键字过滤

ios-一个简单的图形变换算法,谁来帮帮我

问题描述 一个简单的图形变换算法,谁来帮帮我 我再明确一下问题 输入:平面任意四点坐标:一个边长128像素的正方形素材图 输出:将素材图贴入该平面,任意四点分别对应该素材图四个顶点 如果你的公式能完成以上操作,就告诉我 我要的是能在iOS上跑通的程序 我这里写的公式绝对比你这边的多,但是我都没办法实现,各种原因 好吧,直接求代码,对一个程序员来说,很丢脸了,但我已经只能不要脸了 解决方案 这4个点自然形成一个CGRect, 怎么计算出这个rect 应该不难. 有了这个CGRect, 就可以 im

需要一个简单的逻辑算法思路,求哪位朋友给点建议。

问题描述 需要一个简单的逻辑算法思路,求哪位朋友给点建议. 10C 我已经在MFC中创建一个Clistbox列表,然后打开一个文件夹历遍之后,获得文件夹内所有文件的绝对路径并传送到了Clistbox列表之中.我现在想要做的是,在列表中 按每一定数目的文件(假设20个) 读取,并多开一个线程并将它按某种算法进行加密(类似MD5之类的算法).这个地方 我没有思路. 应该怎么写,调用api函数.有做过类似项目的朋友 给点建议. 解决方案 首先,不是"历遍",是"遍历"然后

求一个简单的算法计算2个时间间隔的工作日。

问题描述 我要的是一个简单的算法计算2个时间间隔的工作日,也就是除去周六和周日,哪位能提供个算法思路,多谢!尽量详细点,谢谢! 解决方案 解决方案二:monday->wednesdaytuesday->tursday......sunday->tuesday解决方案三:看下是不是对的.publicstaticvoidmain(String[]args){try{System.out.println(check(string2Date("2010-4-29"),stri

算法 数据结构 java-求解一个简单的算法问题

问题描述 求解一个简单的算法问题 Generate a 4x4 room and randomly place the dirt in some of the grids. The agent starts at the grid 1 and tries to complete cleaning the dirt in the room. 16 15 14 13 09 10 11 12 08 07 06 05 01 02 03 04 e.g. The room of id 02,08,09,11