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 flush类输出缓冲剖析
Oct 19 PHP
几款免费开源的不用数据库的php的cms
Dec 19 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
Nov 07 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
通过源码解析Laravel的依赖注入
Jan 22 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
PHP校验15位和18位身份证号的类封装
Nov 07 PHP
PHP的PDO预处理语句与存储过程
Jan 27 PHP
解决Laravel无法使用COOKIE和SESSION的问题
Oct 16 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 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
基于文本的访客签到簿
2006/10/09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
php下将XML转换为数组
2010/01/01 PHP
php修改时间格式的代码
2011/05/29 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
轮播图组件js代码
2016/08/08 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
Windows下python3.7安装教程
2018/07/31 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
如何使用python传入不确定个数参数
2020/02/18 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
会计电算化学生个人的自我评价
2014/02/08 职场文书
安全生产管理责任书
2014/04/16 职场文书
节能宣传周活动总结
2014/05/08 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书