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中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
Oct 09 PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
Jun 29 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
基于PHP实现通过照片获取ip地址
Apr 26 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
Oct 25 PHP
php版微信小店API二次开发及使用示例
Nov 12 PHP
PHP实现非阻塞模式的方法分析
Jul 26 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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
header导出Excel应用示例
2014/01/24 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
python+pandas分析nginx日志的实例
2018/04/28 Python
TensorFlow实现模型评估
2018/09/07 Python
Django 路由控制的实现代码
2018/11/08 Python
浅谈numpy生成数组的零值问题
2018/11/12 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
竞聘副主任科员演讲稿
2014/01/11 职场文书
事业单位请假制度
2014/01/13 职场文书
工程部经理岗位职责
2015/02/02 职场文书
大学生英文求职信范文
2015/03/19 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
七夕情人节问候语
2015/11/11 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL