php实现的中文分词类完整实例


Posted in PHP onFebruary 06, 2017

本文实例讲述了php实现的中文分词类。分享给大家供大家参考,具体如下:

该中文分词类源码使用http://tools.3water.com/code/3water_php_format进行了格式化处理,便于阅读。具体代码如下:

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
聊天室php&amp;mysql(二)
Oct 09 PHP
用缓存实现静态页面的测试
Dec 06 PHP
PHP 模拟$_PUT实现代码
Mar 15 PHP
PHP文件上传主要代码讲解
Sep 30 PHP
php while循环得到循环次数
Oct 26 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
Jun 07 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 PHP
详解PHP 二维数组排序保持键名不变
Mar 06 PHP
使用laravel指定日志文件记录任意日志
Oct 17 PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 #PHP
php使用变量动态创建类的对象用法示例
Feb 06 #PHP
PHP单例模式定义与使用实例详解
Feb 06 #PHP
PHP第三方登录―QQ登录实现方法
Feb 06 #PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 #PHP
PHP实现判断数组是一维、二维或几维的方法
Feb 06 #PHP
php中get_magic_quotes_gpc()函数说明
Feb 06 #PHP
You might like
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
php查看session内容的函数
2008/08/27 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
Python科学计算环境推荐——Anaconda
2014/06/30 Python
Python入门篇之对象类型
2014/10/17 Python
在Python中操作字典之update()方法的使用
2015/05/22 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
利用python 下载bilibili视频
2020/11/13 Python
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
物流管理专业自荐信
2014/06/23 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
大学生求职意向书
2015/05/11 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
入党心得体会
2019/06/20 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers