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 相关文章推荐
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
Mar 21 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
str_replace只替换一次字符串的方法
Apr 09 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
Smarty分页实现方法完整实例
May 11 PHP
PHP验证码类ValidateCode解析
Jan 07 PHP
Yii2 加载css、js 载静态资源的方法
Mar 10 PHP
yii框架数据库关联查询操作示例
Oct 14 PHP
PHP 加密 Password Hashing API基础知识点
Mar 02 PHP
用php如何解决大文件分片上传问题
Jul 07 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
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
zTree树形插件异步加载方法详解
2017/06/14 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
Python进阶之@property动态属性的实现
2019/04/01 Python
在django模板中实现超链接配置
2019/08/21 Python
tensorflow 环境变量设置方式
2020/02/06 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
医学专业毕业生个人的求职信
2013/12/04 职场文书
党员自我剖析材料(群众路线)
2014/10/06 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
Ruby处理YAML和json数据
2022/04/18 Ruby