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正则
Jul 07 PHP
php 显示指定路径下的图片
Oct 29 PHP
基于MySQL体系结构的分析
May 02 PHP
php中的strpos使用示例
Feb 27 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
Aug 20 PHP
php 利用array_slice函数获取随机数组或前几条数据
Sep 30 PHP
PHP实现清除wordpress里恶意代码
Oct 21 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
php cli模式下获取参数的方法
May 05 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
解决laravel资源加载路径设置的问题
Oct 14 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
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
laravel自定义分页效果
2017/07/23 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
python 切片和range()用法说明
2013/03/24 Python
Python中的jquery PyQuery库使用小结
2014/05/13 Python
python中argparse模块用法实例详解
2015/06/03 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
python hook监听事件详解
2018/10/25 Python
Python对excel文档的操作方法详解
2018/12/10 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
硕士生工作推荐信
2014/03/07 职场文书
汽车车尾标语大全
2015/08/11 职场文书
python单元测试之pytest的使用
2021/06/07 Python
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
Hive HQL支持2种查询语句风格
2022/06/25 数据库