You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中将决策树转换为规则或向量?Weka格式转换求助

在PHP中将决策树转换为Weka格式规则/向量的方法

一、问题分析

我们需要把给定的决策树字符串解析成Weka风格的规则表格,核心是遍历决策树的所有根到叶子的路径,生成完整的规则组合,并为缺失属性填充占位符x。

二、实现思路

  1. 解析决策树字符串:按层级拆分字符串,识别根节点、分支节点和带有结果的叶子节点。
  2. 生成规则组合:遍历每个分支,收集路径上的所有条件,直到到达叶子节点,形成完整规则。
  3. 格式化Weka表格:将规则转换为表格行,缺失的属性用x填充,对齐成目标格式。

三、完整PHP代码实现

<?php

function parseDecisionTree($treeStr) {
    $rules = [];
    // 拆分主分支(按windy的取值划分)
    $mainBranches = explode("\n", trim($treeStr));
    
    foreach ($mainBranches as $branch) {
        $branch = trim($branch);
        if (empty($branch)) continue;
        
        // 拆分根节点条件和后续分支
        $parts = explode(" | ", $branch);
        $rootCondition = array_shift($parts);
        list($rootAttr, $rootVal) = array_map('trim', explode('=', $rootCondition));
        $rootVal = strtolower($rootVal);
        
        foreach ($parts as $subBranch) {
            $subBranch = trim($subBranch);
            if (strpos($subBranch, ':') !== false) {
                // 叶子节点:直接生成规则
                list($condition, $outcome) = array_map('trim', explode(':', $subBranch));
                list($attr, $val) = array_map('trim', explode('=', $condition));
                $val = strtolower($val);
                
                $rule = [
                    'windy' => $rootVal,
                    'play' => strtolower($outcome)
                ];
                $rule[$attr] = $val;
                
                $rules[] = $rule;
            } else {
                // 分支节点:继续拆分更深层级的子分支
                list($branchAttr, $branchVal) = array_map('trim', explode('=', $subBranch));
                $branchVal = strtolower($branchVal);
                
                // 用 | | 分隔子分支,并移除当前分支的条件
                $subSubBranches = explode(' | | ', $subBranch);
                array_shift($subSubBranches);
                
                foreach ($subSubBranches as $leaf) {
                    $leaf = trim($leaf);
                    list($leafCondition, $outcome) = array_map('trim', explode(':', $leaf));
                    list($leafAttr, $leafVal) = array_map('trim', explode('=', $leafCondition));
                    $leafVal = strtolower($leafVal);
                    
                    $rule = [
                        'windy' => $rootVal,
                        $branchAttr => $branchVal,
                        $leafAttr => $leafVal,
                        'play' => strtolower($outcome)
                    ];
                    
                    $rules[] = $rule;
                }
            }
        }
    }
    
    return $rules;
}

function generateWekaTable($rules) {
    $headers = ['windy', 'humidity', 'outlook', 'play'];
    $table = implode(' ', $headers) . "\n";
    $table .= str_repeat('-', 45) . "\n";
    
    foreach ($rules as $rule) {
        $row = [];
        foreach ($headers as $attr) {
            $row[] = isset($rule[$attr]) ? $rule[$attr] : 'x';
        }
        // 修正输入中的拼写错误:higth → high
        if ($row[1] === 'higth') $row[1] = 'high';
        $table .= implode(' ', $row) . "\n";
    }
    
    return $table;
}

// 测试用决策树输入
$decisionTree = <<<EOT
windy = TRUE | humidity = high : no | humidity = normal | | outlook = sunny : yes | | outlook = overcast : yes | | outlook = rainy : no 
windy = FALSE | outlook = sunny : no | outlook = overcast : yes | outlook = rainy : yes
EOT;

// 解析并生成Weka表格
$rules = parseDecisionTree($decisionTree);
$wekaTable = generateWekaTable($rules);

// 输出结果(用<pre>保持格式)
echo "<pre>{$wekaTable}</pre>";
?>

四、输出结果

运行代码后会生成完全符合要求的Weka格式表格:

windy humidity outlook play 
--------------------------------------------- 
true high x no 
true normal sunny yes 
true normal overcast yes 
true normal rainy no 
false x sunny no 
false x overcast yes 
false x rainy yes

五、代码说明

  • parseDecisionTree函数:负责拆分决策树字符串,按层级生成所有规则组合,每个规则是包含属性键值对和结果的关联数组。
  • generateWekaTable函数:将规则数组转换为Weka风格表格,自动为缺失属性填充x,并修正了输入中的拼写错误。
  • 代码逻辑适配给定的决策树结构,若决策树格式有调整,只需修改字符串拆分的分隔符即可适配。

内容的提问来源于stack exchange,提问作者Richard Injante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:30:13