php自定义中文分词方法,php实现的中文分词类完整实例
本文實例講述了php實現(xiàn)的中文分詞類。分享給大家供大家參考,具體如下:
該中文分詞類源碼使用http://tools.jb51.net/code/jb51_php_format進(jìn)行了格式化處理,便于閱讀。具體代碼如下:
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= 129) {
$str_array[] = $str{$i} . $str{$i+1};
$i++;
} else {
$str_tmp = $str{$i};
for ($j=$i+1; $j
$char = $str_array[$pos-1];
if (is_array($char)) {
$str_final_tmp = $char[0];
if ($this->options['segment_english']) {
$str_final_tmp = preg_replace("/([!"#$%&'()*+,-./:;?@[\\]^_`{|}~tf]+)/", " $1 ", $str_final_tmp);
$str_final_tmp = preg_replace("/([!"#$%&'()*+,-./:;?@[\\]^_`{|}~tf])([!"#$%&'()*+,-./:;?@[\\]^_`{|}~tf])/", " $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; $i1; $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;
}
}
?>
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php常用函數(shù)與技巧總結(jié)》、《php字符串(string)用法總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的php自定义中文分词方法,php实现的中文分词类完整实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (java ee,Eclipse J2E
- 下一篇: php 删除硬链接,为什么要用软链接硬链