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 相关文章推荐
AJAX for PHP简单表数据查询实例
Jan 02 PHP
PHP迅雷、快车、旋风下载专用链转换代码
Jun 15 PHP
兼容性比较好的PHP生成缩略图的代码
Jan 12 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 PHP
PHP使用正则表达式清除超链接文本
Nov 12 PHP
PHP获取一个字符串中间一部分字符的方法
Aug 19 PHP
Chrome Web App开发小结
Sep 04 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 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基础陷阱题(变量赋值)
2012/09/12 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php把session写入数据库示例
2014/02/26 PHP
获取body标签的两种方法
2011/10/13 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
js中日期的加减法
2015/05/06 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
vuex vue简单使用知识点总结
2019/08/29 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
ES6 十大特性简介
2020/12/09 Javascript
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
python中eval与int的区别浅析
2019/08/11 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
Python绘制动态水球图过程详解
2020/06/03 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
如何用Python 加密文件
2020/09/10 Python
python批量修改文件名的示例
2020/09/27 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
核心价值观演讲稿
2014/05/13 职场文书
匿名信格式范文
2015/05/27 职场文书
2016大学军训心得体会
2016/01/11 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server