当前位置: 首页 > 图文教程 > 网络编程 > PHP > “懒人”的做法:用PHP简易实现中文分词

PHP
PHP中的代码安全和SQL Injection防范
PHP数组实例总结及说明
一个php的图片水印的程序
PHP常见漏洞被攻击原因分析
PHP 5.2.8 紧急发布 修复5.2.7严重漏洞
编写安全 PHP 应用程序的七个习惯
PHP中常用的函数库和一些小技巧
PHP安全基础原则与方法
PHP函数速查表
PHP开发语言中的精华和技巧
测试在每个层上对PHP代码进行检查
不同文件构建PHP程序的正确方式
用phpinfo来实现PHP配置统计
更好的构造开发模板 五种常见的PHP设计模式
PHP的十个高级技巧
PHP对文本数据库的基本操作方法
967个函式列表 PHP常用语法速查表
实用:JAVA事件模式下PHP如何实现
针对配置文件 PHP最常用的ini函数
用PHP开发qmail邮件服务器管理系统

“懒人”的做法:用PHP简易实现中文分词


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 130 ::
收藏到网摘: n/a

作者: Maco 

 

hehe, 用PHP去做中文分词并不是一个太明智的举动, :p

下面是我根据网上找的一个字典档, 简易实现的一个分词程序.

(注: 字典档是gdbm格式, key是词 value是词频, 约4万个常用词)

完整的程序演示及下载请参见: http://root.twomice.net/my_php4/dict/chinese_segment.php

<?php
//中文分词系统简易实现办法
//切句单位:凡是ascii值<128的字符
//常见双字节符号:《》,。、?“”;:!¥…… %$#@^&*()[]{}|\/"'
//可以考虑加入超常见中文字: 的 和 是 不 了 啊 (不过有特殊字比如 "打的" "郑和" .. :p)

//计算时间
function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}
$time_start = getmicrotime();


//词典类
class ch_dictionary {
    var $_id;

    function ch_dictionary($fname = "") {
        if ($fname != "") {
            $this->load($fname);
        }
    }

    // 根据文件名载入字典 (gdbm数据档案)
    function load($fname) {
        $this->_id = dba_popen($fname, "r", "gdbm");
        if (!$this->_id) {
            echo "failed to open the dictionary.($fname)<br>\n";
            exit;
        }
    }

    // 根据词语返回频率, 不存在返回-1
    function find($word) {
        $freq = dba_fetch($word, $this->_id);
        if (is_bool($freq)) $freq = -1;
        return $freq;
    }
}

// 分词类: (逆向)
// 先将输入的字串正向切成句子, 然后一句一句的分词, 返回由词组成的数组.
class ch_word_split {
    var $_mb_mark_list;    // 常见切分句子的全角标点
    var $_word_maxlen;    // 单个词最大可能长度(汉字字数)
    var $_dic;        // 词典...
    var $_ignore_mark;    // true or false
   
    function ch_word_split () {
        $this->_mb_mark_list = array(","," ","。","!","?",":","……","、","“","”","《","》","(",")");
        $this->_word_maxlen  = 12;    // 12个汉字
        $this->_dic = NULL;
        $this->_ignore_mark = true;
    }

    // 设定字典
    function set_dic($fname) {
        $this->_dic = new ch_dictionary($fname);
    }

    function set_ignore_mark($set) {
        if (is_bool($set)) $this->_ignore_mark = $set;
    }

    // 将字串切成句子再加以切分成词
    function string_split($str, $func = "") {       
        $ret = array();
       
        if ($func ==