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 相关文章推荐
递归列出所有文件和目录
Oct 09 PHP
source.php查看源文件
Dec 09 PHP
基于Discuz security.inc.php代码的深入分析
Jun 03 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
php实现对两个数组进行减法操作的方法
Apr 17 PHP
PHP+JS实现大规模数据提交的方法
Jul 02 PHP
详解php中反射的应用
Mar 15 PHP
修改Laravel5.3中的路由文件与路径
Aug 10 PHP
php版微信公众平台之微信网页登陆授权示例
Sep 23 PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 PHP
php给数组赋值的实例方法
Sep 26 PHP
关于laravel后台模板laravel-admin select框的使用详解
Oct 03 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开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
PHP获取MAC地址的具体实例
2013/12/13 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
在centos7中分布式部署pyspider
2017/05/03 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
Python中文件的读取和写入操作
2018/04/27 Python
python增加图像对比度的方法
2019/07/12 Python
python打包成so文件过程解析
2019/09/28 Python
在python中做正态性检验示例
2019/12/09 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
百联网上商城:i百联
2017/01/28 全球购物
超市理货员岗位职责
2014/07/04 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
三八节活动简报
2015/07/20 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python