• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php实现的中文分词类完整实例详解

php 搞代码 3年前 (2022-01-22) 23次浏览 已收录 0个评论

这篇文章主要介绍了php实现的中文分词类,结合完整实例形式分析了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';    <b style="color:transparent">(、本文来源gao@!dai!ma.com搞$$代^@码网*</b><i>搞gaodaima代码</i>  }      $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;  }}?>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php实现的中文分词类完整实例详解
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址