关键词过滤(基于有序HASH-trie树SDK应用2)
编程农场 2009-10-14 09:03:56 1、关键词过滤功能介绍
目前互联网、电信等应用中需要对关键词进行过滤控制,例如以下应用需求:
1、文本关键词过滤
1)论坛标题和内容需要对特定关键词信息进行分类过滤处理。
2)对电子邮件标题和内容中的关键词进行分类过滤处理。
3)对短信、彩信文本内容进行中的关键词过滤控制。
2、对邮件地址、URL地址、域名地址、IP地址等关键信息进行进行过滤
3、对电信应用中的电话号码或号段信息进行过滤控制
4、其它过滤应用需求
本文主要介绍文本关键词信息的过滤控制,基于有序HASH树数据结构开发的文本过滤引擎可以对以下形式关键词进行过滤:
1、关键词集合:自*由、平*等、博*爱
对以下文本进行过滤:
争 取 人 身 自 由 解 放 法 律 面 前 人 人 平 等 提 倡 博 爱 理 念 是 空 想
可以过滤出关键词:自 由、平 等、博 爱
2、关键词集合:%自%由%、%平?等%、%博?爱%
通配符%代表任意长度字符串,? 代表任意1字节长度字符串。
对以下文本进行过滤:
争取人身自#*由解放法律面前人人平@#等提倡博^&爱理念是空想
可以过滤出关键词:自 由、平 等、博 爱
2、功能实现原理
基于有序HASH树进行关键词的实现原理是把要过滤的关键词插入到HASH树中,
然后使用SDK中的反向模糊匹配函数对要过滤的文本进行处理,即可返回关键词列表。
关于有序HASH树请参考以下网址:
http://topic.csdn.net/u/20090820/08/cd6917ee-b22e-412f-8bf1-9afd6770c7e8.html
作者联系方式:
e-mail:freeland007@163.com
QQ: 723273055
3、关键词过滤技术特点
1、支持超大规模关键词集合
对32位计算机系统,支持上百万的关键词;对64位计算机系统,关键词的数量没有限制。
2、过滤速度快
基于有序HASH树的关键词过滤引擎的过滤速度与关键词集合中的数量无关,于被过滤的文本长度相关。
3、支持精确过滤和模糊过滤
4、关键词过滤技术指标
1、过滤速度
1)测试环境:
(1)32位windows xp操作系统
(2)1G DDR2内存
(3)CPU:AMD LE1100/1.9GHz
2)关键词集合
%白骨%
%包衣%
%抵抗%
%汉奸%
%黄马褂%
%狼图腾%
%老佛爷%
%六%合%彩%
%马粪%
%买马%
%奶粉%
%奴才%
%施琅%
%唐装%
%投降%
%小富贵%
%小李子%
%美国%
%阎崇年%
%猪尾巴%
3)过滤文本
灵魂上拖着猪&尾&巴样的辫子,身批黄马褂,穿着唐装看那些留在地上的白骨和马粪,唱起包衣赞美的诗篇
4)过滤结果
(1)过滤出所有关键词才返回
过滤速度:18,000次/秒
(2)过滤出一个关键词即返回
过滤速度:15万次/秒
2、最大关键词长度
255个字节
3、容量大
支持上千万关键词
5、 关键词过滤源码实例
示例:
功能:在一段文本中所有的关键词。
#include <stdio.h>
#include "HashTree.h"
bool FilterProc(LPSELECTCOND pCond)
{
char sKey[32];
HTreeGetCurrentKey(pCond, 0, sKey);
printf("%s\r\n", sKey);
return true;
}
int AccessSingle(HANDLE hTree, char* sKey)
{
SELECTCOND pSelectCond;
pSelectCond.hTree = hTree;
pSelectCond.nMethod[0] = RTDB_METHOD_MATCH;
pSelectCond.sIndexValue[0] = sKey;
pSelectCond.bEnableTop = false;
pSelectCond.nTopCount = 1;
pSelectCond.pFilterAPI = FilterProc;
pSelectCond.pFilterPara = NULL;
HTreeSelect(&pSelectCond);
return 0;
}
int main(int nArgc, char* sArgv[])
{
MEMINITINFO MemInitInfo;
MemInitInfo.nSysMaxIdleCount = 1000000;
MemInitInfo.nAppMaxIdleCount = 1000000;
int nRet;
nRet = HTSysInit(&MemInitInfo);
if(nRet != 0)
{
return nRet;
}
HANDLE hTree;
HTREEDESC TreeDesc;
TreeDesc.nColumn = 1;
TreeDesc.nColDataType[0] = CACHE_STRING;
hTree = HTreeCreate(&TreeDesc);
char* sKeyWord[34];
sKeyWord[0] = "%3d%";
sKeyWord[1] = "%白骨%";
sKeyWord[2] = "%包衣%";
sKeyWord[3] = "%成吉思汗%";
sKeyWord[4] = "%抵抗%";
sKeyWord[5] = "%药品%";
sKeyWord[6] = "%金钱%";
sKeyWord[7] = "%福利社会%";
sKeyWord[8] = "%汉奸%";
sKeyWord[9] = "%黄马褂%";
sKeyWord[10] = "%狼图腾%";
sKeyWord[11] = "%老佛爷%";
sKeyWord[12] = "%六彩%";
sKeyWord[13] = "%马粪%";
sKeyWord[14] = "%买驴%";
sKeyWord[15] = "%奶粉%";
sKeyWord[16] = "%奴才%";
sKeyWord[17] = "%老枪%";
sKeyWord[18] = "%三鹿%";
sKeyWord[19] = "%施琅%";
sKeyWord[20] = "%白球%";
sKeyWord[21] = "%丹麦%";
sKeyWord[22] = "%台%湾%";
sKeyWord[23] = "%唐装%";
sKeyWord[24] = "%投降%";
sKeyWord[25] = "%投注%";
sKeyWord[26] = "%屠*杀%";
sKeyWord[27] = "%英%国%";
sKeyWord[28] = "%下注%";
sKeyWord[29] = "%小富贵%";
sKeyWord[30] = "%小李子%";
sKeyWord[31] = "%新家坡%";
sKeyWord[32] = "%阎崇年%";
sKeyWord[33] = "%猪%尾%巴%";
int i;
for (i = 0; i <= 33; i++)
{
char* sMultiKey[32];
sMultiKey[0] = sKeyWord[i];
HTreeAddKey(hTree, sMultiKey, (void *)(i+1));
}
AccessSingle(hTree, "灵魂上拖着猪&尾&巴样的辫子,身批黄马褂,穿着唐装看那些留在地上的白骨和马粪,
唱起包衣赞美的诗篇");
HTSysDestroy();
return 0;
}