《伤寒论》398条方剂数据库构建:Python 爬虫抓取与 10 类方证关系分析
2026/7/8 22:53:33 网站建设 项目流程

《伤寒论》398条方剂数据库构建:Python爬虫抓取与10类方证关系分析

中医药古籍数字化是当前中医药信息化建设的重要方向。《伤寒论》作为中医四大经典之一,其398条条文蕴含着丰富的临床经验和辨证论治思想。本文将详细介绍如何利用Python技术构建《伤寒论》方剂数据库,并通过数据挖掘方法分析10类主要方证关系。

1. 数据采集与预处理

构建《伤寒论》数据库的第一步是获取结构化数据源。由于古籍文本的特殊性,我们需要处理多种格式的原始数据:

import requests from bs4 import BeautifulSoup import pdfplumber import re # 网页抓取示例 def scrape_web_content(url): headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') content = soup.find('div', class_='content').get_text() return content # PDF文本提取示例 def extract_pdf_text(pdf_path): with pdfplumber.open(pdf_path) as pdf: text = '\n'.join([page.extract_text() for page in pdf.pages]) return text

关键预处理步骤

  1. 文本清洗:去除标点、注释等非正文内容
  2. 条文分割:按照"第X条"的格式分割文本
  3. 元数据提取:识别条文编号、所属篇章等信息

提示:古籍文本中存在大量异体字和通假字,建议建立替换映射表统一处理

2. 数据结构设计与实体识别

《伤寒论》条文包含多个结构化要素,我们需要设计合理的数据库模型:

实体类型字段说明示例
条文编号、原文、篇章"12、太阳中风,阳浮而阴弱..."
方剂名称、组成、煎服法"桂枝汤:桂枝、芍药..."
症状描述、部位、性质"头痛、发热、恶寒"
病机病理机制"阳气重故也"
# 使用正则表达式提取方剂信息 def extract_prescriptions(text): pattern = r'(.+汤)主之' prescriptions = re.findall(pattern, text) return list(set(prescriptions)) # 症状提取示例 def extract_symptoms(text): symptom_keywords = ['头痛','发热','恶寒','汗出','口渴'] return [s for s in symptom_keywords if s in text]

3. 关系型数据库构建

采用SQLite实现轻量级数据库存储:

import sqlite3 def create_database(db_path): conn = sqlite3.connect(db_path) c = conn.cursor() # 创建条文表 c.execute('''CREATE TABLE IF NOT EXISTS clauses (id INTEGER PRIMARY KEY, number TEXT, text TEXT, chapter TEXT)''') # 创建方剂表 c.execute('''CREATE TABLE IF NOT EXISTS prescriptions (id INTEGER PRIMARY KEY, name TEXT, composition TEXT)''') # 创建症状表 c.execute('''CREATE TABLE IF NOT EXISTS symptoms (id INTEGER PRIMARY KEY, description TEXT, location TEXT, nature TEXT)''') conn.commit() return conn

数据库ER图关键关系

  • 条文-方剂:一对多关系(一个条文可能包含多个方剂)
  • 条文-症状:多对多关系
  • 方剂-症状:间接关联关系

4. 方证关系分析与数据挖掘

基于数据库内容,我们可以对10类主要方证关系进行统计分析:

  1. 桂枝汤类方证
  2. 麻黄汤类方证
  3. 柴胡汤类方证
  4. 承气汤类方证
  5. 泻心汤类方证
  6. 四逆汤类方证
  7. 白虎汤类方证
  8. 五苓散类方证
  9. 理中汤类方证
  10. 栀子豉汤类方证
# 方证关联分析示例 def analyze_prescription_patterns(db_conn): cursor = db_conn.cursor() # 统计各主要方剂出现频率 cursor.execute('''SELECT name, COUNT(*) as count FROM prescriptions GROUP BY name ORDER BY count DESC''') results = cursor.fetchall() # 分析方剂-症状共现关系 cursor.execute('''SELECT p.name, s.description FROM prescriptions p JOIN clause_prescription cp ON p.id = cp.prescription_id JOIN clause_symptom cs ON cp.clause_id = cs.clause_id JOIN symptoms s ON cs.symptom_id = s.id''') co_occurrences = cursor.fetchall() return results, co_occurrences

常见方证关系模式

  • 桂枝汤证:发热、汗出、恶风、脉浮缓
  • 麻黄汤证:发热、恶寒、无汗、身疼痛
  • 小柴胡汤证:往来寒热、胸胁苦满、默默不欲饮食
  • 大承气汤证:潮热、谵语、腹满痛、大便硬

5. 可视化分析与应用

利用数据分析结果可以生成多种可视化图表:

import matplotlib.pyplot as plt import pandas as pd def visualize_prescription_frequency(data): df = pd.DataFrame(data, columns=['Prescription', 'Frequency']) df = df[df['Frequency'] > 3] # 筛选高频方剂 plt.figure(figsize=(12,6)) plt.bar(df['Prescription'], df['Frequency']) plt.title('Frequency of Major Prescriptions in Shanghan Lun') plt.xticks(rotation=45) plt.tight_layout() plt.show()

分析结果应用方向

  1. 临床决策支持:基于症状推荐可能适用的经方
  2. 教学辅助:可视化展示方证对应关系
  3. 文献研究:量化分析《伤寒论》用药规律
  4. 新药研发:发现潜在的方剂组合模式

注意:实际应用中应考虑中医辨证论治的整体性,不能单纯依赖数据匹配

6. 技术挑战与解决方案

在项目实施过程中,我们遇到了几个关键技术难题:

古籍文本处理的特殊挑战

  1. 异体字和通假字问题

    • 建立专门的映射词典
    • 采用模糊匹配算法
  2. 文言文语法结构复杂

    • 使用基于规则的分句方法
    • 开发领域特定的分词工具
  3. 医学术语标准化

    • 参照《中医药学名词》标准
    • 人工校对关键术语
# 中医术语标准化示例 def standardize_terms(text): term_mapping = { '鞕': '硬', '内': '纳', '圊': '清' } for old, new in term_mapping.items(): text = text.replace(old, new) return text

性能优化技巧

  • 对大规模文本处理采用多进程并行
  • 建立内存缓存避免重复计算
  • 使用数据库索引加速查询

7. 扩展应用与未来方向

基于现有系统,可以进一步扩展以下功能:

  1. 智能辨证辅助系统

    • 症状输入 → 可能的证型 → 推荐方剂
    • 考虑症状权重和组合模式
  2. 方剂配伍网络分析

    • 构建药材共现网络
    • 发现潜在的新组合
  3. 跨文献知识图谱

    • 整合《金匮要略》等其他经典
    • 建立更完整的经方知识体系
# 配伍网络分析示例 def analyze_herb_network(db_conn): cursor = db_conn.cursor() cursor.execute('''SELECT composition FROM prescriptions''') compositions = [row[0] for row in cursor.fetchall()] herb_pairs = [] for comp in compositions: herbs = comp.split('、') for i in range(len(herbs)): for j in range(i+1, len(herbs)): herb_pairs.append((herbs[i].strip(), herbs[j].strip())) return pd.DataFrame(herb_pairs, columns=['Herb1', 'Herb2'])

实际开发中发现,经方数据库的构建不只是技术实现,更需要中医药专业知识的深度参与。特别是在实体关系定义阶段,必须尊重中医理论体系的特点,避免简单套用西医疾病分类模式。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询