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中设置、使用、删除Cookie的解决方法
May 06 PHP
解析php安全性问题中的:Null 字符问题
Jun 21 PHP
smarty内置函数capture用法分析
Jan 22 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
Jul 15 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
PHP合并数组的2种方法小结
Nov 24 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
php使用GD2绘制几何图形示例
Feb 15 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
laravel 实现向公共模板中传值 (view composer)
Oct 22 PHP
laravel 解决paginate查询多个字段报错的问题
Oct 22 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 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+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
使用python实现接口的方法
2017/07/07 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
python实现xlsx文件分析详解
2018/01/02 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
python安装教程
2018/02/28 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
python 多个参数不为空校验方法
2019/02/14 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
css3学习心得分享
2013/08/19 HTML / CSS
html如何对span设置宽度
2019/10/30 HTML / CSS
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
给学校的建议书范文
2014/05/15 职场文书
技术股东合作协议书
2014/12/02 职场文书
2015年路政工作总结
2015/05/22 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
TV动画《间谍过家家》公开PV
2022/03/20 日漫