PHP中文分词的简单实现代码分享


Posted in PHP onJuly 17, 2011

当然, 本文不是要对中文搜索引擎做研究, 而是分享如果用 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 相关文章推荐
通过具体程序来理解PHP里面的抽象类
Jan 28 PHP
在字符串指定位置插入一段字符串的php代码
Feb 16 PHP
理解php Hash函数,增强密码安全
Feb 25 PHP
PHP filter_var() 函数 Filter 函数
Apr 25 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
PHP访问Google Search API的方法
Mar 05 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
Mar 14 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
实现php删除链表中重复的结点
Sep 27 PHP
PHP操作XML中XPath的应用示例
Jul 04 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 #PHP
从手册去理解分析PHP session机制
Jul 17 #PHP
php数组的一些常见操作汇总
Jul 17 #PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 #PHP
PHP的explode和implode的使用说明
Jul 17 #PHP
PHP冒泡排序算法代码详细解读
Jul 17 #PHP
MySQL连接数超过限制的解决方法
Jul 17 #PHP
You might like
DedeCms模板安装/制作概述
2007/03/11 PHP
非常精妙的PHP递归调用与静态变量使用
2012/12/16 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
Pytorch之Variable的用法
2019/12/31 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
毕业生的自我鉴定
2013/10/29 职场文书
秋季运动会稿件
2014/01/30 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
工作收入证明范本
2015/06/12 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书