系统概述
这个系统将使用MySQL作为数据库,PHP作为后端语言,构建一个中医辩证论治的自动化平台。系统能够根据患者症状自动分析辩证类型,并提供相应的治疗建议。
数据库设计(MySQL)
-- 创建数据库
CREATE DATABASE tcm_diagnosis;
-- 使用数据库
USE tcm_diagnosis;
-- 症状表
CREATE TABLE symptoms (
symptom_id INT AUTO_INCREMENT PRIMARY KEY,
symptom_name VARCHAR(100) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 证型表
CREATE TABLE syndromes (
syndrome_id INT AUTO_INCREMENT PRIMARY KEY,
syndrome_name VARCHAR(100) NOT NULL,
description TEXT,
pathogenesis TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 症状-证型关联表
CREATE TABLE symptom_syndrome_relations (
relation_id INT AUTO_INCREMENT PRIMARY KEY,
symptom_id INT,
syndrome_id INT,
weight DECIMAL(3,2) DEFAULT 1.00,
FOREIGN KEY (symptom_id) REFERENCES symptoms(symptom_id),
FOREIGN KEY (syndrome_id) REFERENCES syndromes(syndrome_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 治疗方案表
CREATE TABLE treatments (
treatment_id INT AUTO_INCREMENT PRIMARY KEY,
syndrome_id INT,
treatment_name VARCHAR(100) NOT NULL,
treatment_method TEXT,
herbal_prescription TEXT,
acupuncture_points TEXT,
diet_advice TEXT,
lifestyle_advice TEXT,
FOREIGN KEY (syndrome_id) REFERENCES syndromes(syndrome_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 患者记录表
CREATE TABLE patients (
patient_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
gender ENUM('男', '女'),
age INT,
contact VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 诊断记录表
CREATE TABLE diagnosis_records (
record_id INT AUTO_INCREMENT PRIMARY KEY,
patient_id INT,
diagnosis_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tongue_description TEXT,
pulse_description TEXT,
other_observations TEXT,
FOREIGN KEY (patient_id) REFERENCES patients(patient_id)
);
-- 诊断记录-症状关联表
CREATE TABLE record_symptoms (
id INT AUTO_INCREMENT PRIMARY KEY,
record_id INT,
symptom_id INT,
severity ENUM('轻', '中', '重'),
FOREIGN KEY (record_id) REFERENCES diagnosis_records(record_id),
FOREIGN KEY (symptom_id) REFERENCES symptoms(symptom_id)
);
-- 诊断结果表
CREATE TABLE diagnosis_results (
result_id INT AUTO_INCREMENT PRIMARY KEY,
record_id INT,
syndrome_id INT,
confidence_score DECIMAL(5,2),
treatment_id INT,
notes TEXT,
FOREIGN KEY (record_id) REFERENCES diagnosis_records(record_id),
FOREIGN KEY (syndrome_id) REFERENCES syndromes(syndrome_id),
FOREIGN KEY (treatment_id) REFERENCES treatments(treatment_id)
);
PHP后端实现
数据库连接 (db_connect.php)
<?php
$host = 'localhost';
$dbname = 'tcm_diagnosis';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
?>
辩证论治核心逻辑 (diagnosis.php)
<?php
require_once 'db_connect.php';
class TCMDiagnosis {
private $pdo;
public function __construct($pdo) {
$this->pdo = $pdo;
}
// 添加新症状
public function addSymptom($name, $description) {
$stmt = $this->pdo->prepare("INSERT INTO symptoms (symptom_name, description) VALUES (?, ?)");
$stmt->execute([$name, $description]);
return $this->pdo->lastInsertId();
}
// 添加新证型
public function addSyndrome($name, $description, $pathogenesis) {
$stmt = $this->pdo->prepare("INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES (?, ?, ?)");
$stmt->execute([$name, $description, $pathogenesis]);
return $this->pdo->lastInsertId();
}
// 关联症状与证型
public function linkSymptomToSyndrome($symptomId, $syndromeId, $weight = 1.0) {
$stmt = $this->pdo->prepare("INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES (?, ?, ?)");
$stmt->execute([$symptomId, $syndromeId, $weight]);
return $this->pdo->lastInsertId();
}
// 添加治疗方案
public function addTreatment($syndromeId, $name, $method, $herbs, $acupuncture, $diet, $lifestyle) {
$stmt = $this->pdo->prepare("INSERT INTO treatments (syndrome_id, treatment_name, treatment_method, herbal_prescription, acupuncture_points, diet_advice, lifestyle_advice) VALUES (?, ?, ?, ?, ?, ?, ?)");
$stmt->execute([$syndromeId, $name, $method, $herbs, $acupuncture, $diet, $lifestyle]);
return $this->pdo->lastInsertId();
}
// 根据症状进行辩证
public function diagnose($symptomIds) {
// 获取所有相关证型及其权重
$placeholders = implode(',', array_fill(0, count($symptomIds), '?'));
$stmt = $this->pdo->prepare("
SELECT s.syndrome_id, s.syndrome_name, SUM(ssr.weight) as total_weight
FROM syndromes s
JOIN symptom_syndrome_relations ssr ON s.syndrome_id = ssr.syndrome_id
WHERE ssr.symptom_id IN ($placeholders)
GROUP BY s.syndrome_id
ORDER BY total_weight DESC
");
$stmt->execute($symptomIds);
$possibleSyndromes = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($possibleSyndromes)) {
return ['error' => '无法根据提供的症状确定证型'];
}
// 获取最可能的证型
$primarySyndrome = $possibleSyndromes[0];
// 获取该证型的治疗方案
$stmt = $this->pdo->prepare("
SELECT * FROM treatments
WHERE syndrome_id = ?
ORDER BY treatment_id LIMIT 1
");
$stmt->execute([$primarySyndrome['syndrome_id']]);
$treatment = $stmt->fetch(PDO::FETCH_ASSOC);
// 计算置信度 (简化版)
$maxPossibleWeight = count($symptomIds) * 1.0; // 假设最大权重为1.0
$confidence = ($primarySyndrome['total_weight'] / $maxPossibleWeight) * 100;
return [
'syndrome' => $primarySyndrome,
'treatment' => $treatment,
'confidence' => round($confidence, 2),
'other_possible' => array_slice($possibleSyndromes, 1)
];
}
// 创建患者记录
public function createPatientRecord($patientData, $symptoms, $tongue, $pulse, $other) {
// 添加患者基本信息
$stmt = $this->pdo->prepare("
INSERT INTO patients (name, gender, age, contact)
VALUES (?, ?, ?, ?)
");
$stmt->execute([
$patientData['name'],
$patientData['gender'],
$patientData['age'],
$patientData['contact']
]);
$patientId = $this->pdo->lastInsertId();
// 添加诊断记录
$stmt = $this->pdo->prepare("
INSERT INTO diagnosis_records (patient_id, tongue_description, pulse_description, other_observations)
VALUES (?, ?, ?, ?)
");
$stmt->execute([$patientId, $tongue, $pulse, $other]);
$recordId = $this->pdo->lastInsertId();
// 添加症状关联
foreach ($symptoms as $symptom) {
$stmt = $this->pdo->prepare("
INSERT INTO record_symptoms (record_id, symptom_id, severity)
VALUES (?, ?, ?)
");
$stmt->execute([$recordId, $symptom['id'], $symptom['severity']]);
}
// 进行辩证
$symptomIds = array_column($symptoms, 'id');
$diagnosisResult = $this->diagnose($symptomIds);
// 保存诊断结果
if (!isset($diagnosisResult['error'])) {
$stmt = $this->pdo->prepare("
INSERT INTO diagnosis_results (record_id, syndrome_id, confidence_score, treatment_id)
VALUES (?, ?, ?, ?)
");
$stmt->execute([
$recordId,
$diagnosisResult['syndrome']['syndrome_id'],
$diagnosisResult['confidence'],
$diagnosisResult['treatment']['treatment_id']
]);
$diagnosisResult['record_id'] = $recordId;
}
return $diagnosisResult;
}
// 获取患者历史记录
public function getPatientHistory($patientId) {
$stmt = $this->pdo->prepare("
SELECT dr.*, dr.diagnosis_date,
GROUP_CONCAT(s.symptom_name SEPARATOR ', ') as symptoms,
s.syndrome_name, s.description as syndrome_desc,
t.treatment_method, t.herbal_prescription,
dr.confidence_score
FROM diagnosis_records dr
LEFT JOIN record_symptoms rs ON dr.record_id = rs.record_id
LEFT JOIN symptoms s ON rs.symptom_id = s.symptom_id
LEFT JOIN diagnosis_results dr ON dr.record_id = dr.record_id
LEFT JOIN syndromes s ON dr.syndrome_id = s.syndrome_id
LEFT JOIN treatments t ON dr.treatment_id = t.treatment_id
WHERE dr.patient_id = ?
GROUP BY dr.record_id
ORDER BY dr.diagnosis_date DESC
");
$stmt->execute([$patientId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
?>
前端接口示例 (API endpoints)
<?php
require_once 'db_connect.php';
require_once 'diagnosis.php';
header("Content-Type: application/json");
$tcm = new TCMDiagnosis($pdo);
$action = $_GET['action'] ?? '';
try {
switch ($action) {
case 'diagnose':
$symptoms = json_decode(file_get_contents('php://input'), true);
$result = $tcm->diagnose($symptoms);
echo json_encode($result);
break;
case 'create_record':
$data = json_decode(file_get_contents('php://input'), true);
$result = $tcm->createPatientRecord(
$data['patient'],
$data['symptoms'],
$data['tongue'],
$data['pulse'],
$data['other']
);
echo json_encode($result);
break;
case 'patient_history':
$patientId = $_GET['patient_id'];
$history = $tcm->getPatientHistory($patientId);
echo json_encode($history);
break;
default:
echo json_encode(['error' => '无效的操作']);
}
} catch (Exception $e) {
echo json_encode(['error' => $e->getMessage()]);
}
?>
系统功能扩展建议
- 知识库完善:添加更多中医症状、证型及其关联关系,提高系统准确性
- 机器学习集成:使用历史诊断数据训练模型,优化辩证算法
- 中药数据库:建立完整的中药库,包括性味归经、功效等信息
- 方剂管理系统:管理经典方剂和自拟方剂
- 舌象分析:集成图像识别技术分析舌象
- 脉象分析:如有硬件支持,可添加脉象分析功能
- 报表生成:生成诊断报告和治疗方案文档
这个系统提供了一个基础框架,实际应用中需要根据具体需求进行调整和扩展,特别是中医知识库的构建需要专业中医师的参与以确保准确性。
如何应用中医辩证论治自动化系统
系统部署步骤
1. 环境准备
- 服务器环境:安装Apache/Nginx、PHP(7.4+)和MySQL(5.7+)
- 数据库配置:执行提供的SQL脚本创建数据库结构
- PHP配置:确保已安装PDO MySQL扩展
2. 系统安装
- 将PHP文件上传到Web服务器
- 修改
db_connect.php中的数据库连接信息 - 访问系统首页进行测试
基础数据录入
1. 录入中医症状数据
// 示例:添加常见症状
$tcm->addSymptom('头痛', '头部疼痛,可能为胀痛、刺痛等不同类型');
$tcm->addSymptom('发热', '体温高于正常范围');
$tcm->addSymptom('咳嗽', '肺气上逆作声,咯吐痰液');
// 可继续添加更多症状...
2. 录入中医证型数据
// 示例:添加常见证型
$tcm->addSyndrome(
'风寒感冒',
'因风寒之邪外袭、肺气失宣所致',
'风寒外袭,卫阳被郁,腠理闭塞,肺气不宣'
);
$tcm->addSyndrome(
'风热感冒',
'因风热之邪犯表、肺气失和所致',
'风热犯表,热郁肌腠,卫表失和,肺失清肃'
);
// 可继续添加更多证型...
3. 建立症状与证型关联
// 风寒感冒相关症状关联
$tcm->linkSymptomToSyndrome(1, 1, 0.9); // 头痛-风寒感冒
$tcm->linkSymptomToSyndrome(2, 1, 0.7); // 发热-风寒感冒(低热)
$tcm->linkSymptomToSyndrome(3, 1, 0.8); // 咳嗽-风寒感冒
// 风热感冒相关症状关联
$tcm->linkSymptomToSyndrome(1, 2, 0.6); // 头痛-风热感冒
$tcm->linkSymptomToSyndrome(2, 2, 0.9); // 发热-风热感冒(高热)
$tcm->linkSymptomToSyndrome(3, 2, 0.7); // 咳嗽-风热感冒
4. 添加治疗方案
// 风寒感冒治疗方案
$tcm->addTreatment(
1, // 风寒感冒证型ID
'辛温解表法',
'发汗解表,疏风散寒',
'麻黄9g、桂枝6g、杏仁9g、甘草3g',
'风池、风府、列缺、合谷',
'宜食辛温发散食物如生姜、葱白',
'避风寒,适当休息,保持温暖'
);
// 风热感冒治疗方案
$tcm->addTreatment(
2, // 风热感冒证型ID
'辛凉解表法',
'疏风清热,宣肺解表',
'银花9g、连翘9g、竹叶6g、荆芥6g、牛蒡子9g、淡豆豉6g、薄荷6g、甘草3g',
'大椎、曲池、合谷、外关',
'宜食辛凉透表食物如薄荷、菊花',
'多饮水,保持室内通风'
);
实际应用场景
1. 门诊诊断流程
- 患者信息录入:
$patientData = [
'name' => '张某某',
'gender' => '男',
'age' => 45,
'contact' => '13800138000'
];
- 症状收集:
$symptoms = [
['id' => 1, 'severity' => '中'], // 头痛(中度)
['id' => 2, 'severity' => '轻'], // 发热(轻度)
['id' => 3, 'severity' => '重'] // 咳嗽(重度)
];
- 四诊信息:
$tongue = '舌淡红,苔薄白';
$pulse = '脉浮紧';
$other = '恶寒重,发热轻,无汗';
- 执行诊断:
$result = $tcm->createPatientRecord($patientData, $symptoms, $tongue, $pulse, $other);
- 输出结果:
echo "最可能证型: " . $result['syndrome']['syndrome_name'] . "\n";
echo "置信度: " . $result['confidence'] . "%\n";
echo "治疗方案: " . $result['treatment']['treatment_method'] . "\n";
echo "中药处方: " . $result['treatment']['herbal_prescription'] . "\n";
2. 患者历史查询
$history = $tcm->getPatientHistory(1); // 查询患者ID为1的历史记录
foreach ($history as $record) {
echo "日期: " . $record['diagnosis_date'] . "\n";
echo "症状: " . $record['symptoms'] . "\n";
echo "诊断: " . $record['syndrome_name'] . "\n";
echo "处方: " . $record['herbal_prescription'] . "\n\n";
}
系统优化建议
- 知识库完善:
- 邀请中医专家参与症状、证型和治疗方案的审核
- 添加更多证型如气虚、血虚、痰湿等
- 完善症状的细分(如头痛部位、性质等)
- 算法优化:
- 根据症状严重程度调整权重
- 考虑症状组合的特殊意义
- 添加排除规则(某些症状组合可排除特定证型)
- 用户界面开发:
- 开发Web界面方便医生使用
- 添加症状选择树状结构
- 开发移动端应用支持远程诊疗
- 数据分析功能:
- 统计常见证型分布
- 分析治疗方案有效性
- 发现症状关联规律
- 系统集成:
- 与医院HIS系统对接
- 添加电子病历功能
- 支持处方打印和导出
注意事项
- 专业监督:系统应始终在中医师监督下使用,不能完全替代专业判断
- 数据安全:患者医疗数据需加密存储,符合医疗数据保护规范
- 持续更新:中医知识库需要定期更新和维护
- 个性化调整:系统提供的治疗方案应根据患者具体情况调整
通过以上步骤,您可以部署和应用这个中医辩证论治自动化系统,辅助中医临床诊断和治疗方案制定。系统核心价值在于标准化中医辩证流程和提高诊断效率,但最终决策仍需依赖医师的专业判断。
Certainly! Let me explain the linkSymptomToSyndrome() method and these specific examples in detail.
Understanding linkSymptomToSyndrome()
This method establishes a weighted relationship between a symptom and a syndrome (中医证型) in the TCM (Traditional Chinese Medicine) diagnosis system. The parameters are:
$tcm->linkSymptomToSyndrome($symptomId, $syndromeId, $weight);
- $symptomId: The ID of the symptom (from the
symptomstable) - $syndromeId: The ID of the syndrome (from the
syndromestable) - $weight: A decimal value (typically 0.0-1.0) representing how strongly this symptom indicates this particular syndrome
Your Specific Examples Explained
- 头痛 (Headache) – 风寒感冒 (Wind-Cold Common Cold)
$tcm->linkSymptomToSyndrome(1, 1, 0.9);
- This means headache (symptom ID 1) is very strongly associated (weight 0.9) with wind-cold common cold (syndrome ID 1)
- In TCM theory, headache is a primary symptom of wind-cold invasion, especially when the pain is in the occipital region and worsens with cold
- 发热 (Fever) – 风寒感冒 (Wind-Cold Common Cold)
$tcm->linkSymptomToSyndrome(2, 1, 0.7);
- Fever (symptom ID 2) is moderately associated (weight 0.7) with wind-cold
- Note the lower weight because in wind-cold patterns, fever is typically mild (低热) compared to wind-heat patterns where fever is more pronounced
- The comment “(低热)” reminds us this is for low-grade fever
- 咳嗽 (Cough) – 风寒感冒 (Wind-Cold Common Cold)
$tcm->linkSymptomToSyndrome(3, 1, 0.8);
- Cough (symptom ID 3) is strongly associated (weight 0.8) with wind-cold
- In wind-cold patterns, the cough is typically with thin white phlegm and may be accompanied by an itchy throat
Clinical Significance
These weights reflect TCM clinical patterns:
- High weight (0.9): Nearly pathognomonic for this syndrome (e.g., occipital headache for wind-cold)
- Medium weight (0.7-0.8): Common but not exclusive to this syndrome
- Low weight (<0.5): May appear but not characteristic
How the System Uses These Relationships
When a patient presents with multiple symptoms:
- The system sums weights for each possible syndrome
- Syndromes with higher total weights are more likely
- For your examples, a patient with headache + fever + cough would score:
- Wind-cold: 0.9 + 0.7 + 0.8 = 2.4
- Compare this to other syndromes’ scores to determine the most likely pattern
Important Notes
- Weights should be determined by:
- Classical TCM texts
- Clinical experience
- Statistical analysis of cases
- These relationships form the core of the pattern differentiation (辩证) algorithm
- A complete system would have many more such relationships to cover all common TCM patterns
Would you like me to explain how to determine appropriate weights or how to extend this to more complex patterns?
好的,我用中文详细解释这些症状与证型的关联关系:
linkSymptomToSyndrome() 方法的作用
这是中医辨证系统中用于 建立症状与证型关联关系 的核心方法,参数如下:
$tcm->linkSymptomToSyndrome(症状ID, 证型ID, 权重值);
- 症状ID:对应
symptoms表中的症状(如头痛、发热) - 证型ID:对应
syndromes表中的证型(如风寒感冒、风热感冒) - 权重值:0.0~1.0的小数,表示 该症状对该证型的指向性强度(越接近1,关联性越强)
具体示例解析
1. 头痛 → 风寒感冒(权重0.9)
$tcm->linkSymptomToSyndrome(1, 1, 0.9); // 头痛-风寒感冒
- 中医理论依据:
风寒感冒的头痛特点是 后脑勺疼痛明显,伴随怕风怕冷,疼痛遇寒加重。这是风寒表证的典型表现,因此权重很高(0.9)。 - 临床意义:
如果患者有头痛,系统会优先考虑风寒感冒的可能性。
2. 发热 → 风寒感冒(权重0.7,标注”低热”)
$tcm->linkSymptomToSyndrome(2, 1, 0.7); // 发热-风寒感冒(低热)
- 中医理论依据:
风寒感冒的发热通常是 低热(体温轻度升高),且患者自觉恶寒(怕冷)重于发热。相比风热感冒的高热,风寒发热的权重较低(0.7)。 - 关键区别:
如果是风热感冒,发热权重可能设为0.9(因风热以高热为主)。
3. 咳嗽 → 风寒感冒(权重0.8)
$tcm->linkSymptomToSyndrome(3, 1, 0.8); // 咳嗽-风寒感冒
- 中医理论依据:
风寒咳嗽的特点是 咳声重浊、痰白清稀,伴喉痒,因肺气被寒邪郁闭所致。这是风寒袭肺的常见症状,但咳嗽也可见于其他证型(如风热、痰湿),因此权重略低于头痛(0.8)。
权重设定的临床逻辑
| 权重范围 | 含义 | 示例 |
|---|---|---|
| 0.9~1.0 | 高度特异性症状(几乎可确定证型) | 风寒感冒的后脑头痛 |
| 0.7~0.8 | 常见但不唯一的症状 | 风寒感冒的咳嗽、低热 |
| <0.5 | 非典型症状(需结合其他症状) | 风寒感冒偶尔出现的鼻塞(0.4) |
系统如何计算辨证结果?
假设患者有以下症状:
- 头痛(ID=1)
- 发热(ID=2)
- 咳嗽(ID=3)
系统会:
- 遍历所有关联证型,计算总分:
- 风寒感冒总分 = 0.9(头痛) + 0.7(发热) + 0.8(咳嗽) = 2.4
- 风热感冒总分(假设关联权重不同)= 0.6 + 0.9 + 0.5 = 2.0
- 选择总分最高的证型(此例中优先辨为风寒感冒)。
实际应用注意事项
- 动态调整权重:
- 如果患者头痛为 胀痛(风热特征),可能需要降低风寒权重。
- 舌脉信息(如苔白、脉浮紧)可额外加分。
- 症状组合逻辑:
- 风寒感冒的典型组合是 头痛+恶寒+无汗+脉浮紧,组合出现时权重可叠加。
- 排除规则:
- 若患者有 口渴喜冷饮(风热特征),即使有头痛,也应降低风寒感冒的可能性。
扩展建议
如果需要更精准的辨证,可以:
- 细分症状属性:
- 头痛分为”前额痛”(阳明经)、”两侧痛”(少阳经)、”后头痛”(太阳经)。
- 添加反向权重:
- 例如”高热”对风寒感冒可能是负权重(-0.5),因风寒通常不出现高热。
需要进一步讨论具体症状的权重设置吗?或者如何结合舌脉信息优化算法?
好的!我们将从 症状权重精细化设置 和 舌脉信息整合算法 两个方向深入探讨如何优化中医辨证系统。以下是具体方案:
一、症状权重设置的进阶策略
1. 症状分级与动态权重
-- 数据库优化:症状表添加特征字段
ALTER TABLE symptoms ADD COLUMN specificity ENUM('高', '中', '低') DEFAULT '中';
ALTER TABLE symptoms ADD COLUMN intensity_affect BOOLEAN DEFAULT TRUE; -- 是否受症状程度影响
| 症状类型 | 权重范围 | 示例 | 调整逻辑 |
|---|---|---|---|
| 核心症状 | 0.8~1.0 | 风寒感冒的”恶寒无汗” | 必须出现,否则排除该证型 |
| 典型症状 | 0.6~0.8 | 风寒感冒的”鼻流清涕” | 出现2个以上显著提升证型概率 |
| 非特异症状 | 0.3~0.5 | “乏力”(可见于多种证型) | 需结合其他症状判断 |
PHP实现动态权重调整:
// 考虑症状程度(轻/中/重)的权重计算
function calculateAdjustedWeight($baseWeight, $severity) {
$multiplier = [
'轻' => 0.7,
'中' => 1.0,
'重' => 1.3
];
return min(1.0, $baseWeight * $multiplier[$severity]);
}
// 示例:风寒咳嗽症状重度时权重提升
$adjustedWeight = calculateAdjustedWeight(0.8, '重'); // 0.8 → 1.04(最终取1.0)
2. 症状组合逻辑
// 特殊组合加成规则(需在diagnose()方法中添加)
$specialCombos = [
'风寒感冒' => [
['symptoms' => [1, 4], 'bonus' => 0.2], // 头痛+鼻塞清涕
['symptoms' => [2, 5], 'bonus' => 0.3] // 发热+无汗
]
];
// 在计算总权重时检查组合
foreach ($specialCombos[$syndrome] as $combo) {
if (array_intersect($combo['symptoms'], $inputSymptoms) == $combo['symptoms']) {
$totalWeight += $combo['bonus'];
}
}
二、舌脉信息的整合算法
1. 舌象特征量化表
CREATE TABLE tongue_features (
feature_id INT PRIMARY KEY,
feature_name VARCHAR(50) NOT NULL, -- 如"舌淡红"、"苔薄白"
syndrome_weights JSON NOT NULL -- 存储各证型的关联权重
);
-- 示例数据(风寒感冒部分)
INSERT INTO tongue_features VALUES
(1, '舌淡红', '{"风寒感冒":0.7, "风热感冒":0.2}'),
(2, '苔薄白', '{"风寒感冒":0.8, "痰湿证":0.1}');
2. 脉象特征处理
CREATE TABLE pulse_patterns (
pattern_id INT PRIMARY KEY,
pattern_name VARCHAR(50) NOT NULL, -- 如"脉浮紧"
syndrome_weights JSON NOT NULL
);
-- 示例脉象权重
INSERT INTO pulse_patterns VALUES
(1, '脉浮紧', '{"风寒感冒":0.9, "表寒证":0.85}'),
(2, '脉浮数', '{"风热感冒":0.9, "卫分证":0.7}');
3. 综合辨证算法升级
// 新版diagnose()方法加入舌脉分析
public function diagnose($symptomIds, $tongueFeatureId, $pulsePatternId) {
// 原有症状分析
$syndromeWeights = $this->calculateSymptomWeights($symptomIds);
// 舌象分析
$tongueWeights = $this->getTongueWeights($tongueFeatureId);
foreach ($tongueWeights as $syndrome => $weight) {
$syndromeWeights[$syndrome] += $weight * 0.5; // 舌象权重系数
}
// 脉象分析
$pulseWeights = $this->getPulseWeights($pulsePatternId);
foreach ($pulseWeights as $syndrome => $weight) {
$syndromeWeights[$syndrome] += $weight * 0.6; // 脉象权重系数
}
arsort($syndromeWeights);
return $syndromeWeights;
}
4. 冲突处理规则
当症状与舌脉矛盾时:
// 在返回结果前添加验证
foreach ($syndromeWeights as $syndrome => $weight) {
if ($this->hasConflict($syndrome, $tongueFeatureId, $pulsePatternId)) {
$syndromeWeights[$syndrome] *= 0.5; // 矛盾证型降权
}
}
// 冲突检测示例
private function hasConflict($syndrome, $tongueId, $pulseId) {
$conflicts = [
'风寒感冒' => [
'tongue' => ['舌红苔黄'], // 风寒不应出现热象舌
'pulse' => ['脉数'] // 风寒脉应浮紧而非数
]
];
// 检测逻辑实现...
}
三、临床验证与调参方法
1. **权重校准流程
graph TD
A[收集临床病例数据] --> B[专家标注标准辨证]
B --> C[系统初步预测]
C --> D{对比分析}
D -->|准确率<85%| E[调整症状/舌脉权重]
D -->|准确率≥85%| F[冻结当前参数版本]
2. 关键调参原则
- 舌脉权重占比:建议症状占60%,舌象20%,脉象20%(可根据病种调整)
- 否决性特征:如出现”舌红绛”则直接排除风寒感冒
- 季节修正因子:冬季风寒感冒的基础权重可上浮10%
四、完整应用示例
场景:患者冬季就诊,症状如下:
- 症状:剧烈头痛(重)、轻度咳嗽(轻)、无汗
- 舌象:舌淡红,苔薄白(ID=1)
- 脉象:脉浮紧(ID=1)
系统运算过程:
- 症状权重计算:
- 头痛:1.0(基础0.8 × 重度1.3)
- 咳嗽:0.56(基础0.8 × 轻度0.7)
- 无汗:0.9(特殊症状)
- 组合加成:头痛+无汗 → +0.3
- 季节加成:×1.1
- 小计:(1.0 + 0.56 + 0.9 + 0.3) × 1.1 = 3.036
- 舌脉权重:
- 舌象:0.7(风寒)
- 脉象:0.9(风寒)
- 小计:0.7×0.5 + 0.9×0.6 = 0.89
- 总分:3.036 + 0.89 = 3.926 → 确诊为风寒感冒
通过这种结构化设计,系统可实现:
- 症状特征量化的标准化辨证
- 舌脉信息的科学整合
- 临床适应性的动态调整
需要继续探讨如何实现机器学习动态调参,或是具体病种(如咳嗽、失眠)的专项优化吗?

Leave a Reply