netwenk 发表于 2011-12-22 08:54

用于检测敏感词的 PHP 扩展

<div id="blog_text" class="cnt"><div>
<p>敏感词过滤是我朝程序员必须具备的一种特殊技能,随着敏感词越来越多,是时候写个扩展来快速的进行敏感词检测了<br><strong>使用说明</strong></p>
<p>1. 安装 libdatrie<br>tar zxf libdatrie-0.2.4.tar.gz<br>cd libdatrie-0.2.4<br>./configure --prefix=/usr/local<br>make<br>make install</p>
<p>2. 安装 trie_filter 扩展<br>tar zxf trie_filter-1.0.0.tar.gz<br>cd trie_filter-1.0.0<br>/usr/local/php/bin/phpize</p>
<p>./configure&nbsp; --with-php-config=/usr/local/php/bin/php-config<br>make<br>make install<br>记得修改你的 php.ini 文件,启用 trie_filter 扩展。extension=trie_filter.so</p>
<p>&nbsp;</p>
<p>3. 生成词典预处理工具(dpp.c 在 trie_filter-1.0.0 里面)<br>gcc -o dpp dpp.c -ldatrie</p>
<p>4. 生成敏感词词典<br>首先你需要把需要检测的敏感词写入到一个文本文件中(如:minganci.txt),每行一个敏感词,然后使用上一步生成的 dpp 程序处理这个文本文件来生成词典<br>./dpp txt_file_path dict_file_path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;(例:./dpp&nbsp; /home/like/software/minganci.txt&nbsp; minganci.dic</p>
<p>出现如下错误:</p>
<p>./dpp: error while loading shared libraries: libdatrie.so.1: cannot open shared object file: No such file or directory</p>
<p>解决方法:</p>
<p>#vi /etc/ld.so.conf&nbsp; 在里面加入:/usr/local/lib<br>然后运行:#/sbin/ldconfig,即解决</p>
<p>最后再:./dpp&nbsp; /home/like/software/minganci.txt&nbsp; minganci&nbsp; )</p>
<p>&nbsp;</p>
<p>5. 使用扩展<br>扩展接口很简单,只有两个函数:<br>1) trie_filter_load($path_to_dict)<br>用来载入词典,成功返回一个 Trie_Filter 资源句柄,失败返回 NULL<br>2) trie_filter_search($trie, $text)<br>用来检测一段文本中是否含有词典中定义的敏感词,$trie 是上一个函数返回的 Trie Filter 句柄,$text 是欲检测的文本<br>如果检测到敏感词则返回一个数组,数组第一个元素指出检测到的敏感词在 $text 中的偏移量,第二个元素指出该敏感词的长度(bytes)<br>如果没有检测到敏感词,则返回一个空数组</p>
<p><strong>扩展的速度怎么样</strong></p>
<p>一个字,很快!扩展的检测算法基于 Double Array Trie Tree,查找单一关键字的时间复杂度为 O(1),查找整段文本的时间复杂度为 O(n),n 为文本的长度,而且检测的速度不会因为敏感词的增加而降低。</p>
<p><strong>注意事项</strong></p>
<p>1. 扩展把词典和要检测的文本都当做平凡的字节流处理,因此可以无视字符集的问题。但<span style="COLOR: #ff0000">需要注意的是词典的编码需要和检测文本的编码一致(我曾经犯过这样的错误:词典编码和文本编码不一样,生成的词典用不了)</span>,例如词典为 UTF-8 编码而你需要检测的文本为 GBK 编码,这就要求你在调用 trie_filter_search() 函数之前通过 iconv 或者 mb_xxx 函数转换一下编码<br>2. 目前只在 linux + php-5.2 环境下测试通过,不支持 windows,也没有支持的计划</p>

<p><a href="http://blog.anbutu.com/wp-content/uploads/2010/09/trie_filter-1.0.0.tar.gz" target="_blank"><span style="COLOR: #5fa207">trie_filter-1.0.0.tar</span></a></p>
<p><a href="http://blog.anbutu.com/wp-content/uploads/2010/09/libdatrie-0.2.4.tar.gz" target="_blank"><span style="COLOR: #5fa207">libdatrie-0.2.4.tar</span></a></p></div></div>
页: [1]
查看完整版本: 用于检测敏感词的 PHP 扩展