PHP中文分词的简单实现

对于中文搜索引擎来说, 中文分词是整个系统最基础的部分之一, 因为目前基于单字的中文搜索算法并不是太好。 当然, 本文不是要对中文搜索引擎做研究, 而是分享如果用 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!‘));
?>

时间: 2025-01-02 16:48:01

PHP中文分词的简单实现的相关文章

【中文分词】结构化感知器SP

结构化感知器(Structured Perceptron, SP)是由Collins [1]在EMNLP'02上提出来的,用于解决序列标注的问题.中文分词工具THULAC.LTP所采用的分词模型便是基于此. 1. 结构化感知器 模型 CRF全局化地以最大熵准则建模概率P(Y|X)P(Y|X):其中,XX为输入序列xn1x1n,YY为标注序列yn1y1n.不同于CRF,SP则是(同样以最大熵准则)建模score函数: S(Y,X)=∑sαsΦs(Y,X)S(Y,X)=∑sαsΦs(Y,X) 其中,

数学之美札记:谈谈中文分词

之前的札记中,提到了使用统计语言模型进行自然语言的处理,而这些语言模型是建立在词的基础上,因为词是表达语义的最小单位.西方的拼音语言,词之间有明确的分界符,统计和使用语言模型处理相对简单.而对于汉语等东方语言,词之间没有明确的分界符,这就需要先对句子进行中文分词. 中文分词最简单的方式是查字典,这种方式最早由北京航空航天大学的梁南元教授提出.简单的来说,就是把一个句子从左到右扫描一遍,遇到字典里有的词就标识出来,遇到复合词(比如"上海大学")就找最长的词匹配, 遇到不认识的字串就分割成

【Java】Java中文分词器Ansj的使用

以前都是用C++对中文进行分词,也用过Python的"结巴"分词,最近用了一下Java的Ansj中文分词,感觉还不错. 下面是用Ansj对中文进行分词的一个简单例子,希望能对大家有用. 1.下载Ansj的相关jar包 要用Ansj进行中文分词,必须先下载Ansj的jar包,下载地址可以参考:https://github.com/NLPchina/ansj_seg 2.程序代码 用Ansj进行中文分词的简单代码如下所示: import org.ansj.splitWord.analysi

简单中文分词系统的实现

中文分词系统工程报告 一.研究背景 随着互联网的快速发展,信息也呈了爆炸式的增长趋势.在海量的信息中,我们如何快速抽取出有效信息成为了必须要解决的问题.由于信息处理的重复性,而计算机又善于处理机械的.重复的.有规律可循的工作,因此自然就想到了利用计算机来帮助人们进行处理.在用计算机进行自然语言处理时,主要使用的还是基于统计的方法,并且实际的使用中取得了不错的效果. 因为中文句子的特点——没有分隔符来分离句子中的词,所以在进行中文处理的时候,首先要做的就是如何对中文语句进行分词.这也是本次工程所要

30.IK中文分词器的安装和简单使用

在之前我们学的都是英文,用的也是英文的standard分词器.从这一节开始,学习中文分词器.中国人基本上都是中文应用,很少是英文的,而standard分词器是没有办法对中文进行合理分词的,只是将每个中文字符一个一个的切割开来,比如说中国人 --> 中 国 人 在中方搜索引擎领域,比较成熟和流行的,就是ik分词器. 一.在elasticsearch中安装ik中文分词器 (1)git clone https://github.com/medcl/elasticsearch-analysis-ik (

PHP中文分词扩展 SCWS

1.scws简介 SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统). 这是一套基于词频词典的机械式中文分词引擎,它能将一整段的中文文本基本正确地切分成词. 词是中文的最小语素单位,但在书写时并不像英语会在词之间用空格分开, 所以如何准确并快速分词一直是中文分词的攻关难点. SCWS 采用纯 C 语言开发,不依赖任何外部库函数,可直接使用动态链接库嵌入应用程序, 支持的中文编码包括 GBK.UTF-8 等.此外还提供了 PHP 扩

中文分词实践(基于R语言)

背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来,然后做中文分词+词频统计,最后将统计结果简单做个标签云,效果如下: 后续:中文分词是中文信息处理的基础,分词之后,其实还有特别多有趣的文本挖掘工作可以做,也是个知识发现的过程,以后有机会再学习下. ================================================== * 中文分词常用实现: 单机:R语言+Rwordseg分词包 (建议数据量<1G) 分布式:Hadoop+Smallse

中文分词之结巴分词~~~附使用场景+demo

常用技能(更新ing):http://www.cnblogs.com/dunitian/p/4822808.html#skill 技能总纲(更新ing):http://www.cnblogs.com/dunitian/p/5493793.html 在线演示:http://cppjieba-webdemo.herokuapp.com 完整demo:https://github.com/dunitian/TempCode/tree/master/2016-09-05 先说下注意点,结巴分词他没有对分

python 读写txt文件并用jieba库进行中文分词

python用来批量处理一些数据的第一步吧. 对于我这样的的萌新.这是第一步. #encoding=utf-8 file='test.txt' fn=open(file,"r") print fn.read() fn.close() 在控制台输出txt文档的内容,注意中文会在这里乱码.因为和脚本文件放在同一个地方,我就没写路径了. 还有一些别的操作. 这是文件open()函数的打开mode,在第二个参数中设置.特别需要注意一下.具体还有一些别的细节操作. http://www.jb51