PHP中文分词的简单实现代码分享
2015-01-24信息快讯网
对于中文搜索引擎来说, 中文分词是整个系统最基础的部分之一, 因为目前基于单字的中文搜索算法并不是太好。
当然, 本文不是要对中文搜索引擎做研究, 而是分享如果用 PHP 做一个站内搜索引擎。 本文是这个系统中的一篇。我使用的分词工具是中科院计算所的开源版本的 ICTCLAS。 另外还有开源的 Bamboo, 我随后也会对该工具进行调研。
从 ICTCLAS 出发是个不错的选择, 因为其算法传播比较广泛, 有公开的学术文档, 并且编译简单, 库依赖少。 但目前只提供了 C/C++, Java 和 C# 版本的代码, 并没有 PHP 版本的代码。 怎么办呢? 也许可以学习它的 C/C++ 源码和学术文档中, 然后再开发一个 PHP 版本出来。 不过, 我要使用进程间通信, 在 PHP 代码里调用 C/C++ 版本的可执行文件。
下载源码解压后, 在有 C++ 开发库和编译环境的机器上直接 make ictclas 即可。 它的 Makefile 脚本有个错误, 执行测试的代码没有加上'。/', 当然不能像 Windows 下执行成功了。 但也不影响编译结果。
进行中文分词的 PHP 类就在下面了, 用 proc_open() 函数来执行分词程序, 并通过管道和其交互, 输入要进行分词的文本, 读取分词结果。
<?php class NLP{ private static $cmd_path; // 不以'/'结尾 static function set_cmd_path($path){ self::$cmd_path = $path; } private function cmd($str){ $descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), ); $cmd = self::$cmd_path . "/ictclas"; $process = proc_open($cmd, $descriptorspec, $pipes); if (is_resource($process)) { $str = iconv('utf-8', 'gbk', $str); fwrite($pipes[0], $str); $output = stream_get_contents($pipes[1]); fclose($pipes[0]); fclose($pipes[1]); $return_value = proc_close($process); } /* $cmd = "printf '$input' | " . self::$cmd_path . "/ictclas"; exec($cmd, $output, $ret); $output = join("\n", $output); */ $output = trim($output); $output = iconv('gbk', 'utf-8', $output); return $output; } /** * 进行分词, 返回词语列表. */ function tokenize($str){ $tokens = array(); $output = self::cmd($input); if($output){ $ps = preg_split('/\s+/', $output); foreach($ps as $p){ list($seg, $tag) = explode('/', $p); $item = array( 'seg' => $seg, 'tag' => $tag, ); $tokens[] = $item; } } return $tokens; } } NLP::set_cmd_path(dirname(__FILE__)); ?>
使用起来很简单(确保 ICTCLAS 编译后的可执行文件和词典在当前目录):
<?php require_once('NLP.php'); var_dump(NLP::tokenize('Hello, World!')); ?>
PHP 获取文件路径(灵活应用__FILE__)
php设计模式小结
php安全开发 添加随机字符串验证,防止伪造跨站请求
PHP下使用CURL方式POST数据至API接口的代码
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
PHP-redis中文文档介绍
php中使用redis队列操作实例代码
php实现utf-8和GB2312编码相互转换函数代码
php字符串分割函数explode的实例代码
PHP5.4中json_encode中文转码的变化小结
PHP读取数据库并按照中文名称进行排序实现代码
PHP中文分词 自动获取关键词介绍
php图片加中文水印实现代码分享
PHP中用hash实现的数组
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
从手册去理解分析PHP session机制
php数组的一些常见操作汇总
PHP在特殊字符前加斜杠的实现代码
PHP的explode和implode的使用说明
PHP冒泡排序算法代码详细解读
PHP中改变图片的尺寸大小的代码
php中用foreach来操作数组的代码
PHP写杨辉三角实例代码
php中截取中文字符串的代码小结
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
Windows下利用Gvim写PHP产生中文乱码问题解决方法
适用于php-5.2 的 php.ini 中文版[金步国翻译]
php处理json时中文问题的解决方法
php 一元分词算法