对于用户发表的内容,我们通常要做一些敏感词的检测,如果敏感词规模很小,逐个词进行 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"))
注: 网上收集了一个字典文件,下载地址如下:
http://pysoft.googlecode.com/svn/trunk/c-project/filter_keywords/src/word.txt
敏感词检测
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 项目
http://chinaren.wei.blog.163.com/blog/static/13907612920103225325129/
C 语言接口,请参照 src/test.c 文件。