• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP中文分词的简单实现代码分享_php技巧

php 搞代码 3年前 (2022-01-26) 35次浏览 已收录 0个评论

当然, 本文不是要对中文搜索引擎做研究, 而是分享如果用 PHP 做一个站内搜索引擎。 本文是这个系统中的一篇。
我使用的分词工具是中科院计算所的开源版本的 ICTCLAS。 另外还有开源的 Bamboo, 我随后也会对该工具进行调研。
从 ICTCLAS 出发是个不错的选择, 因为其算法传播比较广泛, 有公开的学术文档, 并且编译简单, 库依赖少。 但目前只提供了 C/C++, Java 和 C# 版本的代码, 并没有 PHP 版本的代码。 怎么办呢? 也许可以学习它的 C/C++ 源码和学术文档中, 然后再开发一个 PHP 版本出来。 不过, 我要使用进程间通信, 在 PHP 代码里调用 C/C++ 版本的可执行文件。
下载源码解压后, 在有 C++ 开发库和编译环境的机器上直接 make ictclas 即可。 它的 Makefile 脚本有个错误, 执行测试的代码没有加上’。/’, 当然不能像 Windows 下执行成功了。 但也不影响编译结果。
进行中文分词的 PHP 类就在下面了, 用 proc_open() 函数来执行分词程序, 并通过管道和其交互, 输入要进行分词的文本, 读取分词结果。

 <BR><?php <BR>class NLP{ <BR>private static $cmd_path; <BR>// 不以'/'结尾 <BR>static function set_cmd_path($path){ <BR>self::$cmd_path = $path; <BR>} <BR>private function cmd($str){ <BR>$descriptorspec = array( <BR>0 => array("pipe", "r"), <BR>1 => array("pipe", "w"), <BR>); <BR>$cmd = self::$cmd_path . "/ictclas"; <BR>$process = proc_open($cmd, $descriptorspec, $pipes<span>@本文来*源gaodai#ma#com搞*!代#%^码$网*</span><textarea>搞gaodaima代码</textarea>); <BR>if (is_resource($process)) { <BR>$str = iconv('utf-8', 'gbk', $str); <BR>fwrite($pipes[0], $str); <BR>$output = stream_get_contents($pipes[1]); <BR>fclose($pipes[0]); <BR>fclose($pipes[1]); <BR>$return_value = proc_close($process); <BR>} <BR>/* <BR>$cmd = "printf '$input' | " . self::$cmd_path . "/ictclas"; <BR>exec($cmd, $output, $ret); <BR>$output = join("\n", $output); <BR>*/ <BR>$output = trim($output); <BR>$output = iconv('gbk', 'utf-8', $output); <BR>return $output; <BR>} <BR>/** <BR>* 进行分词, 返回词语列表. <BR>*/ <BR>function tokenize($str){ <BR>$tokens = array(); <BR>$output = self::cmd($input); <BR>if($output){ <BR>$ps = preg_split('/\s+/', $output); <BR>foreach($ps as $p){ <BR>list($seg, $tag) = explode('/', $p); <BR>$item = array( <BR>'seg' => $seg, <BR>'tag' => $tag, <BR>); <BR>$tokens[] = $item; <BR>} <BR>} <BR>return $tokens; <BR>} <BR>} <BR>NLP::set_cmd_path(dirname(__FILE__)); <BR>?> <BR>


使用起来很简单(确保 ICTCLAS 编译后的可执行文件和词典在当前目录):

 <BR><?php <BR>require_once('NLP.php'); <BR>var_dump(NLP::tokenize('Hello, World!')); <BR>?> <BR>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP中文分词的简单实现代码分享_php技巧
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址