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 20 PHP
php将session放入memcached的设置方法
Feb 14 PHP
php多文件上传下载示例分享
Feb 20 PHP
PHP中的命名空间相关概念浅析
Jan 22 PHP
php短网址和数字之间相互转换的方法
Mar 13 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
Apr 21 PHP
PHP里的单例类写法实例
Jun 25 PHP
php制作的简单验证码识别代码
Jan 26 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
Apr 15 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
Yii 实现数据加密和解密
Mar 09 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
2015/10/08 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
详解webpack 热更新优化
2018/09/13 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
Python模块的加载讲解
2019/01/15 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
Python 复平面绘图实例
2019/11/21 Python
python3实现绘制二维点图
2019/12/04 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
国际经济贸易专业推荐信
2013/11/06 职场文书
婚前协议书范本
2014/10/27 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
nginx搭建NFS网络文件系统
2022/04/14 Servers