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 查询指定日期时间内sql语句实现原理与代码
Dec 16 PHP
精美漂亮的php分页类代码
Apr 02 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
php之readdir函数用法实例
Nov 13 PHP
php集成环境xampp中apache无法启动问题解决方案
Nov 18 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
php判断表是否存在的方法
Jun 18 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
php压缩文件夹最新版
Jul 18 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
Aug 17 PHP
浅析PHP7 的垃圾回收机制
Sep 06 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中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
2011/05/04 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
google 搜索框添加关键字实现代码
2010/04/24 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
Python httplib,smtplib使用方法
2008/09/06 Python
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
python Tkinter的图片刷新实例
2019/06/14 Python
python二进制文件的转译详解
2019/07/03 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
ReVive利维肤美国官网:RéVive Skincare
2018/04/18 全球购物
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
入职担保书怎么写
2014/05/12 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
老人节标语大全
2014/10/08 职场文书