查看: 6060|回复: 0
打印 上一主题 下一主题

一个用PHP写的中文分词函数一个用PHP写的中文分词函数

[复制链接]
跳转到指定楼层
1#
发表于 2007-9-14 00:37:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
<?php
class Segmentation {
    var $options = array('lowercase' => TRUE,
                         'segment_english' => FALSE);
    var $dict_name = 'Unknown';
    var $dict_words = array();
    function setLowercase($value) {
        if ($value) {
            $this->options['lowercase'] = TRUE;
        } else {
            $this->options['lowercase'] = FALSE;
        }
        return TRUE;
    }
    function setSegmentEnglish($value) {
        if ($value) {
            $this->options['segment_english'] = TRUE;
        } else {
            $this->options['segment_english'] = FALSE;
        }
        return TRUE;
    }
    function load($dict_file) {
        if (!file_exists($dict_file)) {
            return FALSE;
        }
        $fp = fopen($dict_file, 'r');
        $temp = fgets($fp, 1024);
        if ($temp === FALSE) {
            return FALSE;
        } else {
            if (strpos($temp, "\t") !== FALSE) {
                list ($dict_type, $dict_name) = explode("\t", trim($temp));
            } else {
                $dict_type = trim($temp);
                $dict_name = 'Unknown';
            }
            $this->dict_name = $dict_name;
            if ($dict_type !== 'DICT_WORD_W') {
                return FALSE;
            }
        }
        while (!feof($fp)) {
            $this->dict_words[rtrim(fgets($fp, 32))] = 1;
        }
        fclose($fp);
        return TRUE;
    }
    function getDictName() {
        return $this->dict_name;
    }
    function segmentString($str) {
        if (count($this->dict_words) === 0) {
            return FALSE;
        }
        $lines = explode("\n", $str);
        return $this->_segmentLines($lines);
    }
    function segmentFile($filename) {
        if (count($this->dict_words) === 0) {
            return FALSE;
        }
        $lines = file($filename);
        return $this->_segmentLines($lines);
    }
    function _segmentLines($lines) {
        $contents_segmented = '';
        foreach ($lines as $line) {
            $contents_segmented .= $this->_segmentLine(rtrim($line)) . " \n";
        }
        do {
            $contents_segmented = str_replace('  ', ' ', $contents_segmented);
        } while (strpos($contents_segmented, '  ') !== FALSE);
        return $contents_segmented;
    }
    function _segmentLine($str) {
        $str_final = '';
        $str_array = array();
        $str_length = strlen($str);
        if ($str_length > 0) {
            if (ord($str{$str_length-1}) >= 129) {
                $str .= ' ';
            }
        }
        for ($i=0; $i<$str_length; $i++) {
            if (ord($str{$i}) >= 129) {
                $str_array[] = $str{$i} . $str{$i+1};
                $i++;
            } else {
                $str_tmp = $str{$i};
                for ($j=$i+1; $j<$str_length; $j++) {
                    if (ord($str{$j}) < 129) {
                        $str_tmp .= $str{$j};
                    } else {
                        break;
                    }
                }
                $str_array[] = array($str_tmp);
                $i = $j - 1;
            }
        }
  
        $pos = count($str_array);
        while ($pos > 0) {
            $char = $str_array[$pos-1];
            if (is_array($char)) {
                $str_final_tmp = $char[0];
                if ($this->options['segment_english']) {
                    $str_final_tmp = preg_replace("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f]+)/", " $1 ", $str_final_tmp);
                    $str_final_tmp = preg_replace("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])/", " $1 $2 ", $str_final_tmp);
                }
                if ($this->options['lowercase']) {
                    $str_final_tmp = strtolower($str_final_tmp);
                }
                $str_final = " $str_final_tmp$str_final";
                $pos--;
            } else {
                $word_found = 0;
                $word_array = array(0 => '');
                if ($pos < 4) {
                    $word_temp = $pos + 1;
                } else {
                    $word_temp = 5;
                }
                for ($i=1; $i<$word_temp; $i++) {
                    $word_array[$i] = $str_array[$pos-$i] . $word_array[$i-1];
                }
   
                for ($i=($word_temp-1); $i>1; $i--) {
     
                    if (array_key_exists($word_array[$i], $this->dict_words)) {
                       $word_found = $i;
                       break;
                    }
                }
                if ($word_found) {
                    $str_final = " $word_array[$word_found]$str_final";
                    $pos = $pos - $word_found;
                } else {
                    $str_final = " $char$str_final";
                    $pos--;
                }
            }
        }
        return $str_final;
    }
}
?>
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表