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校验ISBN码的函数代码
Jan 17 PHP
php继承的一个应用
Sep 06 PHP
浅析php中jsonp的跨域实例
Jun 21 PHP
PHP面向对象之旅:深入理解static变量与方法
Jan 06 PHP
php获取随机数组列表的方法
Nov 13 PHP
ThinkPHP中redirect用法分析
Dec 05 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
php中通过DirectoryIterator删除整个目录的方法
Mar 13 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
PHP swoole和redis异步任务实现方法分析
Aug 12 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
laravel 5.3 单用户登录简单实现方法
Oct 14 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
php中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
php模板函数 正则实现代码
2012/10/15 PHP
Laravel框架表单验证详解
2014/09/04 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
详解Python中DOM方法的动态性
2015/04/11 Python
详细解析Python当中的数据类型和变量
2015/04/25 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
Python中类的初始化特殊方法
2017/12/01 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
python中常用的数据结构介绍
2021/01/12 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
英语师范专业毕业生自荐信
2013/09/21 职场文书
法院实习人员自我鉴定
2013/09/26 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
小学生读书活动总结
2014/06/30 职场文书
客户答谢会活动方案
2014/08/31 职场文书
大学生作弊检讨书
2014/09/11 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
优秀团支部申报材料
2014/12/26 职场文书
元宵节晚会主持词
2015/07/01 职场文书
python中redis包操作数据库的教程
2022/04/19 Python