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文件读写操作之文件写入代码
Jan 13 PHP
php使用strtotime和date函数判断日期是否有效代码分享
Dec 25 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
php开发工具有哪五款
Nov 09 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
Dec 28 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 12 PHP
PHP 图片处理
Sep 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 FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
JavaScript知识点整理
2015/12/09 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
Python学习之time模块的基本使用
2021/01/17 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
机电专业毕业生求职信
2013/10/27 职场文书
历史专业毕业生的自我鉴定
2013/11/15 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
个人作风建设总结
2014/10/23 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS
html5调用摄像头截图功能
2022/01/18 Javascript