zoukankan      html  css  js  c++  java
  • 使用织梦开源的分词算法库编写的YII获取分词扩展

    在编辑文章中,很多时候都需要自动根据文章内容获取关键字的功能,因此,本文主要是说明如何在yii中使用织梦开源的分词算法编写一个独立的扩展,可以在不同的模块中使用,步骤如下:

    1 到这里下载其他朋友整理的织梦分词算法库;

    2 解压下载的分词库并放到yii extensions/fenci目录下面;

    3 在extensions/fenci添加FenciConnectorAction.php和GetTagsInput.php;

    4 在对应的module中添加ConnectorController.php,用于实现在类中调用外部action,即是用于调用extensions/fenci中的FenciConnectorAction.php;

    下面说明如何编写需要添加的文件的代码:

    1 FenciConnectorAction.php 提供给需要调用的模块调用的外部action,用于根据内容获取分词

    <?php
    class FenciConnectorAction extends CAction
    {
        public $contents = '';
    
        public function run(){
        	
            require_once(dirname(__FILE__) . '/SplitWord.class.php');
    
            $cfg_soft_lang='utf-8';
            $sp = new SplitWord($cfg_soft_lang, $cfg_soft_lang);
            $sp->SetSource($this->contents, $cfg_soft_lang, $cfg_soft_lang);
            $sp->SetResultType(3);
            $sp->StartAnalysis(TRUE);
            $keywords = $sp->GetFinallyResult(' ');
            $keywords = preg_replace("/[ ]{1,}/", ",", trim($keywords));
            echo $keywords;
        }
    }
    ?>
    

     2 GetTagsInput.php 用于在form表单中调用自动生成表单元素和绑定ajax调用分词action的js

    <?php
    
    class GetTagsInput extends CInputWidget
    {
        public $url = '';
        public $connectorRoute = false;
        public $contentAttribute = '';
        
        public function init()
        {
        	if (empty($this->connectorRoute))
        	throw new CException('$connectorRoute must be set!');
        	
        	$this->url = Yii::app()->createUrl($this->connectorRoute);
    
        }
    
        public function run()
        {
            list($name, $id) = $this->resolveNameID();
            if (isset($this->htmlOptions['id']))
                $id = $this->htmlOptions['id'];
            else
                $this->htmlOptions['id'] = $id;
            if (isset($this->htmlOptions['name']))
                $name = $this->htmlOptions['name'];
            else
                $this->htmlOptions['name'] = $name;
    
            $contHtmlOptions = $this->htmlOptions;
            $contHtmlOptions['id'] = $id . 'container';
            echo CHtml::openTag('div', $contHtmlOptions);
    
            $inputOptions = array('id' => $id, 'style' => 'float:left;', 'size' => '80');
            if ($this->hasModel())
                echo CHtml::activeTextField($this->model, $this->attribute, $inputOptions);
            else
                echo CHtml::textField($name, $this->value, $inputOptions);
    
            echo CHtml::button('自动获取', array('id' => $id . 'autoGenerate', 'class' => 'btn'));
            echo CHtml::closeTag('div');
    
            $content_id = $this->model->getModelClass().'_'.$this->contentAttribute;
            $object_id = $this->model->getModelClass().'_'.$this->attribute;
            $script = <<<EOD
            		window.autoGetTags = function(){
            			var content_id = '$content_id';
            			var object_id = '$object_id';
            			
        				$.ajax({
    						url: '$this->url',
    						type:'post', 
    						cache:false, 
    						data:{    
    					    	contents : $("#"+content_id).val()   
    					    },  
    						success: function(datas, textStatus, xhr){
    							$("#"+object_id).val(datas)  
    						}
    					});
        			}
    EOD;
    
            $cs = Yii::app()->getClientScript();
            $cs->registerScript('GetTagsInput#global', $script);
            $js = '$("#' . $id . 'autoGenerate").click(function(){window.autoGetTags()});';      
            $cs->registerScript('GetTagsInput#' . $id, $js);
        }
    }
    ?>
    

     3 ConnectorController.php 用于实现外部调用扩展中的FenciConnectorAction.php

    <?php
    class ConnectorController extends CController
    {
        public function actions()
        {
            return array(
            
                'fenci' => array(
                    'class' => 'ext.fenci.FenciConnectorAction',
            		'contents' => isset($_POST['contents'])?$_POST['contents']:''
                )
            );
        }
    }
    ?>
    

     4 最终在表单中的调用方式:

    <tr>
    	<td width="150"><?php echo $form->labelEx($model,'tags'); ?></td>
    	<td>
    		<?php 
    			$this->widget('ext.fenci.GetTagsInput', array(
    		            'model' => $model,
    		            'attribute' => 'tags',//分词对应的字段
    	             'contentAttribute' => 'title',//指定从哪个字段值获取分词
    		         'connectorRoute' => 'admin/connector/fenci',//设置调用外部action 即是扩展获取分词的action
    			));
    		?>
    	</td>
    </tr>
    

     5 效果图:

    分词扩展的目录结构如下:

    点击自动获取之后就可以自动根据绑定的关键字数据源得到最终的分词结果并显示在目标字段上面,不过这里对于返回的非词语需要再处理一下。

    这里附上如何在yii的controller中调用外部action的说明供作参考

    如果需要转载,请注明来源,支持原创,多谢合作!

  • 相关阅读:
    linux基础
    模块三、企业实战案例
    模块二、shell脚本逻辑结构
    模块一:shell 脚本基础
    三剑客、shell脚本
    定时任务、用户管理、磁盘介绍
    python笔记03
    文件属性、正则表达式、文件权限
    Linux系统目录结构介绍
    Linux基础及入门介绍
  • 原文地址:https://www.cnblogs.com/springdong/p/3203943.html
Copyright © 2011-2022 走看看