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 相关文章推荐
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
PHP设计模式之调解者模式的深入解析
Jun 13 PHP
php遍历目录输出目录及其下的所有文件示例
Jan 27 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
将PHP的session数据存储到数据库中的代码实例
Jun 24 PHP
Yii隐藏URL中index.php的方法
Jul 12 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
ThinkPHP实现登录退出功能
Jun 29 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
Laravel使用RabbitMQ的方法示例
Jun 18 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
Oct 16 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 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编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
限制文本框输入N个字符的js代码
2010/05/13 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
Python中http请求方法库汇总
2016/01/06 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
python如何重载模块实例解析
2018/01/25 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
python 剪切移动文件的实现代码
2018/08/02 Python
Python实现多属性排序的方法
2018/12/05 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
python assert的用处示例详解
2019/04/01 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
综合办公室主任职责
2013/12/16 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
Java对文件的读写操作方法
2022/04/29 Java/Android