此文章来源于后羿之弓,转载请注明出处

用php来尝试给英文进行分词,欢迎大家拍砖,如哪位看官有不错的算法,希望不吝赐教 (zhouyuhi@gmail.com)

简单的按空白字符切割,则代码如下:

  1. function splitStrToArr2($str,&$strArr){
  2.     preg_match_all('/\S+/',$str,$strMatch1);
  3.     foreach ($strMatch1[0] as $str){
  4.         $strArr[] = $str;
  5.     }
  6. }

这样显然是不行的。示例如he say:”xxxxx”.

那我们来稍微精确点儿,算一下首字(循环处理时尾字变成首字),如果首字不是数组或字母,则单独看做一个单词,考虑到可能有未知字符,所以用宽字符处理,代码如下。

  1. mb_internal_encoding("UTF-8");
  2. function splitStrToArr($str,&$strArr){
  3.     preg_match_all('/\S+/',$str,$strMatch1);
  4.     foreach ($strMatch1[0] as $str){
  5.         $strTmpArr = splitStrToWord($str);
  6.         foreach ($strTmpArr as $arr){
  7.             $strArr[] = $arr;
  8.         }
  9.     }
  10. }
  11. function splitStrToWord($str){
  12.     if(mb_strlen($str)<2){
  13.         return array($str);
  14.     }
  15.     $result = array();
  16.     $firstChar = mb_substr($str,0,1);
  17.     $charCode = ord($firstChar);
  18.     if(($charCode>=65 && $charCode <=90) || ($charCode>=97 && $charCode <=122) || ($charCode>=48 && $charCode <=57)){
  19.         preg_match('/([\w]+([\'\-]?[\w\-]*)*)/',$str,$match);
  20.         if($match[0]){
  21.             $result[] = $match[0];
  22.             if($str != $match[0]){
  23.                 $result = array_merge($result,splitStrToWord(mb_substr($str,strlen($match[0]))));
  24.             }
  25.         }
  26.     }else{
  27.         $result[] = $firstChar;
  28.         $result = array_merge($result,splitStrToWord(mb_substr($str,1)));
  29.     }
  30.     return $result;
  31. }