[转]一个用php写的中文分词类

转载 2006年06月11日 01:29:00


一个用php写的中文分词类

  1. <?php
  2. class Segmentation {
  3.     var $options = array('lowercase' => TRUE,
  4.                          'segment_english' => FALSE);
  5.     var $dict_name = 'Unknown';
  6.     var $dict_words = array();
  7.     function setLowercase($value) {
  8.         if ($value) {
  9.             $this->options['lowercase'] = TRUE;
  10.         } else {
  11.             $this->options['lowercase'] = FALSE;
  12.         }
  13.         return TRUE;
  14.     }
  15.     function setSegmentEnglish($value) {
  16.         if ($value) {
  17.             $this->options['segment_english'] = TRUE;
  18.         } else {
  19.             $this->options['segment_english'] = FALSE;
  20.         }
  21.         return TRUE;
  22.     }
  23.     function load($dict_file) {
  24.         if (!file_exists($dict_file)) {
  25.             return FALSE;
  26.         }
  27.         $fp = fopen($dict_file, 'r');
  28.         $temp = fgets($fp, 1024);
  29.         if ($temp === FALSE) {
  30.             return FALSE;
  31.         } else {
  32.             if (strpos($temp, "/t") !== FALSE) {
  33.                 list ($dict_type, $dict_name) = explode("/t", trim($temp));
  34.             } else {
  35.                 $dict_type = trim($temp);
  36.                 $dict_name = 'Unknown';
  37.             }
  38.             $this->dict_name = $dict_name;
  39.             if ($dict_type !== 'DICT_WORD_W') {
  40.                 return FALSE;
  41.             }
  42.         }
  43.         while (!feof($fp)) {
  44.             $this->dict_words[rtrim(fgets($fp, 32))] = 1;
  45.         }
  46.         fclose($fp);
  47.         return TRUE;
  48.     }
  49.     function getDictName() {
  50.         return $this->dict_name;
  51.     }
  52.     function segmentString($str) {
  53.         if (count($this->dict_words) === 0) {
  54.             return FALSE;
  55.         }
  56.         $lines = explode("/n", $str);
  57.         return $this->_segmentLines($lines);
  58.     }
  59.     function segmentFile($filename) {
  60.         if (count($this->dict_words) === 0) {
  61.             return FALSE;
  62.         }
  63.         $lines = file($filename);
  64.         return $this->_segmentLines($lines);
  65.     }
  66.     function _segmentLines($lines) {
  67.         $contents_segmented = '';
  68.         foreach ($lines as $line) {
  69.             $contents_segmented .= $this->_segmentLine(rtrim($line)) . " /n";
  70.         }
  71.         do {
  72.             $contents_segmented = str_replace('  ', ' ', $contents_segmented);
  73.         } while (strpos($contents_segmented, '  ') !== FALSE);
  74.         return $contents_segmented;
  75.     }
  76.     function _segmentLine($str) {
  77.         $str_final = '';
  78.         $str_array = array();
  79.         $str_length = strlen($str);
  80.         if ($str_length > 0) {
  81.             if (ord($str{$str_length-1}) >= 129) {
  82.                 $str .= ' ';
  83.             }
  84.         }
  85.         for ($i=0; $i<$str_length; $i++) {
  86.             if (ord($str{$i}) >= 129) {
  87.                 $str_array[] = $str{$i} . $str{$i+1};
  88.                 $i++;
  89.             } else {
  90.                 $str_tmp = $str{$i};
  91.                 for ($j=$i+1; $j<$str_length; $j++) {
  92.                     if (ord($str{$j}) < 129) {
  93.                         $str_tmp .= $str{$j};
  94.                     } else {
  95.                         break;
  96.                     }
  97.                 }
  98.                 $str_array[] = array($str_tmp);
  99.                 $i = $j - 1;
  100.             }
  101.         }
  102.   
  103.         $pos = count($str_array);
  104.         while ($pos > 0) {
  105.             $char = $str_array[$pos-1];
  106.             if (is_array($char)) {
  107.                 $str_final_tmp = $char[0];
  108.                 if ($this->options['segment_english']) {
  109.                     $str_final_tmp = preg_replace("/([/!/"/#/$/%/&/'/(/)/*/+/,/-/.///:/;/</=/>/?/@/[/////]/^/_/`/{/|/}/~/t/f]+)/", " $1 ", $str_final_tmp);
  110.                     $str_final_tmp = preg_replace("/([/!/"/#/$/%/&/'/(/)/*/+/,/-/.///:/;/</=/>/?/@/[/////]/^/_/`/{/|/}/~/t/f])([/!/"/#/$/%/&/'/(/)/*/+/,/-/.///:/;/</=/>/?/@/[/////]/^/_/`/{/|/}/~/t/f])/", " $1 $2 ", $str_final_tmp);
  111.                 }
  112.                 if ($this->options['lowercase']) {
  113.                     $str_final_tmp = strtolower($str_final_tmp);
  114.                 }
  115.                 $str_final = " $str_final_tmp$str_final";
  116.                 $pos--;
  117.             } else {
  118.                 $word_found = 0;
  119.                 $word_array = array(0 => '');
  120.                 if ($pos < 4) {
  121.                     $word_temp = $pos + 1;
  122.                 } else {
  123.                     $word_temp = 5;
  124.                 }
  125.                 for ($i=1; $i<$word_temp; $i++) {
  126.                     $word_array[$i] = $str_array[$pos-$i] . $word_array[$i-1];
  127.                 }
  128.     
  129.                 for ($i=($word_temp-1); $i>1; $i--) {
  130.      
  131.                     if (array_key_exists($word_array[$i], $this->dict_words)) {
  132.                        $word_found = $i;
  133.                        break;
  134.                     }
  135.                 }
  136.                 if ($word_found) {
  137.                     $str_final = " $word_array[$word_found]$str_final";
  138.                     $pos = $pos - $word_found;
  139.                 } else {
  140.                     $str_final = " $char$str_final";
  141.                     $pos--;
  142.                 }
  143.             }
  144.         }
  145.         return $str_final;
  146.     }
  147. }
  148. ?>

 

来源参考:
http://www.phpchina.cn/code/2006/0607/381.html
http://www.xuchao.cn/?play=reply&id=851

中文分词整理

背景 存在中文分词技术,是由于中文在基本文法上有其特殊性,具体表现在: 1.以英文为代表的拉丁语系语言相比,英文以空格作为天然的分隔符,而中文由于继承自古代汉语的传统,词语之间没有分隔。 ...
  • shenxiaoming77
  • shenxiaoming77
  • 2015年09月23日 16:48
  • 2085

中文分词器IKAnalyzer——IKQueryParser主类分析

大体流程 IKQueryParser此类是在指定field与query条件下,执行主方法_parse: 1、首先调用IKSegmentation类进行lexeme分词; 2、紧接着调用核心方法accp...
  • Li_ableXiao
  • Li_ableXiao
  • 2015年10月18日 22:03
  • 797

自然语言处理相关书籍及其他资源

原文地址:http://www.cppblog.com/sunrise/archive/2012/03/28/169243.html 特别推荐: 1、HMM学习最佳范例全文文档 2、...
  • jdbc
  • jdbc
  • 2015年09月04日 08:07
  • 941

中文分词学习总结

中文分词 中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月30日 19:14
  • 3417

PHP汉字转拼音的两种方法+PHP提取汉字(中文)方法

方法一:根据ASCII码转换 ,GB2312库对多音字也无能为力。 GB2312标准共收录6763个汉字,不在范围内的汉字是无法转换,如:中国前总理朱镕基的“镕”字。 GB2312中对所收汉字进行了...
  • u011986449
  • u011986449
  • 2014年10月20日 14:21
  • 4174

PHP的UTF-8中文转拼音处理类(性能已优化至极致)

优化了传统的拼音转换处理类的算法,专门针对UTF-8字符集进行处理。 如果你使用GBK或GB2312字符集,只需要去掉iconv函数,直接赋值,不需要转换就行。...
  • hzbigdog
  • hzbigdog
  • 2014年07月15日 15:38
  • 24388

Java开源中文分词类库

IKAnalyzer  IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初...
  • qing419925094
  • qing419925094
  • 2014年05月21日 11:14
  • 492

php汉字转换成拼音,php汉字按照拼音首字母排序

$d = array(        array("a",-20319),        array("ai",-20317),        array("an",-20304),     ...
  • xaicainiaoniao
  • xaicainiaoniao
  • 2013年06月05日 17:08
  • 1310

PHP 汉字转拼音类(全拼与首字母)

  • maque0312
  • maque0312
  • 2015年12月29日 16:13
  • 1524

Elasticsearch设置中文分词

安装分词插件在ES安装目录下:./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik...
  • lilongsy
  • lilongsy
  • 2017年10月19日 14:52
  • 392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转]一个用php写的中文分词类
举报原因:
原因补充:

(最多只允许输入30个字)