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检测用户当前使用的浏览器是否为IE浏览器
Dec 03 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
php读取csv文件并输出的方法
Mar 14 PHP
CodeIgniter基于Email类发邮件的方法
Mar 29 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 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制作图型计数器的例子
2006/10/09 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python装饰器语法糖
2019/01/02 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
中学门卫岗位职责
2013/12/26 职场文书
校长先进事迹材料
2014/02/01 职场文书
民主生活会主持词
2015/07/01 职场文书
检讨书之工作不认真
2019/08/14 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
vue实现简易音乐播放器
2022/08/14 Vue.js