• 技术文章 >后端开发 >php教程

    php权重计算方法代码分享_php实例

    2016-05-17 08:51:22原创357
    复制代码 代码如下:

    /* 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);

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:权重计算
    上一篇:PHP上传图片进行等比缩放可增加水印功能_php技巧 下一篇:php获取从百度搜索进入网站的关键词的详细代码_php技巧
    PHP编程就业班

    相关文章推荐

    • 浅析PHP配置文件中的几种超时配置• 关于中英数字混的字串符分割问题_PHP教程• php 不使用js实现页面跳转_php技巧• PHP重定向的3种方式_PHP• fleaphp crud操作之findByField函数的使用方法_PHP

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网