Home  >  Article  >  Backend Development  >  PHP unary word segmentation algorithm example code

PHP unary word segmentation algorithm example code

怪我咯
怪我咯Original
2017-07-14 11:05:321484browse

一元分词:指语句中每个字都成词,按字切分,不去组合,类似英文单词。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(&#39;,&#39;, &#39;/&#39;, &#39;\\&#39;, &#39;.&#39;, &#39;;&#39;, &#39;:&#39;, &#39;\&#39;&#39;, &#39;!&#39;, &#39;~&#39;,&#39;"&#39;, &#39;`&#39;, &#39;^&#39;, &#39;(&#39;, &#39;)&#39;, &#39;?&#39;, &#39;-&#39;, "\t", "\n", &#39;\&#39;&#39;, &#39;<&#39;, &#39;>&#39;, "\r", "\r\n", &#39;\$&#39;, &#39;&&#39;, &#39;%&#39;, &#39;#&#39;, &#39;@&#39;, &#39;+&#39;, &#39;=&#39;, &#39;{&#39;, &#39;}&#39;, &#39;[&#39;, &#39;]&#39;, &#39;)&#39;, &#39;(&#39;, &#39;.&#39;, &#39;。&#39;, &#39;,&#39;, &#39;!&#39;, &#39;;&#39;, &#39;“&#39;, &#39;”&#39;, &#39;‘&#39;, &#39;&#39;&#39;, &#39;[&#39;, &#39;]&#39;, &#39;、&#39;, &#39;—&#39;, &#39; &#39;, &#39;《&#39;, &#39;》&#39;, &#39;-&#39;, &#39;…&#39;, &#39;【&#39;, &#39;】&#39;,&#39;:&#39;); 
$numpairs = array(&#39;1&#39;=>&#39;一&#39;,&#39;2&#39;=>&#39;二&#39;,&#39;3&#39;=>&#39;三&#39;,&#39;4&#39;=>&#39;四&#39;,&#39;5&#39;=>&#39;五&#39;,&#39;6&#39;=>&#39;六&#39;,&#39;7&#39;=>&#39;七&#39;,&#39;8&#39;=>&#39;八&#39;,&#39;9&#39;=>&#39;九&#39;,&#39;0&#39;=>&#39;零&#39;); 
$str = alab_num($str); 
$str = str_replace($search,&#39; &#39;,$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 ; 
}

The above is the detailed content of PHP unary word segmentation algorithm example code. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn