首页 > 开发 > PHP > 正文

一个用php写的中文分词类

2024-05-04 23:00:03
字体:
来源:转载
供稿:网友

一个用php写的中文分词类


<?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;
    }
}
?>
 

来源参考:
http://www.phpchina.cn/code/2006/0607/381.html
http://www.xuchao.cn/?play=reply&id=851

 

,欢迎访问网页设计爱好者web开发。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表