排头兵PHP中文分词,纯PHP版实现

排头兵PHP中文分词类,主要作用是分析语料库,找出核心主题词,是网页相似度引擎的子模块

相比成熟的分词类库,如Lucene,中科院之流 没有任何优势,本类库是实验性项目,效率及算法[trie]并无特殊

暂时支持utf8编码

线上测试版即将出来 http://www.paitoubing.cn/pdb/paiswc.php
ps:我的博客托管服务器,暂时不能访问外网,没法安装apc扩展……..

先贴上切词函数,目前只能识别数据字典的词条分词,其他方面的可以扩展.
Trie数据字典保存在apc共享缓存中,根据词条首字母$key 序列化$value 了trie子树,序列化的效率真他妈低,影响了整体分词的效率

$result ='';
function pai_scw($text="")
{
	global $result;
	$textlen = mb_strlen($text);
	$trienode = false;
	$find = array();
	$wordrootposition = 0;//词根位置
         $prenode = false;
	$word = '';
	for ($i = 0; $i < $textlen;$i++)
	{
		$character = mb_substr($text,$i,1);
        $success = false;
        if(empty($word))
        {
        	$trienode = unserialize(apc_fetch($character,$success));
        	//unserialize 效率低
 
            //当$character 没有一个可以匹配的字符时,直接跳过,不做倒退匹配
            if(!$success)
            {
                continue;
                $result = $result.$character;
            }
        }
        //匹配词首
        if($success)
        {
        	$word = $word .$character;
        	continue;
        }
 
        if(isset($trienode['c'][$character]))
		{
			$word = $word .$character;
          //  echo "isset".$word."\n";
			$trienode = $trienode['c'][$character];
			if($prenode == 0)
			{
				$wordrootposition = $i;
			}
            $prenode = true;
			if($trienode['w'])
			{
			$find[] = array('position'=>$wordrootposition,'word' =>$word);
                $result = $result."-".$word."-";
			}
		}
		else 
		{
 
            /*@example 词条:北京奥委会
             *@example 判断分词:北京 奥运
             *@example 应该回溯到位置 奥的位置
             */
 
			$i = $i - mb_strlen($word);
			$prenode = false;
            $word = '';
            //添加分词结果
            $result = $result.$character;
		}
	}
	return $find;
}
 

Tags:

Comments

No comments so far.
  • Leave a Reply
     
    Your gravatar
    Your Name
     
     
     
     
     
 
About This Website

Lamp development & SEO & Plan of Website & Project Managment

Learn more »
Follow Us (SNS)
Help & Support

more about Bruce.xu»

Get in touch

QQ: +252339382
Email: shjuto @ gmail.com

Online contact form »