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获取本周第一天和最后一天示例代码
Feb 24 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
php 解压rar文件及zip文件的方法
May 05 PHP
php获取网页里所有图片并存入数组的方法
Apr 06 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
非常实用的php验证码类
May 15 PHP
php+flash+jQuery多图片上传源码分享
Jul 27 PHP
Laravel5权限管理方法详解
Jul 26 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
Apr 18 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
Jan 29 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 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实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
Python里disconnect UDP套接字的方法
2015/04/23 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
Django框架请求生命周期实现原理
2020/11/13 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
2014年教师学期工作总结
2014/11/08 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书