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学习 计数器实例代码
Jun 15 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
php页面跳转代码 输入网址跳转到你定义的页面
Mar 28 PHP
php阻止页面后退的方法分享
Feb 17 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 PHP
ThinkPHP中的三大自动简介
Aug 22 PHP
PHP常用技术文之文件操作和目录操作总结
Sep 27 PHP
PHP中使用GD库创建圆形饼图的例子
Nov 19 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
apache和PHP如何整合在一起
Oct 12 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 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
隐性调用php程序的方法
2015/06/13 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
js实现增加数字显示的环形进度条效果
2017/02/05 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
vue实现购物车加减
2020/05/30 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
Python 错误和异常小结
2013/10/09 Python
python创建和使用字典实例详解
2013/11/01 Python
Python映射拆分操作符用法实例
2015/05/19 Python
Python的多态性实例分析
2015/07/07 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
python先序遍历二叉树问题
2017/11/10 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
python合并同类型excel表格的方法
2018/04/01 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
物流专业大学应届生求职信
2013/11/03 职场文书
工程资料员岗位职责
2014/03/10 职场文书
体育运动会广播稿
2014/10/05 职场文书
初一军训感言
2015/08/01 职场文书