明霞山资源网 Design By www.htccd.com

本文实例讲述了php实现的中文分词类。分享给大家供大家参考,具体如下:

该中文分词类源码使用http://tools.jb51.net/code/jb51_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("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\", " $1 ", $str_final_tmp); 
$str_final_tmp = preg_replace("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\", " $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;
  }
}
"_blank" href="https://www.jb51.net/Special/168.htm">php常用函数与技巧总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

标签:
php,中文,分词

明霞山资源网 Design By www.htccd.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
明霞山资源网 Design By www.htccd.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。