php实现的中文分词类完整实例
本文实例讲述了php实现的中文分词类。分享给大家供大家参考,具体如下:
该中文分词类源码使用http://tools.jb51.net/code/jb51_php_format进行了格式化处理,便于阅读。具体代码如下:
classSegmentation{
var$options=array('lowercase'=>TRUE,
'segment_english'=>FALSE);
var$dict_name='Unknown';
var$dict_words=array();
functionsetLowercase($value){
if($value){
$this->options['lowercase']=TRUE;
}else{
$this->options['lowercase']=FALSE;
}
returnTRUE;
}
functionsetSegmentEnglish($value){
if($value){
$this->options['segment_english']=TRUE;
}else{
$this->options['segment_english']=FALSE;
}
returnTRUE;
}
functionload($dict_file){
if(!file_exists($dict_file)){
returnFALSE;
}
$fp=fopen($dict_file,'r');
$temp=fgets($fp,1024);
if($temp===FALSE){
returnFALSE;
}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'){
returnFALSE;
}
}
while(!feof($fp)){
$this->dict_words[rtrim(fgets($fp,32))]=1;
}
fclose($fp);
returnTRUE;
}
functiongetDictName(){
return$this->dict_name;
}
functionsegmentString($str){
if(count($this->dict_words)===0){
returnFALSE;
}
$lines=explode("\n",$str);
return$this->_segmentLines($lines);
}
functionsegmentFile($filename){
if(count($this->dict_words)===0){
returnFALSE;
}
$lines=file($filename);
return$this->_segmentLines($lines);
}
function_segmentLines($lines){
$contents_segmented='';
foreach($linesas$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;
}
}
?>
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php常用函数与技巧总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。