php权重计算方法代码分享


Posted in PHP onJanuary 09, 2014
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------
//  Name       :   权重计算                                         
//  Description:   稍加修改,亦可用于分词,词频统计,全文检索和垃圾检测
//  Date       :   2013/12/16 08:51
class weight {
    protected $aDict = array(array());
    protected $aItems = array();
    protected $sLastRule;
    protected $aMatchs = array();
    protected $aShow = array();
 private function init() {
  //清空记录的匹配表和输出结果
  unset($this->aShow);
 }
    public function newItems($mItems) {
  //导入新的项目
  $this->aItems = (is_array($mItems))? $mItems: array($mItems);
  $this->init();
 }
 public function newTable(array $aTable) {
        //导入新的对照表,并生成字典
        foreach($aTable as $iTableKey=>$sTableLine) {
            $aTableLine = explode(',', str_replace('|', ',', $sTableLine)); 
            $setter = function($v, $k, $paraMeter) {
                $k1 = $paraMeter[0]; $oWeight = $paraMeter[1];
                $oWeight->genDict($v, $k1);
            };
            array_walk($aTableLine, $setter, array($iTableKey, $this));
        }
        $this->init();
 }
    public function getShow($sRule = 'max') {
  //获取最终的显示结果
        if(empty($this->aItems) || empty($this->aDict))
            return array();
  if (empty($this->aShow) || $sRule != $this->sLastRule) 
            return $this->genShow($sRule);
        return $this->aShow;
 }
    public function genShow($sRule) {
        $aShow = array();
        $aMatchs = array();
  $getter = function($v, $k, $oWeight) use(&$aShow, &$aMatchs, $sRule) {
   $t = array_count_values($oWeight->matchWord($v));
            $aMatchs[] = $t;
            switch ($sRule) {
                case 'max':
                    $aShow[$k] = array_keys($t, max($t)); 
                    break;
            }
  };
  array_walk($this->aItems, $getter, $this);
  $this->aShow = $aShow;
  $this->aMatchs = $aMatchs;
  return $aShow;
    }
    private function genDict($mWord, $iKey = '') {
        $iInsertPonit = count($this->aDict);
        $iCur = 0; //当前节点号
        foreach (str_split($mWord) as $iChar) {
            if (isset($this->aDict[$iCur][$iChar])) {
                $iCur = $this->aDict[$iCur][$iChar];
                continue;
            }
            $this->aDict[$iInsertPonit] = array();
            $this->aDict[$iCur][$iChar] = $iInsertPonit;
            $iCur = $iInsertPonit;
            $iInsertPonit++;
        }
        $this->aDict[$iCur]['acc'][] = $iKey; 
    }
        function matchWord($sLine) {
            $iCur = $iOffset = $iPosition = 0;
            $sLine .= "\0";
            $iLen = strlen($sLine);
            $aReturn = array();
            while($iOffset < $iLen) {
                $sChar = $sLine{$iOffset};
                if(isset($this->aDict[$iCur][$sChar])) {
                    $iCur = $this->aDict[$iCur][$sChar];
                    if(isset($this->aDict[$iCur]['acc'])) {
                        $aReturn = array_merge($aReturn, $this->aDict[$iCur]['acc']);
                        $iPosition = $iOffset + 1;
                        $iCur = 0;
                    }
                } else {
                    $iCur = 0;
                    $iOffset = $iPosition;
                    $iPosition = $iOffset + 1;
                }
                ++$iOffset;
            }
            return $aReturn;
        }
}
?>

外部调用示例

$aItems = array(
    'chinaisbig',
    'whichisnot',
    'totalyrightforme',
);
$aTable = array(
    'china,is|small',
    'china,big|me',
    'china,is|big,which|not,me',
    'totaly|right,for,me',
);
$oWeight = new ttrie;
$oWeight->newItems($aItems);
$aResult = $oWeight->newTable($aTable);
PHP 相关文章推荐
PHP个人网站架设连环讲(一)
Oct 09 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
Jul 17 PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
Dec 22 PHP
PHP遍历XML文档所有节点的方法
Mar 12 PHP
php查询mysql数据库并将结果保存到数组的方法
Mar 18 PHP
深入浅出php socket编程
May 13 PHP
PHP+JS实现的商品秒杀倒计时用法示例
Nov 15 PHP
PHP PDOStatement::bindValue讲解
Jan 30 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 PHP
PHP预定义接口――Iterator用法示例
Jun 05 PHP
Swoole扩展的6种模式深入详解
Mar 04 PHP
php实现分页工具类分享
Jan 09 #PHP
codeigniter框架批量插入数据
Jan 09 #PHP
eaglephp使用微信api接口开发微信框架
Jan 09 #PHP
百度站点地图(百度sitemap)生成方法分享
Jan 09 #PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
Jan 09 #PHP
php将mysql数据库整库导出生成sql文件的具体实现
Jan 08 #PHP
PHP修改session_id示例代码
Jan 08 #PHP
You might like
php 归并排序 数组交集
2011/05/10 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
js插件Jcrop自定义截取图片功能
2016/10/14 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
python与mysql数据库交互的实现
2020/01/06 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
《小小雨点》教学反思
2014/02/18 职场文书
创建文明学校实施方案
2014/03/11 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
2014年人事部工作总结
2014/12/03 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
内勤岗位职责范本
2015/04/13 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL