仓酷云

标题: PHP网站制作之一个用php写的中文分词类 [打印本页]

作者: 逍遥一派    时间: 2015-2-4 00:09
标题: 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[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;
    }
}
?>

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

没有人会喜欢和见异思迁的人交朋友,因为这种人太不安分,太不可靠,因此,你必须要强迫自己完成自己的目标,哪怕可能会很难受,也得坚持,毅力就是这么锻炼出来的。
作者: 愤怒的大鸟    时间: 2015-2-4 09:39
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者: 第二个灵魂    时间: 2015-2-9 02:09
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
作者: 仓酷云    时间: 2015-2-12 08:49
基础有没有对学习php没有太大区别,关键是兴趣。
作者: 柔情似水    时间: 2015-2-24 05:29
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者: 飘灵儿    时间: 2015-3-7 11:02
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者: 谁可相欹    时间: 2015-3-8 00:17
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 逍遥一派    时间: 2015-3-8 21:10
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
作者: 冷月葬花魂    时间: 2015-3-16 13:49
实践是检验自己会不会的真理。
作者: 山那边是海    时间: 2015-3-17 09:39
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者: 莫相离    时间: 2015-3-24 05:57
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 小妖女    时间: 2015-3-27 14:18
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者: 若天明    时间: 2015-3-28 17:39
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 老尸    时间: 2015-3-30 15:49
爱上php,他也会爱上你。
作者: 精灵巫婆    时间: 2015-3-31 11:35
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者: 小魔女    时间: 2015-3-31 16:55
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者: 飘飘悠悠    时间: 2015-4-4 12:27
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 深爱那片海    时间: 2015-4-6 09:02
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者: 分手快乐    时间: 2015-4-12 03:36
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
作者: 蒙在股里    时间: 2015-4-14 23:16
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2