首页 > php框架 > 中文分词的php代码

中文分词的php代码

以前有用过dedecms分词功能,经过测试还是不理想,后来经过一些处理得到的结果还是可以接受的,今天我再看到这款分词法,拿出来给大家看看。

<?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 类就在下面了, 用 proc_open() 函数来执行分词程序, 并通过管道和其交互, 输入要进行分词的文本, 读取分词结果。


本文地址:http://www.phprm.com/frame/php1005217.html

转载随意,但请附上文章地址:-)

标签:none

发表留言