项目背景
对于用户发表的内容,我们通常要做一些敏感词的检测,如果敏感词规模很小,逐个词进行 Search 也没啥大问题;但如果敏感词规模很大,并且会逐渐积累,那么就需要一种新的算法来提高检测效率。
实现原理
采用红黑树来存储敏感词汇列表,采用全分词算法来检测敏感词。
项目安装
>> wget "http://pysoft.googlecode.com/files/filter_keywords-0.1.tar.gz">> tar -zxf http://pysoft.googlecode.com/files/filter_keywords-0.1.tar.gz>> cd filter_keywords-0.1>> python setup.py install
使用样例
>> import filter_keywords>> dir(filter_keywords)['FkwDict', '__doc__', '__file__', '__name__', 'filter_keywords', 'fkw_full_seg']
创建字典
>> from filter_keywords import FkwDict>> fkw_dict = FkwDict(10) # 参数为 Hash 的大小,可根据关键词规模自行调整>> dir(fkw_dict)['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'add_word', 'load_dict', 'search_word']
添加一个关键词
>> fkw_dict.add_word(u"叮当猫".encode("utf-8")) # 只接受 utf-8 编码,内部不做编码检测>> fkw_dict.search_word(u"叮当猫".encode("utf-8")) True>> fkw_dict.search_word(u"叮当猫2".encode("utf-8")) False
加载字典文件
fkw_dict.load_dict("src/word.txt") # 字典文件只接受 utf-8 编码,每行一个关键词print fkw_dict.search_word(u'世界'.encode("utf-8"))
注: 网上收集了一个字典文件,下载地址如下:
敏感词检测
text = u"工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作 "result = filter_keywords(fkw_dict, text.encode("utf-8"))print " ".join([unicode(item, "utf-8").encode("GBK") for item in result])
检测结果
工信 处女 干事 每月 月经 经过 下属 科室 都要 亲口 口交 交代 口交 交换 交换机 技术 技术性 性器 器件 安装 工作
其它信息
被你看出来了,其实,我是做分词的,全分词算法 函数 filter_keywords 只是 fkw_full_seg 的 alias。
使用 mem_collector 管理内存,红黑树存储字典条目,经 Valgrind 检测,无内存泄漏。 欢迎下载试用,有问题麻烦及时反馈,谢谢。
注:mem_collector 项目
C 语言接口,请参照 src/test.c 文件。