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 相关文章推荐
PR值查询 | PageRank 查询
Dec 20 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
Smarty安装配置方法
Apr 10 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
Jun 24 PHP
PHP文件上传主要代码讲解
Sep 30 PHP
PHP多进程编程实例
Oct 15 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
6个超实用的PHP代码片段
Aug 10 PHP
Yii操作数据库实现动态获取表名的方法
Mar 29 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 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 adodb操作mysql数据库
2009/03/19 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
javascript 写类方式之四
2009/07/05 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
vue2.0.js的多级联动选择器实现方法
2018/02/09 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
Python中zfill()方法的使用教程
2015/05/20 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
python文件编写好后如何实践
2020/07/07 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
悬挂训练绳:TRX
2017/12/14 全球购物
《美丽的田园》教学反思
2014/03/01 职场文书
写字楼租赁意向书
2014/07/30 职场文书
迎新生欢迎词
2015/01/23 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
SpringAop日志找不到方法的处理
2021/06/21 Java/Android