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
dedecms中常见问题修改方法总结
Mar 21 PHP
php利用新浪接口查询ip获取地理位置示例
Jan 20 PHP
php中多维数组按指定value排序的实现代码
Aug 19 PHP
帝国cms目录结构分享
Jul 06 PHP
ThinkPHP项目分组配置方法分析
Mar 23 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
Oct 17 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 PHP
基于laravel缓冲cache的用法详解
Oct 23 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
怎么使 Mysql 数据同步
2006/10/09 PHP
PHP中基本符号及使用方法
2010/03/23 PHP
php设计模式 Prototype (原型模式)代码
2011/06/26 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
jquery tools 系列 scrollable学习
2009/09/06 Javascript
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
大一自我鉴定范文
2013/12/27 职场文书
公司离职证明范本
2014/01/13 职场文书
商场活动策划方案
2014/01/24 职场文书
护士岗位职责
2014/02/16 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
读书小明星事迹材料
2014/05/03 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
计算机网络专业自荐信
2014/07/04 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
react 路由Link配置详解
2021/11/11 Javascript