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 相关文章推荐
杏林同学录(六)
Oct 09 PHP
请php正则走开
Mar 15 PHP
第六章 php目录与文件操作
Dec 30 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
php实现网站留言板功能
Nov 04 PHP
详解php中反射的应用
Mar 15 PHP
PHP购物车类Cart.class.php定义与用法示例
Jul 20 PHP
php连接mysql数据库
Mar 21 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 PHP
关于php开启错误提示的总结
Sep 24 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
main.php
2006/12/09 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
js判断变量是否空值的代码
2008/10/26 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
js格式化时间小结
2014/11/03 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
浅析python中的分片与截断序列
2016/08/09 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
廉洁校园实施方案
2014/05/25 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python