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 相关文章推荐
别人整理的服务器变量:$_SERVER
Oct 20 PHP
一个PHP日历程序
Dec 06 PHP
PHP5与MySQL数据库操作常用代码 收集
Mar 21 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
Jul 25 PHP
php生成动态验证码gif图片
Oct 19 PHP
Yii2中如何使用modal弹窗(基本使用)
May 30 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
Apr 10 PHP
php数组遍历类与用法示例
May 24 PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 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
地摊中国 - 珍藏老照片
2020/08/18 杂记
PHP递归调用的小技巧讲解
2013/02/19 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
PHPstorm激活码2020年5月13日亲测有效
2020/09/17 PHP
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
Python中的FTP通信模块ftplib的用法整理
2016/07/08 Python
Python中内置的日志模块logging用法详解
2016/07/12 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
python将视频转换为全字符视频
2019/04/26 Python
python函数的万能参数传参详解
2019/07/26 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
在职研究生自我鉴定
2013/10/16 职场文书
大学学年自我鉴定
2013/10/28 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python
Linux中如何安装并部署Redis
2022/04/18 Servers