php 一元分词算法

  

复制代码 代码如下:

  /**

  * 一元分词算法

  * UTF8编码下一个字符如果首字符ASCII码不大于192则只占1个字节

  * 如果首字符ASCII码大于192小于224则占用2个字节,否则占用3个字节

  * 一元分词需要在mysql的my.ini文件中增加 ft_min_word_len=1

  * 可以使用mysql查询语句 show variables like '%ft%' 查看mysql全文搜索相关设置

  *

  * @access global

  * @param string $str

  * @param boolean $unique 是否去除重复值

  * @param boolean $merge 是否合并附加值

  * @return array

  */

  function seg_word($str,$unique=false,$merge=true)

  {

  $str = trim(strip_tags($str));

  $strlen = strlen($str);

  if($strlen == 0) return array();

  $spc = ' ';

  //按需增加需要过滤的字符

  $search = array(',', '/', '\\', '.', ';', ':', '\'', '!', '~','"', '`', '^', '(', ')', '?', '-', "\t", "\n", '\'', '<', '>', "\r", "\r\n", '\$', '&', '%', '#', '@', '+', '=', '{', '}', '[', ']', ')', '(', '.', '。', ',', '!', ';', '“', '”', '‘', ''', '[', ']', '、', '—', ' ', '《', '》', '-', '…', '【', '】',':');

  $numpairs = array('1'=>'一','2'=>'二','3'=>'三','4'=>'四','5'=>'五','6'=>'六','7'=>'七','8'=>'八','9'=>'九','0'=>'零');

  $str = alab_num($str);

  $str = str_replace($search,' ',$str);

  $ord = $i = $k = 0;

  $prechar = 0;// 0-空白 1-英文和符号 2-中文

  $result = array();

  $annex = array();

  while($ord = ord($str[$i]))

  {

  //1字节字符

  if ($ord <= 0xC0 )

  {

  //去除空字符串

  if($ord < 33) {

  $prechar=0;

  $i++;

  $k++;

  continue;

  }

  //附加中文大写数字转换

  if(isset($numpairs[$str[$i]])) {

  $annex[]=$numpairs[$str[$i]];

  }

  //如果前面是中文

  if( $prechar == 2 ){

  $result[++$k] = $str[$i];

  }

  else {

  $result[$k] .= $str[$i];

  }

  $prechar = 1;

  $i++;

  }

  else //2-3字节字符(中文)

  {

  if($ord < 0xE0)

  $step = 2;

  else

  $step = 3;

  $c = substr($str,$i,$step);

  if(false !== $key = array_search($c,$numpairs)){

  $annex[] = $key;

  }

  if ($prechar != 0) {

  $result[++$k] = $c;

  }

  else {

  $result[$k] .= $c;

  }

  $prechar = 2;

  $i+=$step;

  }

  }

  $result = $merge ? array_merge($result,$annex) : $result ;

  return $unique ? array_unique($result) : $result ;

  }