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完全过滤HTML,JS,CSS等标签
Jan 16 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
PHP自定义函数收代码
Aug 01 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
PHP结合Vue实现滚动底部加载效果
Dec 17 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
PHP如何通过表单直接提交大文件详解
Jan 08 PHP
PHP实现字符串大小写转函数的功能实例
Feb 06 PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 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中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
php网页病毒清除类
2014/12/08 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
有趣的javascript数组定义方法
2010/09/10 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
2017/09/30 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
python将图片文件转换成base64编码的方法
2015/03/14 Python
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
基于python爬虫数据处理(详解)
2017/06/10 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
PyQt5实现下载进度条效果
2018/04/19 Python
对Python信号处理模块signal详解
2019/01/09 Python
Python语言异常处理测试过程解析
2020/01/08 Python
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
Ajax实现页面无刷新留言效果
2021/03/24 Javascript
应届毕业生个人自荐信范文
2013/11/30 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
政风行风评议整改方案
2014/09/15 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书