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 相关文章推荐
什么是MVC,好东西啊
May 03 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
PHP 手机归属地查询 api
Feb 08 PHP
浅析php中常量,变量的作用域和生存周期
Aug 10 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
Oct 20 PHP
经典PHP加密解密函数Authcode()修复版代码
Apr 05 PHP
smarty高级特性之过滤器的使用方法
Dec 25 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
php微信公众号开发(3)php实现简单微信文本通讯
Dec 15 PHP
详解如何在云服务器上部署Laravel
Jun 30 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
Jul 26 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python中optparse模块使用浅析
2015/01/01 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
对Python中range()函数和list的比较
2018/04/19 Python
python实现五子棋小游戏
2020/03/25 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
django中的数据库迁移的实现
2020/03/16 Python
python中数字是否为可变类型
2020/07/08 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
linux比较文件内容的命令是什么
2015/09/23 面试题
创业计划实施的7大步骤
2014/02/05 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
党员剖析材料范文
2014/09/30 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
CSS基础详解
2021/10/16 HTML / CSS
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS