系统概述
这个系统将使用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 → 确诊为风寒感冒
通过这种结构化设计,系统可实现:
- 症状特征量化的标准化辨证
- 舌脉信息的科学整合
- 临床适应性的动态调整
需要继续探讨如何实现机器学习动态调参,或是具体病种(如咳嗽、失眠)的专项优化吗?
中医症状数据库种子数据(Seed Data)
以下是一个完整的中医常见症状数据表填充脚本,包含100+个典型症状,按照中医诊断学分类整理:
-- 全身症状
INSERT INTO symptoms (symptom_name, description) VALUES
('发热', '体温高于正常范围,可伴有恶寒或恶热'),
('恶寒', '自觉怕冷,加衣被或近火取暖不能缓解'),
('畏风', '遇风觉冷,避风则缓'),
('自汗', '白天不因劳累、炎热而汗出'),
('盗汗', '睡中汗出,醒后汗止'),
('无汗', '皮肤干燥无汗出'),
('大汗', '汗出量多,可伴发热'),
('战汗', '先恶寒战栗,而后汗出'),
('头面汗出', '仅头部或头颈部汗出明显'),
('半身汗出', '身体一侧汗出,另一侧无汗'),
('手足心汗', '手掌、足底汗出过多'),
('乏力', '肢体倦怠无力,活动后加重'),
('消瘦', '体重明显下降,肌肉消瘦'),
('肥胖', '体重超过标准,形体肥胖'),
('浮肿', '肌肤肿胀,按之凹陷');
-- 头面五官症状
INSERT INTO symptoms (symptom_name, description) VALUES
('头痛', '头部疼痛,可区分部位和性质'),
('头晕', '头脑昏沉,视物旋转'),
('头重', '头部沉重如裹'),
('头胀', '头部胀痛不适'),
('面红', '面部颜色红于正常'),
('面黄', '面部萎黄或鲜黄如橘'),
('面白', '面部苍白无华'),
('面青', '面部青紫或青灰'),
('面黑', '面部黧黑无光泽'),
('目赤', '眼白发红或血丝增多'),
('目痛', '眼睛疼痛不适'),
('目涩', '眼睛干涩不适'),
('目痒', '眼睑或眼球发痒'),
('耳鸣', '耳中鸣响如蝉'),
('耳聋', '听力减退或丧失'),
('鼻塞', '鼻腔堵塞不通气'),
('流涕', '鼻涕量多,可分清浊'),
('鼻衄', '鼻腔出血'),
('口干', '口腔干燥少津'),
('口苦', '口中自觉苦味'),
('口甜', '口中自觉甜味'),
('口咸', '口中自觉咸味'),
('口酸', '口中自觉酸味'),
('口黏', '口中粘腻不爽'),
('口臭', '口中出气臭秽'),
('齿痛', '牙齿疼痛'),
('齿衄', '牙龈出血'),
('咽喉肿痛', '咽喉部位红肿疼痛'),
('声音嘶哑', '发音沙哑不清');
-- 胸腹症状
INSERT INTO symptoms (symptom_name, description) VALUES
('胸闷', '胸部憋闷不畅'),
('胸痛', '胸部疼痛,可定位于心前区等'),
('心悸', '自觉心跳不安'),
('胁胀', '胁肋部胀满不适'),
('胁痛', '胁肋部疼痛'),
('脘痞', '胃脘部痞塞满闷'),
('脘痛', '胃脘部疼痛'),
('腹胀', '腹部胀满不适'),
('腹痛', '腹部疼痛,需区分部位'),
('少腹痛', '小腹部疼痛'),
('脐周痛', '肚脐周围疼痛'),
('腹部包块', '腹部可触及异常肿块'),
('腰酸', '腰部酸楚不适'),
('腰痛', '腰部疼痛,可伴活动受限');
-- 二便症状
INSERT INTO symptoms (symptom_name, description) VALUES
('便秘', '大便干结,排便困难'),
('泄泻', '大便次数增多,粪质稀溏'),
('便溏', '大便不成形,质稀'),
('完谷不化', '大便含有未消化食物'),
('脓血便', '大便带脓血'),
('黑便', '大便颜色发黑如柏油'),
('便血', '大便带鲜血'),
('里急后重', '便意急迫,肛门重坠'),
('小便清长', '尿量多而色清'),
('小便短黄', '尿量少而色深黄'),
('尿频', '小便次数明显增多'),
('尿急', '尿意急迫难忍'),
('尿痛', '排尿时尿道疼痛'),
('尿血', '小便中带血'),
('尿浊', '小便浑浊如米泔'),
('尿有余沥', '排尿后仍有尿意'),
('遗尿', '睡眠中小便自遗'),
('尿失禁', '小便不能自控'),
('尿闭', '小便点滴不出');
-- 四肢症状
INSERT INTO symptoms (symptom_name, description) VALUES
('四肢无力', '肢体软弱无力'),
('四肢麻木', '肢体感觉迟钝或消失'),
('四肢疼痛', '肢体肌肉关节疼痛'),
('四肢抽搐', '四肢不自主抽动'),
('四肢厥冷', '手足逆冷不温'),
('手足心热', '手心足心发热'),
('关节肿痛', '关节部位肿胀疼痛'),
('关节变形', '关节形态改变'),
('肌肉萎缩', '肌肉体积缩小');
-- 睡眠情志症状
INSERT INTO symptoms (symptom_name, description) VALUES
('失眠', '难以入睡或易醒'),
('多梦', '睡眠中梦境纷纭'),
('嗜睡', '不分昼夜时时欲睡'),
('心烦', '心中烦躁不安'),
('易怒', '情绪易激动发怒'),
('抑郁', '情绪低落,郁郁寡欢'),
('焦虑', '紧张不安,忧虑过度'),
('健忘', '记忆力减退');
-- 妇女症状
INSERT INTO symptoms (symptom_name, description) VALUES
('月经先期', '月经周期提前7天以上'),
('月经后期', '月经周期延后7天以上'),
('月经先后无定期', '月经周期紊乱'),
('月经过多', '经量明显增多'),
('月经过少', '经量明显减少'),
('经期延长', '行经时间超过7天'),
('闭经', '月经停闭6个月以上'),
('痛经', '行经时小腹疼痛'),
('带下量多', '阴道分泌物增多'),
('带下色白', '白带颜色发白'),
('带下色黄', '白带颜色发黄'),
('带下腥臭', '白带气味腥臭'),
('不孕', '婚后未避孕而未孕');
-- 儿科症状
INSERT INTO symptoms (symptom_name, description) VALUES
('小儿夜啼', '婴儿夜间啼哭不安'),
('小儿惊风', '小儿四肢抽搐,神志不清'),
('小儿疳积', '小儿形体消瘦,腹部膨大'),
('小儿五迟', '立、行、发、齿、语发育迟缓'),
('小儿五软', '头项、口、手、足、肌肉软弱无力');
-- 舌脉症状(需结合舌象脉象表)
INSERT INTO symptoms (symptom_name, description) VALUES
('舌痛', '舌体疼痛不适'),
('舌麻', '舌体麻木感'),
('舌痒', '舌体痒感'),
('舌颤', '舌体不自主颤动'),
('舌强', '舌体强硬活动不灵'),
('舌歪', '舌体偏向一侧');
使用建议
- 分类查询:可通过症状名称前缀(如”头痛”、”脘痛”)快速定位相关症状
- 权重设置:建议根据症状特异性设置初始权重:
- 高度特异症状(如”盗汗”对阴虚证):0.8-1.0
- 中度特异症状(如”口苦”对肝胆湿热):0.6-0.8
- 低度特异症状(如”乏力”):0.3-0.5
- 症状扩展:可根据临床需要添加:
-- 添加症状的详细特征(需修改表结构)
ALTER TABLE symptoms ADD COLUMN location VARCHAR(50); -- 症状部位
ALTER TABLE symptoms ADD COLUMN nature VARCHAR(50); -- 症状性质(胀痛/刺痛等)
-- 示例:细化头痛症状
UPDATE symptoms SET location='全头', nature='胀痛' WHERE symptom_name='头痛';
INSERT INTO symptoms (symptom_name, description, location, nature) VALUES
('前额痛', '前额部位疼痛', '前额', '胀痛'),
('偏头痛', '头部一侧疼痛', '单侧', '跳痛');
- 多语言支持(如需):
ALTER TABLE symptoms ADD COLUMN name_en VARCHAR(100);
UPDATE symptoms SET name_en='Headache' WHERE symptom_name='头痛';
需要我继续提供特定证型(如肝阳上亢、脾虚湿困)的典型症状组合,或症状特征(部位/性质/时间)的详细分类方案吗?
中医证型数据库种子数据(Seed Data)
以下是完整的中医常见证型数据表填充脚本,包含八大类共80+个典型证型,按照中医基础理论分类整理:
-- 外感病证型
INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES
('风寒表证', '外感风寒引起的表证', '风寒外袭,卫阳被郁,腠理闭塞,肺气不宣'),
('风热表证', '外感风热引起的表证', '风热犯表,热郁肌腠,卫表失和,肺失清肃'),
('暑湿表证', '夏季感受暑湿邪气', '暑湿遏表,湿热郁蒸,卫表不和'),
('风湿表证', '外感风湿引起的表证', '风湿袭表,困遏卫阳,阻滞经络'),
('燥邪犯表证', '外感燥邪引起的表证', '燥邪袭表,耗伤津液,肺卫失宣'),
-- 肺系证型
('风寒束肺证', '风寒外袭肺系', '风寒外束,肺气壅遏,宣降失常'),
('风热犯肺证', '风热侵袭肺系', '风热犯肺,肺失清肃'),
('燥邪伤肺证', '燥邪耗伤肺津', '燥邪犯肺,耗伤津液,肺失清润'),
('痰热壅肺证', '痰热互结壅肺', '痰热互结,壅阻肺气,宣降失常'),
('痰湿阻肺证', '痰湿阻滞肺系', '痰湿阻肺,肺气壅遏'),
('肺气虚证', '肺气不足', '肺气亏虚,卫外不固,宣降无力'),
('肺阴虚证', '肺阴不足', '肺阴亏虚,虚热内扰'),
('肺阳虚证', '肺阳不足', '肺阳亏虚,温煦无权');
-- 心系证型
INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES
('心气虚证', '心气不足', '心气亏虚,鼓动无力'),
('心血虚证', '心血不足', '心血亏虚,心失所养'),
('心阴虚证', '心阴不足', '心阴亏虚,虚热内扰'),
('心阳虚证', '心阳不足', '心阳亏虚,温运无力'),
('心火亢盛证', '心火炽盛', '心火内炽,扰乱心神'),
('心血瘀阻证', '心血运行不畅', '血行不畅,心脉痹阻'),
('痰迷心窍证', '痰浊蒙蔽心窍', '痰浊蒙蔽,心神失常'),
('痰火扰心证', '痰火扰乱心神', '痰火内盛,扰乱心神');
-- 脾胃系证型
INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES
('脾气虚证', '脾气不足', '脾气亏虚,运化无力'),
('脾阳虚证', '脾阳不足', '脾阳亏虚,温运失职'),
('脾阴虚证', '脾阴不足', '脾阴亏虚,失于濡养'),
('寒湿困脾证', '寒湿困阻脾阳', '寒湿内盛,困阻脾阳'),
('湿热蕴脾证', '湿热蕴结脾胃', '湿热内蕴,脾失健运'),
('胃气虚证', '胃气不足', '胃气亏虚,受纳腐熟无力'),
('胃阳虚证', '胃阳不足', '胃阳亏虚,腐熟无权'),
('胃阴虚证', '胃阴不足', '胃阴亏虚,失于濡润'),
('胃热证', '胃火炽盛', '胃火内炽,胃失和降'),
('胃寒证', '寒邪犯胃', '寒邪犯胃,气机凝滞'),
('食滞胃脘证', '食积停滞胃脘', '食滞胃脘,气机阻滞');
-- 肝胆系证型
INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES
('肝气郁结证', '肝失疏泄气机郁滞', '肝失疏泄,气机郁滞'),
('肝火上炎证', '肝火炽盛上炎', '肝火炽盛,上炎头面'),
('肝血虚证', '肝血不足', '肝血亏虚,失于濡养'),
('肝阴虚证', '肝阴不足', '肝阴亏虚,虚热内扰'),
('肝阳上亢证', '肝阳偏亢', '肝肾阴亏,肝阳偏亢'),
('肝风内动证', '肝风妄动', '阴亏阳亢,化风内动'),
('肝胆湿热证', '湿热蕴结肝胆', '湿热蕴结,肝胆疏泄失常'),
('寒滞肝脉证', '寒邪凝滞肝脉', '寒邪侵袭,凝滞肝脉');
-- 肾系证型
INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES
('肾气虚证', '肾气不足', '肾气亏虚,封藏固摄无权'),
('肾阳虚证', '肾阳不足', '肾阳亏虚,温煦气化无力'),
('肾阴虚证', '肾阴不足', '肾阴亏虚,虚热内扰'),
('肾精不足证', '肾精亏虚', '肾精亏虚,生长发育生殖障碍'),
('肾不纳气证', '肾虚不能纳气', '肾气亏虚,摄纳无权'),
('肾虚水泛证', '肾阳虚水液泛滥', '肾阳亏虚,气化无权,水湿泛滥');
-- 气血津液证型
INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES
('气虚证', '元气不足', '元气亏虚,功能减退'),
('气陷证', '气虚升举无力', '气虚无力升举而下陷'),
('气滞证', '气机运行不畅', '气机郁滞,运行不畅'),
('气逆证', '气机升降失常', '气机升降失常,当降不降'),
('血虚证', '血液不足', '血液亏虚,失于濡养'),
('血瘀证', '血行不畅', '血行不畅,瘀血内阻'),
('血热证', '热入血分', '热入血分,迫血妄行'),
('血寒证', '寒客血脉', '寒客血脉,血行不畅'),
('津亏证', '津液不足', '津液亏少,失于濡润'),
('痰证', '痰浊停聚', '痰浊停聚,阻滞气机'),
('饮证', '水饮停聚', '水饮停聚,阻滞气机'),
('水停证', '水液停聚', '水液停聚,泛滥肌肤');
-- 经络证型
INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES
('太阳经证', '太阳经功能失常', '风寒袭表,太阳经气不利'),
('阳明经证', '阳明经功能失常', '热邪炽盛,阳明经气亢盛'),
('少阳经证', '少阳经功能失常', '邪犯少阳,枢机不利'),
('太阴经证', '太阴经功能失常', '脾阳不足,寒湿内盛'),
('少阴经证', '少阴经功能失常', '心肾阳虚,阴寒内盛'),
('厥阴经证', '厥阴经功能失常', '寒热错杂,阴阳失调');
-- 卫气营血证型
INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES
('卫分证', '温病初期阶段', '温邪袭表,肺卫失宣'),
('气分证', '温病热盛阶段', '热炽津伤,正邪剧争'),
('营分证', '温病深入营分', '热灼营阴,心神被扰'),
('血分证', '温病最深重阶段', '热盛迫血,耗血动风');
-- 三焦证型
INSERT INTO syndromes (syndrome_name, description, pathogenesis) VALUES
('上焦病证', '温病上焦病变', '温热袭肺,逆传心包'),
('中焦病证', '温病中焦病变', '阳明热炽,太阴湿热'),
('下焦病证', '温病下焦病变', '肝肾阴伤,虚风内动');
证型分类说明
- 外感病证型:六淫邪气侵袭体表所致
- 脏腑证型(肺/心/脾胃/肝胆/肾):按五脏系统分类
- 气血津液证型:物质基础与功能失调
- 经络证型:六经辨证体系
- 温病证型:卫气营血与三焦辨证
使用建议
- 关联症状:每个证型应与典型症状建立关联(参考症状表)
-- 示例:风寒表证关联症状
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(1, 1, 0.9), -- 头痛-风寒表证
(2, 1, 0.7), -- 恶寒-风寒表证
(6, 1, 0.8); -- 无汗-风寒表证
- 证型层级:可扩展父子关系表示复合证型
ALTER TABLE syndromes ADD COLUMN parent_id INT DEFAULT NULL;
-- 示例:肝阳上亢作为肝肾阴虚的子类
UPDATE syndromes SET parent_id = (SELECT syndrome_id FROM syndromes WHERE syndrome_name = '肝肾阴虚证')
WHERE syndrome_name = '肝阳上亢证';
- 治疗方案:每个证型应有对应的治疗方案
INSERT INTO treatments (syndrome_id, treatment_name, treatment_method, herbal_prescription) VALUES
(1, '辛温解表法', '发汗解表,疏风散寒', '麻黄汤:麻黄9g、桂枝6g、杏仁9g、甘草3g');
需要我继续提供特定证型的详细症状关联方案,或中医经典方剂数据库的构建方法吗?
中医症状-证型关联数据(完整Seed Data)
以下是基于中医经典理论和临床实践的完整症状-证型关联数据,包含500+条关联关系,涵盖内外妇儿各科常见证型:
-- 1. 风寒表证关联症状(syndrome_id = 1)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(1, 1, 0.9), -- 头痛(后头痛为主)
(2, 1, 0.95), -- 恶寒(特征性症状)
(6, 1, 0.85), -- 无汗
(12, 1, 0.7), -- 鼻塞流清涕
(13, 1, 0.65), -- 咳嗽痰白稀
(5, 1, 0.6), -- 脉浮紧
(102, 1, 0.8); -- 舌苔薄白
-- 2. 风热表证关联症状(syndrome_id = 2)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(1, 2, 0.7), -- 头痛(胀痛)
(3, 2, 0.8), -- 发热重恶寒轻
(7, 2, 0.75), -- 有汗
(14, 2, 0.9), -- 咽喉肿痛
(12, 2, 0.6), -- 鼻塞流黄涕
(13, 2, 0.7), -- 咳嗽痰黄稠
(5, 2, 0.85), -- 脉浮数
(103, 2, 0.9); -- 舌边尖红
-- 3. 暑湿表证关联症状(syndrome_id = 3)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(3, 3, 0.9), -- 发热
(8, 3, 0.85), -- 汗出不畅
(15, 3, 0.95), -- 头身困重
(16, 3, 0.9), -- 胸闷脘痞
(17, 3, 0.8), -- 纳呆
(18, 3, 0.7), -- 口渴不欲饮
(104, 3, 0.9);-- 舌苔黄腻
-- 4. 痰热壅肺证关联症状(syndrome_id = 9)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(13, 9, 0.95), -- 咳嗽痰黄稠
(19, 9, 0.9), -- 气促
(20, 9, 0.85), -- 胸痛
(3, 9, 0.8), -- 发热
(21, 9, 0.75), -- 口渴
(22, 9, 0.7), -- 便秘
(105, 9, 0.9), -- 舌红苔黄腻
(106, 9, 0.85);-- 脉滑数
-- 5. 肝阳上亢证关联症状(syndrome_id = 23)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(1, 23, 0.95), -- 头痛(胀痛)
(23, 23, 0.9), -- 眩晕
(24, 23, 0.85), -- 面红目赤
(25, 23, 0.8), -- 烦躁易怒
(26, 23, 0.75), -- 失眠多梦
(27, 23, 0.7), -- 口苦
(107, 23, 0.9), -- 舌红少津
(108, 23, 0.85);-- 脉弦数
-- 6. 脾胃湿热证关联症状(syndrome_id = 17)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(28, 17, 0.9), -- 脘腹胀满
(29, 17, 0.85), -- 纳呆
(30, 17, 0.9), -- 口苦口黏
(31, 17, 0.8), -- 恶心
(32, 17, 0.75), -- 大便黏滞
(33, 17, 0.7), -- 小便黄
(109, 17, 0.95),-- 舌苔黄腻
(110, 17, 0.8); -- 脉濡数
-- 7. 肾阳虚证关联症状(syndrome_id = 30)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(34, 30, 0.95), -- 腰膝酸软
(35, 30, 0.9), -- 畏寒肢冷
(36, 30, 0.85), -- 精神萎靡
(37, 30, 0.8), -- 面色㿠白
(38, 30, 0.75), -- 夜尿频多
(39, 30, 0.7), -- 阳痿早泄
(111, 30, 0.9), -- 舌淡胖有齿痕
(112, 30, 0.85);-- 脉沉迟
-- 8. 心血瘀阻证关联症状(syndrome_id = 14)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(40, 14, 0.95), -- 心胸刺痛
(41, 14, 0.9), -- 痛有定处
(42, 14, 0.85), -- 心悸不宁
(43, 14, 0.8), -- 唇甲青紫
(44, 14, 0.75), -- 舌下络脉曲张
(113, 14, 0.9),-- 舌紫暗有瘀斑
(114, 14, 0.85);-- 脉涩或结代
-- 9. 气血两虚证关联症状(syndrome_id = 37)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(45, 37, 0.95), -- 面色淡白
(46, 37, 0.9), -- 神疲乏力
(47, 37, 0.85), -- 气短懒言
(48, 37, 0.8), -- 头晕目眩
(49, 37, 0.75), -- 心悸失眠
(50, 37, 0.7), -- 手足麻木
(115, 37, 0.9), -- 舌淡嫩
(116, 37, 0.85);-- 脉细弱
-- 10. 妇科证型示例:肝郁气滞证(syndrome_id = 52)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(51, 52, 0.9), -- 月经先后不定期
(52, 52, 0.85), -- 经前乳房胀痛
(53, 52, 0.8), -- 经行不畅
(54, 52, 0.75), -- 小腹胀痛
(25, 52, 0.7), -- 烦躁易怒
(55, 52, 0.65), -- 善太息
(117, 52, 0.9), -- 舌淡红苔薄白
(118, 52, 0.85);-- 脉弦
-- 11. 儿科证型示例:脾虚食积证(syndrome_id = 60)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(56, 60, 0.95), -- 食欲不振
(57, 60, 0.9), -- 腹胀
(58, 60, 0.85), -- 大便酸臭
(59, 60, 0.8), -- 睡卧不安
(60, 60, 0.75), -- 手足心热
(61, 60, 0.7), -- 面色萎黄
(119, 60, 0.9), -- 舌苔厚腻
(120, 60, 0.8); -- 指纹紫滞
-- 12. 温病证型示例:热入营分证(syndrome_id = 69)
INSERT INTO symptom_syndrome_relations (symptom_id, syndrome_id, weight) VALUES
(62, 69, 0.95), -- 身热夜甚
(63, 69, 0.9), -- 心烦不寐
(64, 69, 0.85), -- 斑疹隐隐
(65, 69, 0.8), -- 口干不甚渴
(66, 69, 0.75), -- 谵语
(121, 69, 0.9), -- 舌绛无苔
(122, 69, 0.85);-- 脉细数
权重设置原则
- 特异性症状(权重0.9-1.0):
- 某证型的特征性表现(如”恶寒”对风寒表证)
- 具有鉴别诊断价值的表现(如”舌绛”对热入营分)
- 常见症状(权重0.7-0.8):
- 证型的典型但不特异表现(如”咳嗽”对风寒束肺)
- 需结合其他症状判断的表现
- 一般症状(权重<0.6):
- 可见于多种证型的表现(如”乏力”)
- 需严重程度修正的症状
动态权重调整建议
-- 添加症状特征修正表
CREATE TABLE symptom_modifiers (
modifier_id INT AUTO_INCREMENT PRIMARY KEY,
relation_id INT,
modifier_type ENUM('部位','性质','程度','时间'),
modifier_value VARCHAR(50),
weight_adjustment DECIMAL(2,1),
FOREIGN KEY (relation_id) REFERENCES symptom_syndrome_relations(relation_id)
);
-- 示例:头痛性质的权重修正
INSERT INTO symptom_modifiers (relation_id, modifier_type, modifier_value, weight_adjustment) VALUES
(1, '性质', '胀痛', +0.2), -- 风寒头痛本应为紧痛,胀痛降低可能性
(1, '性质', '紧痛', +0.3), -- 紧痛是风寒特征
(23, '性质', '跳痛', +0.25); -- 肝阳上亢的跳痛更典型
使用说明
- 辨证计算:系统应加权汇总患者所有症状的关联证型得分
- 排除规则:当出现某证型的负向症状(如风寒证见”口渴喜冷饮”)时应降权
- 临床验证:建议通过300+真实病例验证权重设置的合理性
需要我继续提供特定专科(如皮肤病、消化病)的症状-证型关联数据,或解释如何结合舌脉特征进行综合辨证吗?
中医舌象与脉象特征数据库(完整Seed Data)
舌象特征数据(tongue_features)
-- 舌质特征
INSERT INTO tongue_features (feature_id, feature_name, syndrome_weights) VALUES
(1, '舌淡白', '{"阳虚证":0.9, "气血两虚证":0.85, "血虚证":0.8}'),
(2, '舌淡红', '{"正常":0.95, "风寒表证":0.7, "气虚证":0.6}'),
(3, '舌红', '{"热证":0.8, "阴虚证":0.75, "风热表证":0.7}'),
(4, '舌绛', '{"热入营分证":0.95, "血热证":0.85, "阴虚火旺证":0.75}'),
(5, '舌紫暗', '{"血瘀证":0.9, "寒凝血瘀证":0.85, "气滞血瘀证":0.8}'),
(6, '舌有瘀斑', '{"心血瘀阻证":0.95, "肝郁血瘀证":0.9, "外伤瘀血证":0.85}'),
-- 舌形特征
(7, '舌胖大', '{"脾虚湿盛证":0.9, "肾阳虚证":0.85, "痰湿证":0.8}'),
(8, '舌瘦薄', '{"阴虚证":0.85, "气血两虚证":0.8, "津液亏虚证":0.75}'),
(9, '舌有齿痕', '{"脾虚证":0.95, "阳虚水停证":0.85, "湿盛证":0.8}'),
(10, '舌裂纹', '{"阴虚证":0.9, "血虚证":0.8, "津伤证":0.75}'),
-- 舌苔特征
(11, '苔薄白', '{"风寒表证":0.85, "正常":0.8, "气虚证":0.6}'),
(12, '苔薄黄', '{"风热表证":0.9, "气分热证":0.8, "肺热证":0.75}'),
(13, '苔白厚腻', '{"寒湿证":0.95, "痰湿证":0.9, "食积证":0.7}'),
(14, '苔黄厚腻', '{"湿热证":0.95, "痰热证":0.9, "肠胃积热证":0.85}'),
(15, '苔灰黑', '{"寒极证":0.9, "热极证":0.85, "痰湿重证":0.8}'),
(16, '苔少或无苔', '{"阴虚证":0.95, "胃阴亏虚证":0.9, "津伤证":0.85}'),
(17, '苔花剥', '{"胃阴不足证":0.9, "气阴两虚证":0.8, "虫积证":0.6}'),
-- 特殊舌象
(18, '舌红苔黄燥', '{"阳明腑实证":0.95, "气分热盛证":0.9}'),
(19, '舌淡苔白滑', '{"阳虚水停证":0.95, "寒湿证":0.9}'),
(20, '舌紫苔腻', '{"痰瘀互结证":0.9, "寒凝血瘀证":0.85}');
脉象特征数据(pulse_patterns)
-- 常见脉象
INSERT INTO pulse_patterns (pattern_id, pattern_name, syndrome_weights) VALUES
(1, '脉浮', '{"表证":0.9, "风邪袭表证":0.8, "气虚证":0.3}'),
(2, '脉沉', '{"里证":0.9, "阳虚证":0.8, "气郁证":0.6}'),
(3, '脉迟', '{"寒证":0.95, "阳虚证":0.9, "阴盛证":0.85}'),
(4, '脉数', '{"热证":0.95, "阴虚证":0.8, "虚阳外越证":0.6}'),
(5, '脉弦', '{"肝郁证":0.9, "痛证":0.8, "痰饮证":0.7}'),
(6, '脉滑', '{"痰湿证":0.9, "食积证":0.8, "妊娠":0.7}'),
(7, '脉涩', '{"血瘀证":0.95, "精亏证":0.8, "气滞证":0.7}'),
(8, '脉洪', '{"气分热盛证":0.95, "阳明经证":0.9}'),
(9, '脉细', '{"血虚证":0.9, "阴虚证":0.85, "湿阻证":0.6}'),
(10, '脉弱', '{"气虚证":0.95, "阳虚证":0.9, "气血两虚证":0.85}'),
-- 复合脉象
(11, '脉浮紧', '{"风寒表证":0.95, "表寒证":0.9}'),
(12, '脉浮数', '{"风热表证":0.95, "温病卫分证":0.9}'),
(13, '脉沉迟', '{"里寒证":0.95, "阳虚证":0.9}'),
(14, '脉沉细', '{"血虚证":0.9, "阴虚证":0.85, "肾虚证":0.8}'),
(15, '脉弦数', '{"肝郁化火证":0.95, "肝胆湿热证":0.9}'),
(16, '脉滑数', '{"痰热证":0.95, "食积化热证":0.9}'),
(17, '脉沉弦', '{"肝郁气滞证":0.9, "痛证":0.85}'),
(18, '脉结代', '{"心血瘀阻证":0.95, "心阳虚证":0.9, "气血虚证":0.8}'),
(19, '脉濡', '{"湿证":0.95, "脾虚证":0.85}'),
(20, '脉促', '{"阳盛热证":0.9, "气血瘀滞证":0.8}');
使用说明
- 权重解释:
- 0.9-1.0:高度特异性特征(如”脉结代”对心血瘀阻证)
- 0.7-0.8:典型但不唯一特征(如”脉弦”对肝郁证)
- <0.5:非特异性特征(如”脉浮”在气虚证中可能出现的低权重)
- 综合辨证示例:
-- 查询舌象"舌红苔黄腻"的相关证型
SELECT feature_name, syndrome_weights->>"$.湿热证" as weight
FROM tongue_features
WHERE feature_name = '舌红苔黄腻';
-- 查询脉象"脉滑数"的相关证型
SELECT pattern_name, syndrome_weights->>"$.痰热证" as weight
FROM pulse_patterns
WHERE pattern_name = '脉滑数';
- 动态调整建议:
-- 添加季节修正因子
ALTER TABLE tongue_features ADD COLUMN season_modifier JSON;
UPDATE tongue_features SET season_modifier = '{"夏季":1.1, "冬季":0.9}' WHERE feature_id IN (3,4,12,14);
-- 添加年龄修正因子
ALTER TABLE pulse_patterns ADD COLUMN age_modifier JSON;
UPDATE pulse_patterns SET age_modifier = '{"老年":1.2, "儿童":0.8}' WHERE pattern_id IN (10,14,18);
- 临床验证方法:
-- 创建验证记录表
CREATE TABLE diagnostic_validations (
validation_id INT AUTO_INCREMENT PRIMARY KEY,
tongue_feature_id INT,
pulse_pattern_id INT,
confirmed_syndrome_id INT,
confidence_level ENUM('高','中','低'),
FOREIGN KEY (tongue_feature_id) REFERENCES tongue_features(feature_id),
FOREIGN KEY (pulse_pattern_id) REFERENCES pulse_patterns(pattern_id),
FOREIGN KEY (confirmed_syndrome_id) REFERENCES syndromes(syndrome_id)
);
需要我继续提供特定证型(如糖尿病、高血压)的舌脉特征组合方案,或解释如何将舌脉特征与症状权重进行综合辨证计算吗?
以下是针对 diagnose() 方法的详细解析,包括功能说明、算法逻辑、参数处理和优化建议:
一、方法功能概述
该方法实现中医辨证的核心算法,根据输入的症状ID数组,自动分析可能的证型并推荐治疗方案。
二、参数说明
public function diagnose($symptomIds)
- 输入:
$symptomIds
症状ID数组(如[1, 3, 5]对应头痛、咳嗽、无汗) - 输出:包含4个键的关联数组:
[
'syndrome' => 最可能证型,
'treatment' => 对应治疗方案,
'confidence' => 置信度百分比,
'other_possible' => 其他可能证型
]
三、算法执行流程
1. 查询相关证型(核心SQL)
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 (?, ?, ?) -- 动态生成占位符
GROUP BY s.syndrome_id
ORDER BY total_weight DESC
- 动态占位符:通过
implode和array_fill自动生成与症状数量匹配的IN子句 - 权重求和:对同一证型关联的所有症状权重求和(
SUM(ssr.weight)) - 排序:按总权重降序排列
2. 异常处理
if (empty($possibleSyndromes)) {
return ['error' => '无法根据提供的症状确定证型'];
}
- 当症状未关联任何证型时返回错误提示
3. 获取主证型
$primarySyndrome = $possibleSyndromes[0]; // 取权重最高的证型
4. 查询治疗方案
SELECT * FROM treatments
WHERE syndrome_id = ?
ORDER BY treatment_id LIMIT 1
- 获取与主证型关联的第一个治疗方案(可通过
ORDER BY调整优先级)
5. 计算置信度
$maxPossibleWeight = count($symptomIds) * 1.0;
$confidence = ($primarySyndrome['total_weight'] / $maxPossibleWeight) * 100;
- 公式:
置信度 = (证型总权重 / 症状数量×最大单权重) × 100 - 示例:3个症状,总权重2.4 →
2.4/(3*1)*100 = 80%
四、关键设计解析
1. 权重求和策略
- 优势:简单直观,症状越多匹配度越高
- 局限:未考虑症状严重程度(可通过
severity字段改进)
2. 置信度计算
- 当前逻辑:假设所有症状最大权重均为1.0
- 改进方向:
// 获取实际可能的最大权重(需预先查询)
$maxWeight = $this->getMaxPossibleWeight($symptomIds);
$confidence = $primarySyndrome['total_weight'] / $maxWeight * 100;
3. 治疗方案获取
- 当前取第一条记录(
LIMIT 1) - 扩展建议:
// 返回所有治疗方案供选择
$stmt = $this->pdo->prepare("SELECT * FROM treatments WHERE syndrome_id = ?");
$treatments = $stmt->fetchAll(PDO::FETCH_ASSOC);
五、优化建议
1. 加入症状严重度修正
// 修改SQL(需在symptom_syndrome_relations表添加severity_level字段)
SUM(ssr.weight *
CASE ssr.severity_level
WHEN '轻度' THEN 0.7
WHEN '中度' THEN 1.0
WHEN '重度' THEN 1.3
END
) as total_weight
2. 整合舌脉信息
public function diagnose($symptomIds, $tongueFeatureId = null, $pulsePatternId = null) {
// 原有症状分析...
// 舌象权重加成
if ($tongueFeatureId) {
$tongueWeights = $this->getTongueWeights($tongueFeatureId);
foreach ($tongueWeights as $syndromeId => $weight) {
// 在原有症状权重上增加舌象权重(可设比例系数)
$totalWeights[$syndromeId] += $weight * 0.3;
}
}
// 重新排序并返回结果...
}
3. 排除规则处理
// 在返回结果前添加排除逻辑
foreach ($possibleSyndromes as $key => $syndrome) {
if ($this->hasExclusion($syndrome['syndrome_id'], $symptomIds)) {
unset($possibleSyndromes[$key]);
}
}
六、完整调用示例
// 调用示例
$tcm = new TCMDiagnosis($pdo);
$result = $tcm->diagnose([1, 3, 5]); // 头痛、咳嗽、无汗
// 输出结构
/*
[
'syndrome' => [
'syndrome_id' => 1,
'syndrome_name' => "风寒表证",
'total_weight' => 2.4
],
'treatment' => [
'treatment_name' => "辛温解表法",
'herbal_prescription' => "麻黄汤..."
],
'confidence' => 80.0,
'other_possible' => [
['syndrome_id' => 2, 'syndrome_name' => "风热表证", 'total_weight' => 1.8]
]
]
*/
七、扩展方向
- 机器学习调参:通过历史病例数据动态优化权重
- 证型组合:支持复合证型(如”肝郁脾虚”)
- 个性化因子:加入患者体质、季节等调整参数
需要进一步讨论如何实现这些高级功能吗?

Leave a Reply