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版(5)
Oct 09 PHP
php代码把全角数字转为半角数字
Dec 10 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
php引用计数器进行垃圾收集机制介绍
Sep 19 PHP
destoon实现首页显示供应、企业、资讯条数的方法
Jul 15 PHP
php查看当前Session的ID实例
Mar 16 PHP
php查询mysql数据库并将结果保存到数组的方法
Mar 18 PHP
php解析mht文件转换成html的实例
Mar 13 PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
微信小程序实现底部弹出模态框
2020/11/18 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
Python实现随机漫步功能
2018/07/09 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
python实现大文件分割与合并
2019/07/22 Python
python 发送json数据操作实例分析
2019/10/15 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
android面试问题与答案
2016/12/27 面试题
NET程序员上机面试题
2015/05/23 面试题
Servlet的生命周期
2013/08/25 面试题
优秀医生事迹材料
2014/02/12 职场文书
销售员试用期自我评价
2014/09/15 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
高效课堂教学反思
2016/02/24 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
mysql部分操作
2021/04/05 MySQL
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis