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 相关文章推荐
第八节--访问方式
Nov 16 PHP
LotusPhp笔记之:Cookie组件的使用详解
May 06 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
Jun 07 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
PHP中4个加速、缓存扩展的区别和选用建议
Mar 12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
Jun 30 PHP
Web程序工作原理详解
Dec 25 PHP
PHP将进程作为守护进程的方法
Mar 19 PHP
如何使用php实现评委评分器
Jul 31 PHP
PHP封装curl的调用接口及常用函数详解
May 31 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 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动态创建Flash动画
2006/10/09 PHP
PHP模块 Memcached功能多于Memcache
2011/06/14 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
使用Vue CLI创建typescript项目的方法
2019/08/09 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
python读写ini配置文件方法实例分析
2015/06/30 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
Python中qutip用法示例详解
2020/10/02 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
治庸问责心得体会
2014/09/12 职场文书
邀请函样本
2015/02/02 职场文书
2015年女生节活动总结
2015/02/27 职场文书