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 相关文章推荐
ftp类(example.php)
Oct 09 PHP
配置最新的PHP加MYSQL服务器
Oct 09 PHP
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
Apr 20 PHP
php网上商城购物车设计代码分享
Feb 15 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 PHP
深入PHP magic quotes的详解
Jun 17 PHP
php通过数组实现多条件查询实现方法(字符串分割)
May 06 PHP
phpstorm配置Xdebug进行调试PHP教程
Dec 01 PHP
curl和libcurl的区别简介
Jul 01 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
是 WordPress 让 PHP 更流行了 而不是框架
Feb 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和.net中des加解密的实现方法
2013/02/27 PHP
php class中public,private,protected的区别以及实例分析
2013/06/18 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
php中session退出登陆问题
2014/02/27 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
javaScript基础详解
2017/01/19 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
详解Python中with语句的用法
2015/04/15 Python
python获取当前日期和时间的方法
2015/04/30 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
python如何制作英文字典
2019/06/25 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
学习2014年全国两会心得体会
2014/03/12 职场文书
元宵节主持词
2014/03/25 职场文书
大学生考试作弊检讨书
2014/09/21 职场文书
黄石寨导游词
2015/02/05 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
鸦片战争观后感
2015/06/09 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书