逍遥一派 发表于 2015-2-4 00:09:57

PHP网站制作之一个用php写的中文分词类

学会了生成静态网页,现在你应该接触一下XML了,恩,XML也了解了,那么AJAX你也得接触接触吧?AJAX完了....然后...中文   一个用php写的中文分词类

<?php
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 = 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;
                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;
    }
}
?>

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

没有人会喜欢和见异思迁的人交朋友,因为这种人太不安分,太不可靠,因此,你必须要强迫自己完成自己的目标,哪怕可能会很难受,也得坚持,毅力就是这么锻炼出来的。

愤怒的大鸟 发表于 2015-2-4 09:39:41

个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。

第二个灵魂 发表于 2015-2-9 02:09:28

最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。

仓酷云 发表于 2015-2-12 08:49:15

基础有没有对学习php没有太大区别,关键是兴趣。

柔情似水 发表于 2015-2-24 05:29:50

说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。

飘灵儿 发表于 2015-3-7 11:02:56

多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。

谁可相欹 发表于 2015-3-8 00:17:25

建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。

逍遥一派 发表于 2015-3-8 21:10:12

要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。

冷月葬花魂 发表于 2015-3-16 13:49:57

实践是检验自己会不会的真理。

山那边是海 发表于 2015-3-17 09:39:42

使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。

莫相离 发表于 2015-3-24 05:57:10

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

小妖女 发表于 2015-3-27 14:18:54

首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。

若天明 发表于 2015-3-28 17:39:07

建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。

老尸 发表于 2015-3-30 15:49:28

爱上php,他也会爱上你。

精灵巫婆 发表于 2015-3-31 11:35:12

你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。

小魔女 发表于 2015-3-31 16:55:59

这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己

飘飘悠悠 发表于 2015-4-4 12:27:42

再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。

深爱那片海 发表于 2015-4-6 09:02:59

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

分手快乐 发表于 2015-4-12 03:36:37

本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。

蒙在股里 发表于 2015-4-14 23:16:30

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
页: [1] 2
查看完整版本: PHP网站制作之一个用php写的中文分词类