未加星标

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

字体大小 | |
[开发(php) 所属分类 开发(php) | 发布者 店小二03 | 时间 | 作者 红领巾 ] 0人收藏点击收藏

本文实例讲述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';
}
$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;
}
}
?>

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php常用函数与技巧总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师

主题: PHP数据数据库
分页:12
转载请注明
本文标题:php实现的中文分词类完整实例
本站链接:http://www.codesec.net/view/534682.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(php) | 评论(0) | 阅读(70)