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类
Jul 15 PHP
将PHP作为Shell脚本语言使用
Oct 09 PHP
如何做到多笔资料的同步
Oct 09 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
Jun 05 PHP
yii框架配置默认controller和action示例
Apr 30 PHP
php单例模式示例分享
Feb 12 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 22 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 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中include()与require()的区别说明
2010/03/10 PHP
php实现cookie加密的方法
2015/03/10 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python使用PyFetion来发送短信的例子
2014/04/22 Python
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
Python 专题一 函数的基础知识
2017/03/16 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
详解Python time库的使用
2019/10/10 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
泰国在线书店:SE-ED
2020/06/21 全球购物
新浪网技术部笔试题
2016/08/26 面试题
修理厂厂长岗位职责
2014/01/30 职场文书
超市重阳节活动方案
2014/02/10 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
小学三年级作文之写景
2019/11/05 职场文书
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis