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 相关文章推荐
JAVA/JSP学习系列之七
Oct 09 PHP
用PHP和MySQL保存和输出图片
Oct 09 PHP
mysql 字段类型说明
Apr 27 PHP
php反弹shell实现代码
Apr 22 PHP
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
Feb 04 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
php实现socket推送技术的示例
Dec 20 PHP
php使用环形链表解决约瑟夫问题完整示例
Aug 07 PHP
浅谈PHP无限极分类原理
Mar 14 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
Jun 14 PHP
PHP使用Redis队列执行定时任务实例讲解
Mar 24 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数组应该有多大的分析
2009/07/30 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
基于js中style.width与offsetWidth的区别(详解)
2017/11/12 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
python 用 xlwings 库 生成图表的操作方法
2019/12/22 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
新任教师自我鉴定
2014/02/24 职场文书
学生会竞聘书范文
2014/03/31 职场文书
活动总结新闻稿
2014/08/30 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
2015年清明节活动总结
2015/02/09 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书