关键词过滤(基于有序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;
}
...全文
267 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程农场 2009-12-06
  • 打赏
  • 举报
回复
以上示例只是演示功能用法。
鱼翅1013 2009-12-06
  • 打赏
  • 举报
回复
mark
mLee79 2009-12-05
  • 打赏
  • 举报
回复
关键字这么少,输入这么短,没1M/秒都不好意思说...
wangqiulei1 2009-12-05
  • 打赏
  • 举报
回复
感觉上比较深奥一些代码,看不懂,先带走了,学习以后在评论
zeroieme 2009-10-14
  • 打赏
  • 举报
回复
反人类项目

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧