初始归档:健康管理资料库(大医网/药膳/体质监测/中医理论等12个资料集,7712个文件)

This commit is contained in:
512song committed 2026-09-23 21:59:25 +08:00
commit 80ae3811cf
7712 files changed
+4628547

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,159 @@
# 中医入门.md OCR 清洗报告
> 清洗日期: 2026-09-07(含二次审计补修)
> 源文件: 01_来源数据/中医入门_MinerU_OCR_2026-09-07.md(224,843 字节,1,829 行)
> 输出文件: 02_加工数据/中医入门.md(224,419 字节)
> 核对清单: 04_分析报告/人工核对清单.md(按行号列出全部修正点与截断处,供人工复核)
## 一、书籍识别
《中医入门》体例(理论之部 / 法则之部 / 方剂之部 / 药物之部四章),秦伯未著作的章节结构。原书为繁体竖排影印,MinerU OCR 输出为繁简混杂文本。
## 二、处理概况
| 步骤 | 处理内容 | 数量 |
|------|----------|------|
| 全文繁转简 | OpenCC t2s(~/venvs/crawl4ai) | 全文 78,154 字 |
| 定向错字修正 | 繁体字形阶段匹配 | 39 处 |
| 传/傅辨析 | 傅→传(保留"相傅"宰相义 1 处) | 63 处 |
| 辩/辯→辨 | 辩症/辯症/辯証 统一为 辨症 | 10 处 |
| 结构重建 | 标题层级统一(章## 节### 小节####) | 58 个标题 |
| 图片移除 | MinerU CDN 页面截图(中断正文) | 2 处 |
| 排版清理 | 章间分隔线、空行归一 | 全文 |
| 残留繁体字 | 转换后全文扫描 | 0 处 ✅ |
## 三、错字修正规则表(逐处上下文核对)
### 3.1 标题与篇目
| 原文 | 修正 | 依据 |
|------|------|------|
| 一、留診 | 一、望診 | 望聞問切四診之首,下文即望诊内容 |
| ## 等等。 | 二十八脉的主症 | OCR 残句误为标题,实为脉象主症汇总 |
| 第二節 隊識 | 第二節 意識 | 隊→意 形近 |
| 早期治疗,隊識到 | 认識到 | 同上 |
### 3.2 病机与引文
| 原文 | 修正 | 依据 |
|------|------|------|
| 己所胜怪而侮之 | 己所胜而侮之 | 《内经》五行乘侮原文 |
| 水郁达之 | 木郁达之 | 《内经》五郁: 木郁达之/火郁发之/土郁夺之/金郁泄之/水郁折之 |
| 我国幅目广阔 | 幅员广阔 | 目→员 |
| 中著,也叫中喝 | 中暑,也叫中暍 | 伤暑证治名词(暍=中暑古称) |
| 热煉而成 | 热燔而成 | 痰的生成: 湿聚/热燔 |
### 3.3 诊法与脉学
| 原文 | 修正 | 依据 |
|------|------|------|
| 戰接痿 | 战摇痿 | 舌象动态: 战(颤抖)/痿(软弱) |
| 胀癥 | 胀瘪 | 与"胖肿"对文 |
| 極細而奐 | 极细而奂 | 微脉: 极细而奂(奂=柔美细软) |
| 細而較微有力 | 细而较濡有力 | 对照濡脉定义"浮而细软" |
| 革:浮而极有力 | 革:浮而极无力 | 革脉外强中空,与濡脉同列浮位无力 |
| 日哺 | 日晡 | 日晡潮热(申时) |
| 阳豚/豚象 | 阳脉/脉象 | 豚→脉 形近 |
| 如殘雷之下 | 如殘漏之下 | 屋漏脉"良久一滴"喻 |
| 其串在 | 其贯串在 | OCR 丢字 |
### 3.4 症状与治法
| 原文 | 修正 | 依据 |
|------|------|------|
| 殘廉 | 残废 | 廉→废 形近 |
| 波輻 | 波幅 | 輻→幅 |
| 巨期阙 | 巨阙 | 任脉穴名 |
| 而倘未到里 | 而尚未到里 | 倘→尚 形近 |
| 比較輕,前者如乌头 | 比較重,前者如乌头 | 气味雄厚者用量大,与平淡者对文 |
### 3.5 方药
| 原文 | 修正 | 依据 |
|------|------|------|
| 荔子核 | 荔枝核 | 疝气常用药 |
| 沉香麵 | 沉香曲 | 处方药名(理气药) |
| 黄莲 | 黄连 | 莲→连 |
| 神麴 | 神曲 | 统一用曲(消食药) |
| 丹叁 | 丹参 | 叁→参 |
### 3.6 传/傅辨析(重点)
原书"傅"字两义并存:
- **传**(传递、传变):传化之府、传经、传变、传染 → 全部改"传",共 63 处
- **傅**(宰相义):仅 1 处"肺脏称作相傅"保留(相傅=辅佐君主的官职)
### 3.7 二次审计补修(简体字形漏网错字)
首轮按繁体字形匹配的规则,对 OCR 原文中恰好呈简体字形的错字未触发;事后逐规则审计(原文命中→终文残留→新值出现三段验证)发现并补修 5 处:
| 原文 | 修正 | 依据 |
|------|------|------|
| 早期治疗,队识到 | 认识到 | 队→认 形近 |
| 战接痿 | 战摇痿 | 舌象动态: 战(颤抖)/痿(软弱),下文"战为颤动…痿为软不能动"即分释二字 |
| 残廉 | 残废 | 廉→废 形近("病去而元气大伤…或带来后遗症"语境) |
| 痿健 | 痿躄 | 痿躄=肌肉萎缩、足不能行,与痉病、劳嗽并列 |
| 症为瘦缩 | 瘪为瘦缩 | 与同段"胀为胖肿"对文(胀瘪词条的解释位) |
教训:简体字形错字需在 t2s 转换后的文本上再做一轮规则匹配;繁体阶段规则 + 简体阶段规则双轮覆盖方能闭环。
### 3.8 简化字统一(表内)
五行归类表 HTML 表格内繁体一并转换(雞→鸡、徵→征 等)。
### 3.9 三次补修(2026-09-08 初步分析前扫描发现)
初步分析前的例行错字扫描发现 5 组漏网(8 处),共性教训:**药名错字多以"方名正确 + 组成行错误"形态漏网**(如"诃子散"方名正确、组成行作"阿子"),后续清洗应对方名与组成行交叉验证:
| 原文 | 修正 | 处数 | 行号 | 依据 |
|------|------|-----:|------|------|
| 瓜蔓仁 | 瓜蒌仁 | 3 | 1016, 1393, 1469 | 润下药(麻仁、郁李仁并列),蔓/蒌形近 |
| 阿子 | 诃子 | 2 | 1014, 1465 | 涩肠药;29.诃子散组成行(方名 1212 已正确) |
| 止遣溺 | 止遗溺 | 1 | 1477 | 功效动词,下文"遗尿不禁"用"遗" |
| 淡菓蓉 | 淡苁蓉 | 1 | 1469 | 润肠药(苁蓉咸温润肠),菓/苁形近 |
| 石草→石韦(仅通淋药行) | 石韦 | 1 | 1475 | 利尿通淋药(瞿麦、萹蓄并列)。⚠️ 本草纲目草部九类分类处"石草"为原书正名**已保留**(白木耳式保护:规则限定"通淋——"行内) |
验证:错误形式全文残留 0;正确形式就位;本草部类"石草"1 处正确保留。
### 3.10 四次补修(2026-09-08 关联融合阶段,理论层内容)
反向标注工程提取十八反/十九畏/妊娠禁忌等理论锚点时发现 12 处漏网,特征是**歌诀与名录类内容**——无散文上下文可依托,首轮逐处人工核对时未触及:
| 原文 | 修正 | 依据 |
|------|------|------|
| 十八反歌"半、蔓、贝、薮、芨攻乌" | 半、蒌、贝、蔹、及攻乌 | 通行歌诀+书内散文自证 |
| "藻、戟、遂、芜俱战草" | 遂、芫 | 散文"甘遂、芫花";芜荑(正确药名)已保护 |
| 散文"瓜蔓"(十八反段) | 瓜蒌 | 散文自证 |
| 散文"白芨" | 白及 | 正字 |
| "川岛、草岛畏犀角"(十九畏散文) | 川乌、草乌 | 歌诀"川乌、草乌不顺犀"自证 |
| "内轻所说" | 内经 | 全书"内经"58处 |
| "积术丸" | 枳术丸 | 消导剂举例(枳实+白术) |
| "虫虫"×2 | 虻虫 | 妊娠禁忌/破瘀药列 |
| "腐虫" | 地鳖虫 | 书内他处3处用"地鳖虫" |
| "济阴网目" | 济阴纲目 | 武之望妇科专书 |
| "没病" | 没药 | 活血药列 |
| "破瘀血一/止血一/杀虫一/消食一"(4处) | —— | OCR破折号丢字;"浮兰"→泽兰 |
**教训:歌诀/名录类 OCR 错字危害最大(十八反直接关系配伍安全),修复需依赖通行版本 + 书内散文自证,不能只靠上下文通顺。**
### 3.11 匹配算法陷阱:土人参问题(白木耳陷阱的镜像)
反向标注的炮制前缀归一表若含产地/品质限定词(土/川/广/云/怀/杭/紫/白等),会把**独立民间药名**剥成核心药名造成假阳性:翻白草的合法别名"土人参"被剥成"人参"误命中人参锚点。规则:**候选侧只剥炮制前缀(炙/炒/煨/煅/法/霜/焦/制等),产地品质限定词一律不剥**(土茯苓/土鳖虫/川贝母是独立药名)。修复后消除 31 个假阳性命中。
## 四、保留原状事项(存疑标注)
1. **"雷福亭曾说"**(方剂篇引文):疑为"俞昌"或"雷丰"之误,但无版本依据,保留原文,不作臆改。
2. **17 处页边界截断**:OCR 逐页转换导致的段中丢句(如 35、49 行段末无终结标点),属源文件信息缺失,如实保留,后续如获完整版本可补。
3. **"三因括约"**(病因篇标题):原文如此,未改。
4. 短行脉名条目(浮/革/濡等)保持原列表格式,未强行合并。
## 五、防错机制
- 全部替换规则先经上下文核对(逐行定位),不做无上下文全局替换
- "相傅"采用占位符保护后再全局替换"傅",避免误伤
- OpenCC 转换后全文繁体字残留扫描 = 0
- 二次审计:逐规则"原文命中→终文残留→新值出现"三段验证(/tmp/audit_final.py 逻辑),已知错字残留 = 0;审计发现简体字形漏网 5 处并已补修(见 3.7)
## 六、可复用性
本规则表可复用于秦伯未《中医入门》同版本其他 OCR 文件;通用部分(傳→传、辩→辨、豚→脉、日哺→日晡等)可复用于同类繁体中医教材 OCR 清洗。
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,23 @@
{
"生成时间": "2026-09-08",
"文件清单": [
{
"文件": "大医网-中医入门_理论锚点反向标注.json",
"大小KB": 696.6,
"记录数": {
"药材反向标注": 1000,
"方剂反向标注": 1000
},
"方向": "大医网实体 → 中医入门理论锚点(反向标注;中医入门为理论依据层,用户定级: 重要理论基础)",
"stats": {
"药材有锚点": 243,
"药材总数": 1000,
"方剂有锚点": 978,
"方剂实质锚点": 69,
"方剂仅剂型": 909,
"方剂示例方同名": 23,
"方剂七方举例": 7
}
}
]
}
@@ -0,0 +1,85 @@
# 中医入门.md 人工核对清单
生成日期: 2026-09-07(二次审计后版本)| 对应文件: ../02_加工数据/中医入门.md(行号即该文件行号)
本次清单基于终版全文重新定位(比初版行号 +2,因补回第一章标题行)。
用途: A类必须逐处确认,B类建议按行号抽查,C类已程序化验证无需逐处看。
## A类:必须逐处确认(信息缺失/存疑,影响语义)
### A1. 页边界截断(OCR 逐页丢句,共 17 处)——需对照原书或决定接受
- 行35: 段末「…关系,会使症情随时转变,形成疾病」
- 行49: 段末「…“善诊者,察色按脉,先别阴阳。”」
- 行61: 段末「…”又说:“阴平阳秘,精神乃治。”」
- 行79: 段末「…所不胜侮而乘之,己所胜而侮之。”」
- 行133: 段末「…为了形容两者间的密切关系,曾把心」
- 行233: 段末「…耗竭,脏腑虚损,血气不能充养。”」
- 行279: 段末「…不能固执温散,中寒很少化热,且常」
- 行591: 段末「…各司其属,有者求之,无者求之。”」
- 行597: 段末「…云。这说明了要认识一个病、一种症」
- 行851: 段末「…热药内加上少许凉药。这些都属反治」
- 行869: 段末「…万举万当,不知标本,是为妄行。”」
- 行905: 段末「…滞不舒,可用芳香泄化和中。诸如此」
- 行1121: 段末「…功效相近,而用法却有区别,也应加」
- 行1343: 段末「… 橘络一钱 沉香曲钱半 佛手八分」
- 行1378: 段末「…经验。因此,也能说各家医案是医生」
- 行1468: 段末「…、干首乌、制首乌,及姜半夏、法半」
- 行1490: 段末「…沉者引之以酒,则浮而上至巅顶。”」
### A2. 存疑项(未臆改,需按版本确认)
- 雷福亭曾说(引文出处存疑,未臆改): 行[1331]
- 三因括约(节标题,原文如此): 行[372]
- 相傅(宰相义,保留原字): 行[135]
## B类:高风险上下文修正(语义改写,建议按行号抽查;含二次审计补修 5 处)
- 痿躄(痿健→痿躄,肌肉萎缩足不能行): 行[305]
- 胀瘪与瘪为瘦缩(胀癥/症为→胀瘪/瘪为): 行[637]
- 战摇痿(战接痿→战摇痿,舌象战/痿): 行[637]
- 残废(残廉→残废): 行[861]
- 认识到(队识到→认识到): 行[113]
- 木郁达之(水郁→木郁,内经五郁): 行[91]
- 热燔而成(热煉→热燔): 行[400, 410]
- 革脉:浮而极无力(有力→无力): 行[711]
- 沉香曲(沉香麵→沉香曲,处方药名): 行[1343]
- 荔枝核(荔子核→荔枝核): 行[103, 1051]
- 中暑/中暍(中著/中喝→中暑/中暍): 行[287]
- 波幅(波輻→波幅): 行[105]
- 巨阙(巨期阙→巨阙,任脉穴): 行[105]
- 日晡(日哺→日晡,日晡潮热): 行[35, 557]
- 残漏(殘雷→残漏,屋漏脉喻): 行[833]
- 尚未到里(倘未→尚未): 行[451]
- 比较重(比较轻→比较重,药量语境): 行[1816]
- 贯串(其串在→其贯串在,补丢字): 行[99]
- 幅员(幅目→幅员): 行[14]
- 己所胜而侮之(怪→而,内经引文): 行[79]
### B 类补充(2026-09-08 三次补修,见清洗报告 3.9)
- 瓜蒌仁(瓜蔓仁→瓜蒌仁,润下药): 行[1016, 1393, 1469]
- 诃子(阿子→诃子,涩肠药/诃子散组成): 行[1014, 1465]
- 止遗溺(止遣溺→止遗溺): 行[1477]
- 淡苁蓉(淡菓蓉→淡苁蓉,润肠药): 行[1469]
- 石韦(通淋药行石草→石韦;本草部类"石草"为原书正名保留): 行[1475]
## C类:低风险项(已程序化验证,无需逐处核对)
- 繁转简:全文残留繁体扫描 = 0
- 傅→传 63 处(占位符保护,仅"肺脏称作相傅"1 处保留原字)
- 辩/辯→辨 统一;标题层级重建 58 个;CDN 截图移除 2 处;空行归一
- 望诊标题(留診→望诊): 行[603]
- 二十八脉主症标题(原'等等。'): 行[771]
## 二次审计说明
初版清单后经规则级审计(原文命中→终文残留→新值出现三段验证),发现 5 处漏网错字并已补修:
队识到→认识到、战接痿→战摇痿、残廉→残废、痿健→痿躄、症为瘦缩→瘪为瘦缩。
漏网原因:这 5 处错字在 OCR 原文中恰好是简体字形,首轮按繁体字形匹配的规则未触发;
现已全部修复并纳入 B 类复核范围。
## 建议核对顺序
1. 先核 A1 截断处(17 处):对照纸质原书/扫描图,确认是否丢句、丢多少
2. 再核 A2 存疑项 3 处(尤其引文出处"雷福亭")
3. B 类按行号抽查,语义通顺即通过(优先看带→的新旧对照项)
4. C 类无需逐处看
@@ -0,0 +1,106 @@
# 《中医入门》资料库初步分析报告
> 分析日期: 2026-09-08
> 分析对象: 02_加工数据/中医入门.md(定稿版 + 本轮 OCR 补修 8 处)
> 分析方法: 程序化结构扫描(标题树/正则盘点/词频统计)+ 上下文逐处核验
> 关联文件: ../02_加工数据/OCR文本清洗报告.md、../04_分析报告/人工核对清单.md、../04_分析报告/手工核验复检报告.md
## 一、全书概况
《中医入门》秦伯未著作体例,中医入门级系统理论教材(权威性高于科普读物)。
**用户定级(2026-09-08):重要理论基础**——资料库体系中的理论层基石,交叉关联时作为理论依据层优先引用。
全书 75,474 字(去空白),4 章 12 节 42 小节,59 个标题层级完整。
| 章 | 字数 | 占比 | 核心内容 |
|----|-----:|-----:|----------|
| 第一章 理论之部 | 28,462 | 37.7% | 中医特点、阴阳五行、生理(脏腑/经脉/气血精津液)、三因病因 |
| 第二章 法则之部 | 26,054 | 34.5% | 辨症八纲、六经三焦卫气营血、四诊、二十八脉、八法与72常用治法 |
| 第三章 方剂之部 | 8,951 | 11.9% | 君臣佐使、七方、剂型、40首基本方剂、6例脉案处方 |
| 第四章 药物之部 | 12,002 | 15.9% | 采集炮制、气味效能15分类、扶正祛邪药组、归经、配伍禁忌、用量 |
篇幅重心在理论(前两章合计 72.2%),方药两章为纲要式铺陈——符合"入门"定位。
## 二、内容要素盘点
### 2.1 理论体系(第一章)
- 中医特点:整体观念、辨症论治
- 基本学说:阴阳、五行、经络、预防
- 生理:五脏六腑(含奇恒之府、传化之府)、十二经脉(含奇经八脉)、气血、精气神、津液
- 病因:三因学说(外因/内因/不内外因)+ 三因括约
### 2.2 诊法与治法(第二章)
- 辨症:表里寒热虚实八纲、六经、三焦(含卫气营血)、病机
- 诊法:望闻问切四诊;**二十八脉主症**逐脉列出(见 2.5 质量备注)
- 治法:正治反治、治本治标、**八法**(汗吐下和温清消补)、**常用治法 72 法**(1.疏风祛湿法 → 72.扶土抑木法,编号连续完整)
### 2.3 方剂体系(第三章)
- 方制:君臣佐使、七方(大方/小方/缓方/急方/奇方/偶方/复方)、剂型(丸散膏丹酒汤等)
- **基本方剂 40 首**(每首附组成+主方定位+主治),涵盖补(四君四物六味)、温(四逆)、解表(桂枝麻黄银翘)、清热(白虎黄连解毒)、祛湿(平胃五苓三仁)、痰(二陈清气化痰)、固涩(金锁牡蛎诃子)、理气血(越鞠十灰桃仁承气)、和(小柴胡逍遥)、消(保和木香槟榔)、驱虫(化虫)等 13 大功能类
- 处方举例:6 例完整脉案(肝病、胃痛、齿衄、咳喘、肺吸虫病、遗精),示范从脉案到处方
### 2.4 药物体系(第四章)
- 效能分类 15 类:解表、泻下、理湿、祛寒、清热、涌吐、消化、止咳、理气、理血、滋补、开窍、镇静、固涩、驱虫(每类附代表药)
- 扶正类按脏腑分 7 系(肺/心/肝/脾/肾/肠胃/膀胱)38 条功效药组;祛邪类按病邪分类
- 程序化盘点:38 条功效行、**259 个药味位次、去重 252 味**(含炮制品)
- 配伍禁忌:十八反、十九畏歌诀;用量:单味量/复方量/汤丸散差异
### 2.5 质量备注(如实记录,不臆改)
- 二十八脉章节标题为"二十八脉",主症列表**实列 27 脉**;"长脉"仅出现于篇末总括韵文("长则迢迢,短则缩缩"),无独立主症条目。属原书编排,保持原样。
- 引文出处"雷福亭曾说"存疑项维持原状(既有报告 A2 已记录)。
## 三、高频术语统计(全书词频 TOP25)
肝161 心144 痰141 胃119 脾106 肺104 肾98 阴阳47 经络44 阴虚41 三焦36 阳虚35 胆33 五行28 瘀25 五脏23 津液22 气血20 清热20 气虚19 化湿14 化痰14 血虚13 六腑12 理气12
特征:五脏脏腑词占绝对高频(肝心胃脾肺肾均近百次以上),病机词(阴虚/阳虚/气虚/血虚/痰/瘀)次之——与"辨症论治"贯穿全书的体例一致。
## 四、本轮 OCR 补修记录(分析前清洗,8 处 5 组)
按工作流规则"分析前必须清洗",程序化扫描发现 5 组漏网错字(首轮规则表未覆盖),逐处上下文核对后补修:
| # | 原文 | 修正 | 处数 | 依据 |
|---|------|------|-----:|------|
| 1 | 瓜蔓仁 | 瓜蒌仁 | 3 | 润下药(麻仁、郁李仁并列),蔓/蒌形近 |
| 2 | 阿子 | 诃子 | 2 | 涩肠药+29.诃子散组成(方名已正确作"诃子散") |
| 3 | 止遣溺 | 止遗溺 | 1 | 功效动词,下文"遗尿不禁"即用"遗"字 |
| 4 | 淡菓蓉 | 淡苁蓉 | 1 | 润肠药(苁蓉咸温润肠),菓/苁形近 |
| 5 | 石草→石韦 | 通淋药行 | 1 | 利尿通淋药(瞿麦、萹蓄并列)。注意"石草"在本草纲目草部九类分类处为原书正名,**已保留**(防白木耳式误伤) |
验证:错误形式全文残留 0;正确形式就位(瓜蒌仁4/诃子6/止遗溺1/淡苁蓉1/石韦1);本草部类"石草"1 处正确保留。
教训已并入清洗报告 3.9 节:**药名错字多以"方名正确+组成行错误"的形态漏网**,后续清洗应对方名与组成行交叉验证。
## 五、质量状态评估
| 维度 | 状态 | 说明 |
|------|------|------|
| 繁体残留 | ✅ 0 | opencc 扫描通过(既有复检) |
| 已知错字 | ✅ 0 | 含本轮 5 组补修后复扫 |
| 结构完整性 | ✅ | 59 标题、章/节/小节连续 |
| 页边界截断 | ✅ | 17 处已由用户对照原书补全 15 处,2 处确认非截断 |
| 存疑项 | 3 处保留 | 雷福亭/三因括约/相傅,均原书依据不足不臆改 |
| 已知遗留 | 2 小项 | L686 图片为 Typora 绝对路径(建议拷入 02_加工数据/images/);L426 章前分隔线风格不统一(不影响结构) |
结论:文档维持**定稿**状态(本轮为纯错字补修,不涉及语义争议),具备进入 03_关联融合 阶段的条件。
## 六、交叉关联切入点(03_关联融合 规划建议)
| 本库要素 | 可关联库 | 关联思路 |
|----------|----------|----------|
| 40 首基本方剂(名称+组成) | 大医网/方剂库(1000) | 方名精确匹配 + 组成药味重叠度评分 |
| 252 味药材(扶正祛邪药组) | 大医网/中药材库(1000) | 药名精确+别名归一(含炮制品映射,如熟地↔地黄) |
| 效能15分类/72治法/八法 | 健康管理师教材 | 治法↔慢性病干预手段映射 |
| 气味效能、配伍禁忌 | 中华药膳全书·药性功能表(286) | 药性理论对读(性味归经一致率) |
| 十二经脉、奇经八脉 | 大医网/穴位库(1000) | 经脉→穴位归属验证 |
| 二十八脉主症 | 大医网/症状库(993) | 脉症↔症状术语桥接 |
## 七、后续建议(优先级排序)
1. **03_关联融合**:先做方剂40首↔大医网方剂库、药材252味↔大医网药材库两条高确定性关联(名称匹配为主,召回可预期)
2. **主题提炼**:可产出"八法与72常用治法对照表""二十八脉主症速查""扶正类七系药组结构化"三个专题(04_分析报告)
3. **小修**:将 L686 脉图拷入库内改相对路径(资料库可迁移性)
4. **内容补全**:如获完整版本,核对"长脉"是否原书即无独立主症条目
@@ -0,0 +1,84 @@
# 大医网-中医入门 理论锚点反向标注报告
> 生成日期: 2026-09-08 | 脚本: ../05_脚本工具/reverse_tag_dayi_with_theory.py
> 方向(用户修正后确立): **大医网实体 → 中医入门理论锚点**。中医入门为理论依据层(用户定级: 重要理论基础),其方剂/药材内容是理论示例,不要求被外部库"覆盖";正确做法是用理论层为大医网实体提供依据标注。
> 数据文件: ../03_关联融合/大医网-中医入门_理论锚点反向标注.json(697KB,2000 条实体记录)
## 一、理论锚点体系(书侧提取)
| 锚点类型 | 药材侧 | 方剂侧 |
|----------|--------|--------|
| 分类理论 | 气味效能 15 分类(解表/泻下/理湿/祛寒/清热/涌吐/消化/止咳/理气/理血/滋补/开窍/镇静/固涩/驱虫) | 七方(大方/小方/缓方/急方/奇方/偶方/复方,书中举例 52 方) |
| 结构化药组 | 扶正类 7 脏腑系 38 条 + 祛邪类 18 条功效药组 | 40 首示例方(含主方定位:如四君子汤=补气主方) |
| 用药安全 | 十八反 16 味 / 十九畏 20 味 / 妊娠禁忌 60+ 味 | 十八反/十九畏歌诀全文 |
| 治法关联 | 72 常用治法中 185 味"药如"举例药 | 八法(汗吐下和温清消补) |
| 剂型理论 | — | 丸散膏丹酒汤(名称后缀即可触发) |
书侧归一药材锚点 470 个(含炮制前缀变体与别名),归一规则:仅剥炮制前缀(炙/炒/煨/煅/法/霜/焦等),别名表映射书侧简写(山萸→山茱萸、参三七→三七、驴皮胶→阿胶等 60+ 条)。
## 二、反向标注统计
### 药材侧(大医网 1000 味)
| 指标 | 数值 |
|------|------|
| 有理论锚点 | 243/1000(24%) |
| 命中功效药组 | 195 |
| 命中效能分类 | 169 |
| 命中用药安全(十八反/十九畏/妊娠禁忌) | 42 |
| 治法关联通道 | 185 味书侧药 → 72 治法 |
24% 覆盖率为**诚实的精确率优先数字**:大医网为随机抽样 1000 味,其中大量民间药/冷背药(翻白草、蚂蝗七、高山瓦韦类)本就不在入门教材理论药组中,强行匹配只会制造噪音。理论层价值不依赖抽样覆盖率。
标注示例:人参→滋补药+扶正类·肺者·补肺气+十八反/十九畏+治法15.却暑调元法;肉桂→祛寒药+十九畏+妊娠禁忌+4条治法;土鳖虫→地鳖虫(别名归一)+理血药+妊娠禁忌。
### 方剂侧(大医网 1000 首)
| 指标 | 数值 |
|------|------|
| 实质锚点(示例方/七方/功效组推断/治法) | 69/1000 |
| 40 首示例方同名命中 | 23(其余 17 首经典方不在抽样范围,属正常) |
| 七方举例命中 | 7 |
| 仅剂型线索 | 909 |
方剂侧两级解读:69 首获得实质理论锚点(如大承气汤=示例方38+泻下主方+组成4味全部命中功效药组;四君子汤=示例方1+七方·复方+补气主方);其余 909 首名称后缀触发剂型理论(丸者缓也/汤者荡也类),属弱线索已分层标记,不与实质锚点混计。
## 三、标注 JSON 结构
```
metadata: 方向声明/锚点体系/stats
药材反向标注[]: 大医网药材, id, 别名, 理论锚点[{命中名,书侧原词,类型,效能分类,功效药组,用药安全,治法关联}], 锚点类型, 关联强度
方剂反向标注[]: 大医网方剂, id, 理论锚点[{类型:示例方|七方举例|剂型理论|功效药组推断|治法关联, ...}], 锚点类型, 关联强度
```
## 四、关联过程中的数据质量修复(理论层,12 处 + 1 个算法陷阱)
### 4.1 OCR 错字补修(用药安全与经典理论内容,均已验证清零)
| # | 原文 | 修正 | 位置/依据 |
|---|------|------|-----------|
| 1 | 十八反歌"半、蔓、贝、薮、芨攻乌" | 半、蒌、贝、蔹、及攻乌 | 通行歌诀;书内散文自证("如半夏、瓜蒌、贝母、白蔹、白及与乌头相反") |
| 2 | "藻、戟、遂、芜俱战草" | 遂、芫 | 下文"甘遂、芫花与甘草相反";芜荑为另一真实药名已保护 |
| 3 | 十八反散文"瓜蔓" | 瓜蒌 | 同上自证 |
| 4 | 十八反散文"白芨" | 白及 | 正字 |
| 5 | 十九畏散文"川岛、草岛畏犀角" | 川乌、草乌 | 歌诀"川乌、草乌不顺犀"自证 |
| 6 | "内轻所说" | 内经 | 全书"内经"58 处 |
| 7 | "积术丸" | 枳术丸 | 消导剂举例,枳实/白术 |
| 8 | "虫虫"×2 | 虻虫 | 妊娠禁忌动物药/破瘀药列 |
| 9 | "腐虫" | 地鳖虫 | 书内他处 3 处用"地鳖虫" |
| 10 | "济阴网目" | 济阴纲目 | 武之望妇科专书名 |
| 11 | "没病" | 没药 | 活血药列 |
| 12 | "破瘀血一/止血一/杀虫一/消食一" | ——(破折号) | 4 处 OCR 丢字;"浮兰"→泽兰 |
**教训**:歌诀类内容 OCR 错字危害最大(十八反直接关系配伍安全),且歌诀无散文上下文可依托,需用通行版本书内散文自证修复。
### 4.2 匹配算法陷阱:土人参问题(白木耳陷阱的镜像)
首轮炮制前缀归一表含产地/品质限定词(土/川/广/云/怀/杭等),导致翻白草的合法别名"土人参"被剥成"人参"而误命中人参锚点。修复:候选侧只剥炮制前缀,产地/品质限定词一律不剥(土茯苓/土鳖虫等是独立药名)。修复后 274→243 味,消除的 31 个命中全部为假阳性。
## 五、局限与后续
1. 大医网方剂库"方解-组成"仅 5% 填充,功效组推断只能作用于少数方剂;待数据源补全后可重跑脚本提升覆盖
2. 书侧 17 首经典基础方(四物汤、六味地黄丸等)不在大医网随机抽样内——如需完整对照,需扩充大医网方剂采集
3. 治法关联目前单向(书侧药→治法),可扩展为大医网药材→治法→治法所属八法的两级理论归位
4. 十九畏歌"炮烬炙炀"等词句疑有形近问题,但无版本依据,维持原状未改
@@ -0,0 +1,88 @@
# 中医入门.md 手工核验复检报告
检查日期: 2026-09-07(用户手工核验修改后)
检查对象: 02_加工数据/中医入门.md(用户 15:57 保存版,223,748B / 1,722 行)
对比基线: /tmp/zhongyi_clean.md(清洗终版备份)/tmp/zhongyi_user_version.md(用户版备份)
检查方法: 行级+字符级 diff 定位实质变化 15 块;对照人工核对清单(A1/A2/B/C 四类)逐处复核;opencc 繁体扫描;段落完整性启发式扫描
## 一、结论摘要
用户手工核验修正质量高:A1 十七处页边界截断中 15 处已补全为完整句;B 类错字修正全部落地;
无新增繁体残留、无 Markdown 结构破坏、标题树完整(59 个标题,四章结构完好)。
复检发现 4 处机械性残留(已代修)+ 3 处需用户对照原书确认的表述疑点(未臆改)。
## 二、用户已正确完成的工作(核验确认通过)
### 1. A1 页边界截断 — 15/17 处已补全 ✅
按新文件行号定位,段末均以完整句读收束:
- L35 形成疾病。 / L49 先别阴阳。” / L61 精神乃治。” / L79 己所胜而侮之。” / L133 相傅。(含断行合并)
- L231 血气不能充养。” / L277 且常使阳气日渐衰退。 / L574 有者求之,无者求之。” / L580 …互相结合。
- L774 反治范围,但实质上仍是正治。 / L790 是为妄行。” / L826 均属和法范围。 / L1034 也应加以适当的选择。
- L1281 医生终身的良师。 / L1367 法半夏,水炙远志…等。 / L1387 浮而上至巅顶。”
- L1254 处方药味行(橘络…佛手八分):药方列表格式,行末无句号属正常,非截断。
- L157/L452/L622 三处「诸如此」并列句亦已补全。
### 2. B 类语义修正 — 全部落地 ✅
痿躄(L301)、战摇痿(L618)、胀瘪/瘪为瘦缩(L618)、残废(L782)、认识到(L113)、木郁达之、
热燔×2、革脉改回「有力」(用户纠正了清洗阶段的误改:革=浮而极有力如按鼓皮 / 濡=浮而极无力如绵在水,符合脉理)、
沉香曲、荔枝核×2、中暑+中暍、波幅、巨阙、日晡×2、残漏、尚未到里、比较重、贯串×3、幅员、己所胜而侮之 — 均确认。
另修正清洗阶段未覆盖处:井→并(输穴并简写为俞穴)、编号 3:→3.、5..→5.、热燔引号边界。
### 3. A2 存疑项 — 保留原样(默认接受,未臆改)✅
- 雷福亭曾说(L1242):完整保留,含「尝考丹溪治病…」整段引文。
- 三因括约(L364):保留。
- 相傅(L133):保留宰相义。
### 4. 二十八脉列表 — 用户以「文字总述 + 原书截图」重写
- 原 OCR 逐行碎片(浮/革/濡/实…共 59 行乱序)被整理为一段通顺文字总述(L684)
+ 插入原书二十八脉总表截图(L686, Typora 图片)。
- 该处理优于原碎片列表:乱序被消除、附原书图为凭。✅ 主体正确。
## 三、复检发现并已代修的问题(4 处)
| # | 位置 | 问题 | 处理 |
|---|------|------|------|
| 1 | 文末 L1721 | 行尾误留两个反引号 ` `` `(疑似代码围栏残留) | 已删除 ✅ |
| 2 | L85↔L87 | 五行学说段断句:「…指导中医临床工作」空行「的。举例来说」 | 已合并为一段 ✅ |
| 3 | L476↔L478 | 「11. 表虚里实症…主症为汗出恶」空行「风,胸痞硬满」 | 已合并 ✅ |
| 4 | L900↔L902 | 「7. 两解太阳法…利湿以渗」空行「太阳之府(即膀胱)」 | 已合并 ✅ |
| 附 | L1282-1284 | 三连空行 | 空行归一 ✅ |
修复后文件: 223,738B / 1,714 行。用户版备份: /tmp/zhongyi_user_version.md。
## 四、需用户对照原书确认的表述疑点 — 已全部结案 ✅
以下位于 L684 脉象总述段。**用户已于 2026-09-07 对照原书确认:4 处均为原书措辞,无需修改。**
1. 「滑而如按琴弦为弦」— ✅ 原书如此(滑脉句首缀"滑"为原书文风,非串行)
2. 「涩而极细爽、按之欲绝为微」— ✅ 原书如此("爽"为原书用字,非"软/奂"之误)
3. 「来盛去衰、来大去长为洪」— ✅ 原书如此
4. 「如微而细为细」— ✅ 原书如此
教训:OCR 碎片(如"微:极细而奐""-细:细而较濡有力")系竖排影印切分错乱,不可作为
判断原书整句措辞的依据;脉象总述等用户重写段应以原书/原书截图为唯一权威。
本组 4 处不得再按 OCR 碎片特征报为疑似错字。
## 五、文档状态
**定稿确认**:经用户手工核验 + 复检代修 4 处机械残留 + 4 处原书措辞确认,文档可视为定稿。
可进入 03_关联融合 阶段(与大医网、健康管理师教材、中华药膳全书交叉关联)。
## 六、C 类程序化验证(全部通过)
- 繁体残留(opencc t2s 全文扫描): 0 ✅
- 已知错字残留: 0 ✅
- 反引号残留: 0 ✅(已清除)
- 标题结构: 59 个标题,章/节/小节层级连续,无孤立标题 ✅
- 奇经八脉「𫏋」为 CJK 扩展字,正确 ✅
- 五行归类表: 单行 HTML(原有格式),内容完整含 </table> ✅
## 七、遗留小事项(可不处理)
1. L426 章前分隔线 `---` 保留,而原第二、四章前分隔线已被删除(用户处理),风格略不统一,不影响结构。
2. L686 图片为绝对路径(/home/songyi/.config/Typora/typora-user-images/…),
如资料库需迁移或分享,建议将图片拷入库内(如 02_加工数据/images/)并改为相对路径。
## 八、下一步建议
文档已定稿,可进入 03_关联融合 阶段(与大医网、健康管理师教材、中华药膳全书交叉关联)。
@@ -0,0 +1,66 @@
# 《中医入门》理论依据调用指南(应用层)
> 生成日期: 2026-09-08 | 定位: **应用中随时调用的理论依据层**(用户定级: 重要理论基础)
> 数据: ../02_加工数据/理论依据库.json | 接口: ../05_脚本工具/theory_api.py
## 一、定位
《中医入门》在资料库体系中是**理论依据层**:当体质调理、药膳推荐、处方分析、配伍核查等应用场景需要理论支撑时,通过本接口实时调用,返回**原文引文 + 行号**(可溯源至 02_加工数据/中医入门.md)。区别于 03_关联融合 的静态标注——那里是"大医网实体→锚点"的预计算快照,这里是应用期的动态查询。
## 二、数据范围(理论依据库)
| 板块 | 内容 | 数量 |
|------|------|-----:|
| 八法 | 汗吐下和温清消补,各含定义原文+行号 | 8 |
| 治法72 | 每条含名称/适应症/药如/行号(编号连续无缺号) | 72 |
| 七方 | 大小缓急奇偶复,各含定义+书内举例方 | 7 |
| 效能分类 | 15类,各含定义+代表药 | 15 |
| 功效药组 | 扶正7系+祛邪各类,含药味清单 | 42组 |
| 示例方40 | 组成/主方定位/主治/行号 | 40 |
| 脉象主症 | 27脉主症(长脉仅见总括韵文,原书编排) | 27 |
| 用药安全 | 十八反3组(+通行扩展)/十九畏10对/妊娠禁忌45味 | — |
## 三、接口用法
```python
import sys; sys.path.insert(0, "05_脚本工具")
from theory_api import TCMTheory
t = TCMTheory()
# 1. 药材理论依据(支持炮制品/别名归一: 炒白术→白术、参三七→三七)
t.herb("黄芪")
# → 滋补药(效能分类) + 治法10.固表祛邪法 + 治法64.补益中气法 + 用药安全, 均含原文与行号
# 2. 方剂理论依据(40示例方逐味给出组成理论;非示例方给剂型理论提示)
t.formula("大承气汤")
# → 主方定位:泻下, 主治:实热便闭, 七方归属:大方, 组成理论(逐味), 行号:1230
# 3. 配伍安全核查(应用前置检查;十八反含通行扩展并标注来源)
t.safety_check(["半夏", "附子"])
# → 十八反冲突[来源:通行扩展](附子为乌头子根), 结论:存在配伍禁忌须调整
t.safety_check(["甘草", "大戟", "茯苓"])
# → 甘草反大戟(书列) + 大戟妊娠禁忌
# 4. 治法查询(名称/适应症双向模糊)
t.method("补中") # → 治法64.补益中气法 + 八法·补法
# 5. 体质调理依据(同义词展开: 阴虚→补阴/滋阴/养阴)
t.constitution("阴虚")
# → 药组:扶正类·脾者·补阴(熟地/山萸肉/天冬...), 治法:61.养阴退蒸法
```
## 四、依据分级约定
| 级别 | 含义 | 示例 |
|------|------|------|
| 书列 | 《中医入门》原文明确记载 | 人参反藜芦(散文) |
| 通行扩展 | 通行本有而本书未明列,安全核查必含并标注 | 附子反半夏、丹参反藜芦 |
| 未收录 | 本书为入门纲要未覆盖,不代表无理论依据 | 冷背药材 |
用药安全内容(十八反/十九畏/妊娠禁忌)在核查中**按"书列∪通行扩展"从严执行**,扩展项一律标注[通行扩展]以保证溯源透明。
## 五、维护
- 理论依据库由 `build_theory_basis.py` 从清洗成品重建;原文修订后重跑即可
- 行号与 02_加工数据/中医入门.md 同步;若原文增删行需重建
- 别名/炮制归一表与 reverse_tag_dayi_with_theory.py 保持一致(只剥炮制前缀,产地限定词不剥——土人参陷阱)
@@ -0,0 +1,180 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
构建《中医入门》应用理论依据库 → 02_加工数据/理论依据库.json
用途: 为体质调理/药膳推荐/处方分析等应用提供可调用的理论依据(原文+行号溯源)
每条依据含: 原文引文 + 行号(指向 02_加工数据/中医入门.md)
"""
import json, os, re, datetime
BOOK = "/home/songyi/Documents/ai_agent_scraper_study/data/中医入门资料库/02_加工数据/中医入门.md"
OUT = "/home/songyi/Documents/ai_agent_scraper_study/data/中医入门资料库/02_加工数据/理论依据库.json"
TODAY = datetime.date.today().isoformat()
lines = open(BOOK, encoding="utf-8").read().splitlines()
text = "\n".join(lines)
def ln(idx): # 字符偏移 → 行号(1-based)
return text[:idx].count("\n") + 1
def find_seg(start, end):
i, j = text.find(start), text.find(end)
return (i, j) if 0 <= i < j else (i, len(text))
lib = {"metadata": {
"生成日期": TODAY,
"来源": "中医入门资料库/02_加工数据/中医入门.md(秦伯未《中医入门》体例,用户定级: 重要理论基础)",
"用途": "应用调用层——体质调理/药膳推荐/处方分析/配伍安全核查时,调用本库返回《中医入门》理论依据(原文+行号)",
"查询接口": "../05_脚本工具/theory_api.py"}}
# ============ 八法 ============
i0, j0 = find_seg("三、八法", "四、常用治法")
bafa = {}
for m in re.finditer(r'^\d+[\.、]\s*([^\s::,。]{1,2}法)[::]\s*(.+)$', text[i0:j0], re.M):
name = m.group(1)
seg_after = text[i0+j0 if False else i0+m.end(): j0]
first = seg_after.split("。")[0]
bafa[name] = {"定义原文": (m.group(2).split("。")[0] + "。").strip() if m.group(2) else "",
"行号": ln(i0 + m.start())}
lib["八法"] = bafa
# ============ 常用治法 72 ============
i0, j0 = find_seg("四、常用治法", "## 第三章")
zhifa, missing = {}, []
for m in re.finditer(r'^(\d+)[\.、,,]?\s*([^\s::,。]{2,12}法)[::]\s*(.*)$', text[i0:j0], re.M):
num, name, rest = int(m.group(1)), m.group(2), m.group(3)
use = re.search(r'用于(.*?)(?:药如|。|$)', rest)
yao = re.search(r'药如([^.。;;]*)', rest)
zhifa[str(num)] = {"名称": name,
"适应症": use.group(1).strip(",,。 ") if use else None,
"药如": ([x.strip() for x in re.split(r'[、,,]', yao.group(1)) if x.strip()] if yao else []),
"行号": ln(i0 + m.start())}
nums = sorted(int(k) for k in zhifa)
gaps = [n for n in range(nums[0], nums[-1]+1) if n not in nums]
lib["治法72"] = {"条目": zhifa, "总数": len(zhifa), "编号范围": [nums[0], nums[-1]],
"缺号": gaps, "缺号说明": "原书编号缺号或OCR漏行,如实记录" if gaps else None}
# ============ 七方 ============
# 切片止于七方段结尾(其后是张景岳八阵与汪昂22类剂型分类,"22. 救急方"属剂型分类,非七方)
i0, j0 = find_seg("二、七方", "三、剂型")
cut = text.find("七方是方剂组成的法则之一", i0)
if 0 < cut < j0: j0 = cut
qifang, cur, cur_pos = {}, None, None
for m in re.finditer(r'^\d+[\.、]\s*([^\s::,。]{1,3})方[::]\s*(.+)$|^(二、七方)', text[i0:j0], re.M):
if m.group(3):
cur = None; continue
cur = m.group(1) + "方"
para = m.group(2) # (.+)$ 已捕获整段(每段一行),无需再找空行
# 清洗举例药名: 剥离连接词前缀("如下法中的大承气汤"→"大承气汤")
examples = []
for tok in re.findall(r'([\u4e00-\u9fff]{2,9}(?:汤|丸|散|饮|膏))', para):
tok = re.split(r'[如用和及等是的中的将]', tok)[-1]
if len(tok) >= 3 and tok not in examples: examples.append(tok)
qifang[cur] = {"定义原文": para[:150].strip(),
"书内举例": examples,
"行号": ln(i0 + m.start())}
lib["七方"] = qifang
# ============ 效能分类 15 ============
i0, j0 = find_seg("二、效能", "#### 1. 扶正类")
xiaoneng = {}
for m in re.finditer(r'^(\d+)[\.、]\s*([^\s::,。]{2,8}药)[::]\s*(.+)$', text[i0:j0], re.M):
seg = m.group(3)
reps = []
for km in re.finditer(r'([\u4e00-\u9fff]{2,8})如([、\u4e00-\u9fff()]{2,60})', seg):
for h in re.split(r'[、]', km.group(2)):
h = re.sub(r'([^)]*)', '', h).strip("等")
if h: reps.append(h)
xiaoneng[m.group(2)] = {"定义原文": seg.split("。")[0] + "。", "代表药": reps[:24],
"行号": ln(i0 + m.start())}
lib["效能分类"] = xiaoneng
# ============ 扶正/祛邪功效药组 ============
groups = []
def parse_groups(start, end, kind):
i0, j0 = find_seg(start, end)
cur_sys = ""
for m in re.finditer(r'^\((\d+)\)\s*属于(.+?):|^[^\n#\d(].*?——.*$', text[i0:j0], re.M):
line = m.group(0).strip()
if m.group(1):
cur_sys = m.group(2); continue
eff, _, rhs = line.partition("——")
label = f"{kind}·{cur_sys}·{eff.strip()}" if cur_sys else f"{kind}·{eff.strip()}"
herbs = []
for h in re.split(r'[、,,]', rhs.strip().strip("。")):
h = re.sub(r'([^)]*)', '', h).strip()
h = re.sub(r'^(亦可用鲜|亦可用)', '', h).strip()
if h: herbs.append(h)
groups.append({"组": label, "药": herbs, "行号": ln(i0 + m.start())})
parse_groups("#### 1. 扶正类", "#### 2. 祛邪类", "扶正类")
parse_groups("#### 2. 祛邪类", "三、归经", "祛邪类")
lib["功效药组"] = {"条目": groups, "总数": len(groups)}
# ============ 示例方 40 ============
i0, j0 = find_seg("一、基本方剂", "## 第四章")
shili = {}
for m in re.finditer(r'^(\d+)[\.、]\s*([^::\n]+)[::]\s*(.+)$', text[i0:j0], re.M):
name = m.group(2).strip()
rest = m.group(3)
comp = [c.strip() for c in rest.split("。")[0].split("、") if c.strip()]
pos = re.search(r'为([^,。]{2,12})主方', rest)
zhi = re.search(r'用于([^。]*)', rest)
shili[name] = {"序号": int(m.group(1)), "组成_书": comp,
"主方定位": pos.group(1) if pos else None,
"主治": zhi.group(1).strip() if zhi else None,
"行号": ln(i0 + m.start())}
lib["示例方40"] = shili
# ============ 二十八脉主症 ============
i0, j0 = find_seg("二十八脉的主症", "## 第三章")
mai = {}
for m in re.finditer(r'^([^\s,。]{1,2})脉主(.+)$', text[i0:j0], re.M):
mai[m.group(1) + "脉"] = {"主症原文": m.group(2).strip().rstrip("。"), "行号": ln(i0 + m.start())}
lib["脉象主症"] = {"条目": mai, "总数": len(mai),
"说明": "标题为二十八脉,实列27条,长脉仅见总括韵文(原书编排,如实记录)"}
# ============ 用药安全 ============
ph_i = text.find("一、配合"); ph_j = text.find("二、用量")
ph = text[ph_i:ph_j]
i18 = ph.find("十八反歌:")
seg18_prose = ph[ph.find("歌中所提十八种药"):ph.find("歌中所提十九种药")]
seg19_prose = ph[ph.find("歌中所提十九种药"):ph.find("此外,妊娠禁忌")]
# 畏对提取: 从"如硫黄畏朴硝"起取,避开首句"即表示相畏比较显著"的噪音
iex = seg19_prose.find("如硫黄畏朴硝")
pairs = [(a.replace("如", "", 1) if a.startswith("如") else a, b)
for a, b in re.findall(r'([\u4e00-\u9fff]{1,4})畏([\u4e00-\u9fff]{1,5})', seg19_prose[iex:])
if len(a) >= 2 and len(b) >= 2]
for extra in [("川乌", "犀角"), ("草乌", "犀角")]: # "川乌、草乌畏犀角"正则只捕草乌,补川乌
if extra not in pairs: pairs.append(extra)
i19 = ph.find("十九畏歌:")
seg_preg = ph[ph.find("此外,妊娠禁忌"):ph.find("经验告诉我们")]
safety = {"十八反": {
"相反组": [
{"组": ["乌头"], "组_通行扩展": ["川乌", "草乌", "附子"],
"反": ["半夏", "瓜蒌", "贝母", "白蔹", "白及"], "反_通行扩展": [],
"说明": "书列'乌头';附子为乌头子根,通行本明列附子反半夏/瓜蒌等,安全核查按通行扩展执行"},
{"组": ["甘草"], "组_通行扩展": [], "反": ["海藻", "大戟", "甘遂", "芫花"], "反_通行扩展": [],
"说明": None},
{"组": ["藜芦"], "组_通行扩展": [],
"反": ["人参", "沙参", "细辛", "芍药"], "反_通行扩展": ["丹参", "玄参", "苦参"],
"说明": "书列'诸参'散文明列人参、沙参;通行本扩展丹参/玄参/苦参"}],
"歌诀原文": re.search(r'十八反歌:[^\n]+', ph).group(0),
"散文原文": seg18_prose.strip().split("\n")[0],
"行号": ln(ph_i + i18),
"通行扩展说明": "歌诀'诸参辛芍反藜芦',通行本藜芦组扩展含丹参/玄参/苦参;乌头组扩展含附子。扩展项在核查结果中标注[通行扩展]"},
"十九畏": {
"畏对": pairs,
"散文原文": seg19_prose.strip().split("\n")[0],
"行号": ln(ph_i + i19)},
"妊娠禁忌": {"药": [], "原文摘录": seg_preg.strip()[:400], "行号": ln(ph_i + ph.find("此外,妊娠禁忌"))}}
for m in re.finditer(r'(植物|动物|矿物)药如([^;。]+)', seg_preg):
for x in re.split(r'[、]', m.group(2)):
x = x.strip()
if 2 <= len(x) <= 6: safety["妊娠禁忌"]["药"].append(x)
lib["用药安全"] = safety
# ============ 输出 ============
json.dump(lib, open(OUT, "w", encoding="utf-8"), ensure_ascii=False, indent=1)
print("理论依据库:", OUT, f"({os.path.getsize(OUT)} bytes)")
print(f"八法 {len(bafa)} | 治法 {len(zhifa)}(缺号{gaps}) | 七方 {len(qifang)} | 效能 {len(xiaoneng)} | "
f"药组 {len(groups)} | 示例方 {len(shili)} | 脉 {len(mai)} | 十八反组3 | 十九畏 {len(safety['十九畏']['畏对'])}对 | 妊娠禁忌 {len(safety['妊娠禁忌']['药'])}味")
@@ -0,0 +1,233 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
中医入门资料库 03_关联融合(反向标注模式)
方向: 大医网实体(方剂1000/药材1000) → 中医入门理论锚点(用户定级: 重要理论基础)
理论锚点:
药材侧: 气味效能15分类 + 扶正7系38条/祛邪18条功效药组 + 十八反/十九畏/妊娠禁忌
方剂侧: 七方(7类) + 剂型(丸散膏丹等) + 40首示例方 + 八法/72治法提及方例
匹配: 每个大医网药材查询自己在书侧理论锚点中的出现位置(正名/别名/炮制归一)
每个大医网方剂查询: 书侧40示例方同名 + 组成药味触发的功效组归属 + 名称含"汤散丸膏"剂型线索
输出: 03_关联融合/大医网-中医入门_理论锚点反向标注.json
"""
import json, os, re, datetime, collections
BASE = "/home/songyi/Documents/ai_agent_scraper_study/data"
DY = os.path.join(BASE, "大医网/01_来源数据")
BOOK = os.path.join(BASE, "中医入门资料库/02_加工数据/中医入门.md")
OUTDIR = os.path.join(BASE, "中医入门资料库/03_关联融合")
TODAY = datetime.date.today().isoformat()
# 炮制前缀(候选侧可安全剥离);产地/品质限定词(土/川/广/云/怀/杭/紫/白等)不剥——
# "土人参/土白术"等是独立民间药名,剥离会造成假阳性(白木耳式陷阱的镜像)
PREP_PREFIXES = sorted(["生晒","炙","煨","煅","焦","炒","制","飞","清","法","霜","酒",
"醋","盐","蜜","麸","鲜","干","姜","蒸","煮","泡","燀"], key=len, reverse=True)
BOOK_ALIAS = { # 书侧简写 → 药典正名
"山萸":"山茱萸","萸肉":"山茱萸","麻仁":"火麻仁","云苓":"茯苓","赤苓":"茯苓",
"云茯神":"茯神","银花":"金银花","杭菊花":"菊花","花粉":"天花粉","寸冬":"麦冬",
"生地":"生地黄","熟地":"熟地黄","鲜生地":"生地黄","肉果":"肉豆蔻","煨肉果":"肉豆蔻",
"淡苁蓉":"肉苁蓉","吴萸":"吴茱萸","川连":"黄连","潼沙苑":"沙苑子","仙灵脾":"淫羊藿",
"旱莲草":"墨旱莲","丹皮":"牡丹皮","茅根":"白茅根","鲜茅根":"白茅根","象贝母":"浙贝母",
"象贝":"浙贝母","川贝":"川贝母","紫河车":"紫河车","白蒺藜":"刺蒺藜","菟丝饼":"菟丝子",
"桑椹子":"桑椹","使君肉":"使君子","山查炭":"山楂","焦麦芽":"麦芽","炒莱菔子":"莱菔子",
"驴皮胶":"阿胶","龟版":"龟板","菟蓉":"肉苁蓉","金铃子":"川楝子","延胡":"延胡索",
"参三七":"三七","全当归":"当归","当归身":"当归","冬虫草":"冬虫夏草","蝉衣":"蝉蜕",
"瓜蒌仁":"瓜蒌子","瓜蒌":"瓜蒌","益智仁":"益智仁","左牡蛎":"牡蛎","生石决":"石决明",
"羚羊尖":"羚羊角","炙全蝎":"全蝎","炒谷芽":"谷芽","春砂仁":"砂仁","白蔻仁":"豆蔻",
"御米壳":"罂粟壳","煨葛根":"葛根","炙升麻":"升麻","软柴胡":"柴胡","煨草果":"草果",
"炒苡仁":"薏苡仁","饭赤豆":"赤小豆","白藓皮":"白鲜皮","炙兜铃":"马兜铃","淡豆豉":"淡豆豉",
"黑山栀":"栀子","炒竹茹":"竹茹","炙桑皮":"桑白皮","甜杏仁":"甜杏仁","苦杏仁":"苦杏仁",
"炒牛蒡":"牛蒡子","苦桔梗":"桔梗","石草":"石韦","淡菓蓉":"肉苁蓉","复盆子":"覆盆子",
"菖蒲":"石菖蒲","萹蓄草":"萹蓄","海金砂":"海金沙","杜仲":"杜仲","虎骨":"虎骨",
}
def norm(t): # 仅剥炮制前缀 + 别名归一(不剥产地/品质限定词)
c = t.strip()
for p in PREP_PREFIXES:
if c.startswith(p) and len(c) > len(p)+1:
c = c[len(p):]; break
return BOOK_ALIAS.get(c, c)
text = open(BOOK, encoding="utf-8").read()
# ============ 构建书侧理论锚点 ============
# A. 药材理论锚点: 效能15分类 + 扶正/祛邪功效药组 + 用药安全
anchors_herb = collections.defaultdict(lambda: {"效能分类": [], "功效药组": [], "用药安全": []})
def add(anchor, herb_raw, kind, label):
n = norm(herb_raw)
if len(n) >= 2: anchors_herb[n][kind].append(label)
if n != herb_raw and len(herb_raw) >= 2: # 炮制品/原名也留痕
anchors_herb[herb_raw][kind].append(label + "(原词)")
# A1. 效能15分类
xn = text[text.find("二、效能"):text.find("#### 1. 扶正类")]
for cat_m in re.finditer(r'^(\d+)\.\s*([^\s::,。]{2,8}药):(.+)$', xn, re.M):
cat = cat_m.group(2)
for m in re.finditer(r'([\u4e00-\u9fff、]{2,24})如([、\u4e00-\u9fff()a-zA-Z0-9]{2,60})', cat_m.group(3)):
for h in re.split(r'[、]', m.group(2)):
h = re.sub(r'([^)]*)', '', h).strip("等")
if h: add(None, h, "效能分类", cat)
# A2. 扶正/祛邪功效药组
def parse_groups(start, end, kind):
seg = text[text.find(start):text.find(end)]
cur_sys = ""
for line in seg.splitlines():
s = line.strip()
m_sys = re.match(r'^\((\d+)\)\s*属于(.+?):', s)
if m_sys: cur_sys = m_sys.group(2); continue
if not re.match(r'^[^#\d(].*——', s): continue
eff, _, rhs = s.partition("——")
label = f"{kind}·{eff.strip()}"
if cur_sys: label = f"{kind}·{cur_sys}·{eff.strip()}"
for h in re.split(r'[、,,]', rhs.strip().strip("。")):
h = re.sub(r'([^)]*)', '', h).strip()
h = re.sub(r'^(亦可用鲜|亦可用)', '', h).strip()
if h: add(None, h, "功效药组", label)
parse_groups("#### 1. 扶正类", "#### 2. 祛邪类", "扶正类")
parse_groups("#### 2. 祛邪类", "三、归经", "祛邪类")
# A3. 用药安全: 十八反/十九畏/妊娠禁忌
ph = text[text.find("一、配合"):text.find("二、用量")]
i = ph.find("歌中所提十八种药")
seg18 = ph[i:ph.find("歌中所提十九种药")] # 不能用"十九畏歌"作边界——开篇引言句已含该词
for h in ["半夏","瓜蒌","贝母","白蔹","白及","海藻","大戟","甘遂","芫花","甘草","人参","沙参","细辛","芍药","藜芦","乌头"]:
if h in seg18: anchors_herb[h]["用药安全"].append("十八反")
i = ph.find("歌中所提十九种药")
seg19 = ph[i:ph.find("此外,妊娠禁忌")]
for pair in re.findall(r'([\u4e00-\u9fff]{1,4})畏([\u4e00-\u9fff]{1,5})', seg19):
for h in pair:
if len(h) >= 2:
anchors_herb[h]["用药安全"].append("十九畏")
if "川乌" in seg19: # "川乌、草乌畏犀角"正则只捕到草乌,补川乌
anchors_herb["川乌"]["用药安全"].append("十九畏")
segpreg = ph[ph.find("此外,妊娠禁忌"):ph.find("经验告诉我们")]
for h in re.findall(r'如([^;。]{2,200}?)[;。]', segpreg):
for x in re.split(r'[、]', h):
x = x.strip()
if 2 <= len(x) <= 5: anchors_herb[x]["用药安全"].append("妊娠禁忌")
# B. 方剂理论锚点: 七方/剂型/40示例方/治法方例
anchors_fang = {"七方举例": {}, "示例方": {}, "剂型": "丸散膏丹酒汤等"}
qf = text[text.find("二、七方"):text.find("三、剂型")]
cur = None
for para in re.split(r'\n\n+', qf):
m = re.match(r'^\d+[\.、]\s*([^\s::,。]{1,3})方', para.strip())
if m: cur = m.group(1) + "方"
elif cur:
for f in re.findall(r'([\u4e00-\u9fff]{2,8}(?:汤|丸|散|饮|膏))', para):
anchors_fang["七方举例"].setdefault(f, []).append(cur)
sec = text[text.find("一、基本方剂"):text.find("二、处方举例")]
for n, name, rest in re.findall(r'^(\d+)\.\s*([^::\n]+)[::]\s*(.+)$', sec, re.M):
anchors_fang["示例方"][name.strip()] = {
"序号": int(n), "组成_书": [c.strip() for c in rest.split("。")[0].split("、") if c.strip()],
"定位": (re.search(r'为([^,。]{2,12})主方', rest).group(1) if re.search(r'为([^,。]{2,12})主方', rest) else None),
"主治": (rest.split("。")[1].replace("用于","").strip() if len(re.findall(r'。', rest))>1 and "用于" in rest else None)}
# 72治法中的方药举例 → 治法标签(终点用"## 第三章",因"## 第一节"在第一章也出现)
zf = text[text.find("四、常用治法"):text.find("## 第三章")]
zhifa_herb = collections.defaultdict(list)
for n, name, rest in re.findall(r'^(\d+)\.\s*([^\s::,。]{2,12}法):?(.*)$', zf, re.M):
m = re.search(r'药如([、\u4e00-\u9fff()]{2,50})', rest)
if m:
for h in re.split(r'[、]', m.group(1)):
h = re.sub(r'([^)]*)','',h).strip()
if h: zhifa_herb[norm(h)].append(f"治法{n}.{name}")
print(f"理论锚点: 归一药材 {len(anchors_herb)} 个 | 示例方 {len(anchors_fang['示例方'])} | 七方举例 {len(anchors_fang['七方举例'])} | 治法关联药 {len(zhifa_herb)}")
# ============ 大医网药材 → 理论锚点 ============
yao_out = []
for fn in sorted(os.listdir(os.path.join(DY, "中药材"))):
d = json.load(open(os.path.join(DY, "中药材", fn), encoding="utf-8"))
nm = (d.get("名称") or "").strip()
cands = {nm}
for a in re.split(r'[、,,;;]', d.get("别名") or ""):
a = a.strip()
if len(a) >= 2: cands.add(a)
hits = []
for c in list(cands):
cn = norm(c)
for key in {c, cn}:
if key in anchors_herb:
v = anchors_herb[key]
kinds = [k for k in ("效能分类","功效药组","用药安全") if v[k]]
hits.append({"命中名": key, "书侧原词": list({c} | ({cn} if cn!=c else set())) and (c if key==c else cn),
"类型": kinds,
"效能分类": v["效能分类"], "功效药组": v["功效药组"][:8],
"用药安全": v["用药安全"],
"治法关联": zhifa_herb.get(key, [])[:6]})
seen, uniq = set(), []
for h in hits:
sig = h["命中名"]
if sig not in seen: seen.add(sig); uniq.append(h)
yao_out.append({
"大医网药材": nm, "id": fn.split("_")[0],
"别名": [a for a in cands if a != nm][:12],
"理论锚点": uniq,
"锚点类型": sorted({k for h in uniq for k in h["类型"]}),
"关联强度": len(uniq)})
covered = sum(1 for y in yao_out if y["理论锚点"])
print(f"药材反向标注: {covered}/1000 有理论锚点 ({covered//10}%)")
# ============ 大医网方剂 → 理论锚点 ============
fang_out = []
for fn in sorted(os.listdir(os.path.join(DY, "方剂"))):
d = json.load(open(os.path.join(DY, "方剂", fn), encoding="utf-8"))
nm = (d.get("名称") or "").strip()
nm_clean = re.sub(r'[《》].*$', '', nm).strip() # 去出处后缀
rec = {"大医网方剂": nm, "id": fn.split("_")[0], "理论锚点": []}
# B1 40示例方同名
if nm_clean in anchors_fang["示例方"]:
s = anchors_fang["示例方"][nm_clean]
rec["理论锚点"].append({"类型": ["示例方"], "示例方": nm_clean, "书侧序号": s["序号"],
"书侧组成": s["组成_书"], "主方定位": s["定位"], "主治": s["主治"]})
# B2 七方举例
if nm_clean in anchors_fang["七方举例"]:
rec["理论锚点"].append({"类型": ["七方举例"], "归属": anchors_fang["七方举例"][nm_clean]})
# B3 剂型线索(名称后缀 → 剂型理论)
m = re.search(r'(丸|散|膏|丹|酒|汤|饮)', nm)
if m:
rec["理论锚点"].append({"类型": ["剂型理论"], "剂型": m.group(1),
"理论": "丸散膏丹酒汤等剂型各具性质效用(中医入门·方剂之部·剂型)"})
# B4 组成药味 → 功效药组/治法推断(方解-组成仅5%填充,填充者才可算)
comp = d.get("方解-组成")
if comp:
herhs = [norm(x) for x in re.split(r'[、,,]', str(comp)) if x.strip()]
groups = collections.Counter()
zhifa = []
for h in herhs:
if h in anchors_herb:
for g in anchors_herb[h]["功效药组"]: groups[g] += 1
zhifa += zhifa_herb.get(h, [])
if groups:
rec["理论锚点"].append({"类型": ["功效药组推断"], "top功效组": [g for g,_ in groups.most_common(5)],
"组内命中": sum(1 for h in herhs if h in anchors_herb), "组成总数": len(herhs)})
if zhifa:
rec["理论锚点"].append({"类型": ["治法关联"], "治法": sorted(set(zhifa))[:8]})
rec["锚点类型"] = sorted({t for a in rec["理论锚点"] for t in a["类型"]})
rec["关联强度"] = len(rec["理论锚点"])
fang_out.append(rec)
n_any = sum(1 for f in fang_out if f["理论锚点"])
n_shili = sum(1 for f in fang_out if "示例方" in f["锚点类型"])
n_qifang = sum(1 for f in fang_out if "七方举例" in f["锚点类型"])
n_subst = sum(1 for f in fang_out if set(f["锚点类型"]) - {"剂型理论"})
n_only_jx = sum(1 for f in fang_out if f["锚点类型"] == ["剂型理论"])
print(f"方剂反向标注: {n_any}/1000 有锚点 | 实质锚点(示例方/七方/功效组/治法) {n_subst} | 仅剂型线索 {n_only_jx} | 示例方同名 {n_shili} | 七方举例 {n_qifang}")
# ============ 输出 ============
result = {
"metadata": {
"timestamp": TODAY,
"方向": "大医网实体 → 中医入门理论锚点(反向标注;中医入门为理论依据层,用户定级: 重要理论基础)",
"source_theory": "中医入门资料库/02_加工数据/中医入门.md(秦伯未《中医入门》体例)",
"source_entity": "大医网/01_来源数据/{方剂1000, 中药材1000}(随机抽样库)",
"锚点体系": {"药材": ["效能15分类", "扶正7系+祛邪功效药组", "十八反/十九畏/妊娠禁忌", "72治法药例"],
"方剂": ["40首示例方(含主方定位)", "七方举例", "剂型理论", "组成→功效组/治法推断"]},
"说明": "大医网为随机抽样1000,书侧示例方未在其中属正常(理论层不依赖抽样覆盖);药材锚点覆盖率反映抽样命中理论药组的比例",
"stats": {"药材有锚点": covered, "药材总数": len(yao_out),
"方剂有锚点": n_any, "方剂实质锚点": n_subst, "方剂仅剂型": n_only_jx,
"方剂示例方同名": n_shili, "方剂七方举例": n_qifang}},
"药材反向标注": yao_out,
"方剂反向标注": fang_out,
}
out = os.path.join(OUTDIR, "大医网-中医入门_理论锚点反向标注.json")
json.dump(result, open(out, "w", encoding="utf-8"), ensure_ascii=False, indent=1)
print("\n输出:", out, f"({os.path.getsize(out)} bytes)")
@@ -0,0 +1,215 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
《中医入门》理论依据查询接口(应用调用层)
用法:
from theory_api import TCMTheory
t = TCMTheory()
t.herb("黄芪") # 药材理论依据: 效能分类/功效药组/治法/用药安全
t.formula("大承气汤") # 方剂理论依据: 主方定位/主治/七方归属/组成药组
t.safety_check(["甘草","大戟"]) # 配伍安全核查: 十八反/十九畏/妊娠禁忌
t.method("补中益气") # 治法查询(名称模糊)
t.constitution("气虚") # 体质调理依据(按气虚/阳虚/阴虚等关键词聚合)
依据均含 行号(02_加工数据/中医入门.md) 可人工溯源。
"""
import json, os, re
LIB = os.path.join(os.path.dirname(__file__), "../02_加工数据/理论依据库.json")
BOOK = os.path.join(os.path.dirname(__file__), "../02_加工数据/中医入门.md")
# 书侧简写 → 正名(与 reverse_tag 脚本一致的归一)
BOOK_ALIAS = {"山萸":"山茱萸","萸肉":"山茱萸","麻仁":"火麻仁","云苓":"茯苓","赤苓":"茯苓",
"云茯神":"茯神","银花":"金银花","杭菊花":"菊花","花粉":"天花粉","寸冬":"麦冬",
"生地":"生地黄","熟地":"熟地黄","鲜生地":"生地黄","肉果":"肉豆蔻","淡苁蓉":"肉苁蓉",
"吴萸":"吴茱萸","川连":"黄连","潼沙苑":"沙苑子","仙灵脾":"淫羊藿","旱莲草":"墨旱莲",
"丹皮":"牡丹皮","茅根":"白茅根","象贝母":"浙贝母","川贝":"川贝母","白蒺藜":"刺蒺藜",
"菟丝饼":"菟丝子","桑椹子":"桑椹","使君肉":"使君子","山查炭":"山楂","焦麦芽":"麦芽",
"炒莱菔子":"莱菔子","驴皮胶":"阿胶","龟版":"龟板","菟蓉":"肉苁蓉","金铃子":"川楝子",
"延胡":"延胡索","参三七":"三七","全当归":"当归","当归身":"当归","冬虫草":"冬虫夏草",
"蝉衣":"蝉蜕","瓜蒌仁":"瓜蒌子","左牡蛎":"牡蛎","生石决":"石决明","羚羊尖":"羚羊角",
"炙全蝎":"全蝎","炒谷芽":"谷芽","春砂仁":"砂仁","白蔻仁":"豆蔻","御米壳":"罂粟壳",
"煨葛根":"葛根","炙升麻":"升麻","软柴胡":"柴胡","煨草果":"草果","炒苡仁":"薏苡仁",
"饭赤豆":"赤小豆","白藓皮":"白鲜皮","炙兜铃":"马兜铃","黑山栀":"栀子","炒竹茹":"竹茹",
"炙桑皮":"桑白皮","炒牛蒡":"牛蒡子","苦桔梗":"桔梗","石草":"石韦","淡菓蓉":"肉苁蓉",
"复盆子":"覆盆子","菖蒲":"石菖蒲","萹蓄草":"萹蓄","海金砂":"海金沙",}
PREP_PREFIX = ["生晒","炙","煨","煅","焦","炒","制","飞","清","法","霜","酒","醋","盐",
"蜜","麸","鲜","干","姜","蒸","煮"] # 只剥炮制前缀;产地品质限定词不剥(土人参陷阱)
def _norm(name: str):
c = name.strip()
for p in PREP_PREFIX:
if c.startswith(p) and len(c) > len(p) + 1:
c = c[len(p):]; break
return BOOK_ALIAS.get(c, c)
class TCMTheory:
def __init__(self):
self.lib = json.load(open(LIB, encoding="utf-8"))
self.book_lines = open(BOOK, encoding="utf-8").read().splitlines()
# 索引: 药名(正名+别名+炮制品) → 锚点
self.herb_index = {}
for cat, info in self.lib["效能分类"].items():
for h in info["代表药"]:
self.herb_index.setdefault(_norm(h), []).append({"通道": "效能分类", "值": cat, "行号": info["行号"]})
for g in self.lib["功效药组"]["条目"]:
for h in g["药"]:
self.herb_index.setdefault(_norm(h), []).append({"通道": "功效药组", "值": g["组"], "行号": g["行号"]})
for num, z in self.lib["治法72"]["条目"].items():
for h in z["药如"]:
self.herb_index.setdefault(_norm(h), []).append({"通道": "治法", "值": f"治法{num}.{z['名称']}", "行号": z["行号"]})
self.safety_index = {}
for grp in self.lib["用药安全"]["十八反"]["相反组"]:
for a in grp["组"]:
self.safety_index.setdefault(a, []).append(("十八反", f'与{"、".join(grp["反"])}相反', "书列"))
for a in grp.get("组_通行扩展", []):
self.safety_index.setdefault(a, []).append(("十八反", f'与{"、".join(grp["反"])}相反', "通行扩展"))
for h in grp["反"]:
who = "、".join(grp["组"] + grp.get("组_通行扩展", []))
self.safety_index.setdefault(h, []).append(("十八反", f"反{who}", "书列"))
for h in grp.get("反_通行扩展", []):
who = "、".join(grp["组"] + grp.get("组_通行扩展", []))
self.safety_index.setdefault(h, []).append(("十八反", f"反{who}", "通行扩展"))
for a, b in self.lib["用药安全"]["十九畏"]["畏对"]:
self.safety_index.setdefault(a, []).append(("十九畏", f"畏{b}", "书列"))
self.safety_index.setdefault(b, []).append(("十九畏", f"为{a}所畏", "书列"))
for h in self.lib["用药安全"]["妊娠禁忌"]["药"]:
self.safety_index.setdefault(h, []).append(("妊娠禁忌", "妊娠禁忌药", "书列"))
def _quote(self, line_no, width=60):
if 1 <= line_no <= len(self.book_lines):
return self.book_lines[line_no - 1][:width]
return None
# ---------- 药材理论依据 ----------
def herb(self, name: str):
n = _norm(name)
hits = self.herb_index.get(n, []) or self.herb_index.get(name.strip(), [])
if not hits:
return {"药材": name, "结果": "《中医入门》理论药组未收录(该书为入门纲要,未收不等于无理论依据)"}
out = {"药材": name, "正名": n, "依据": []}
seen = set()
for h in hits:
key = (h["通道"], h["值"])
if key in seen: continue
seen.add(key)
out["依据"].append({**h, "原文": self._quote(h["行号"])})
out["用药安全"] = self._safety_of(n)
return out
# ---------- 方剂理论依据 ----------
def formula(self, name: str):
s = self.lib["示例方40"].get(name.strip())
if not s:
# 组成含书侧示例方药的模糊建议
return {"方剂": name, "结果": "非书侧40示例方;可按组成逐味调用 herb() 获取理论依据",
"剂型理论": self._jixing_hint(name)}
out = {"方剂": name, "主方定位": s["主方定位"], "主治": s["主治"],
"组成_书": s["组成_书"], "行号": s["行号"], "原文": self._quote(s["行号"], 120),
"七方归属": [q for q, v in self.lib["七方"].items() if name in v["书内举例"]] or None,
"组成理论": []}
safety_all = []
for h in s["组成_书"]:
hb = self.herb(h)
ch = [f'{d["通道"]}:{d["值"]}' for d in hb.get("依据", [])][:3]
out["组成理论"].append({"药": h, "依据": ch})
if hb.get("用药安全"): safety_all.append({h: hb["用药安全"]})
if safety_all: out["组成用药安全"] = safety_all
return out
# ---------- 配伍安全核查 ----------
def safety_check(self, herbs):
herbs = [h.strip() for h in herbs if h.strip()]
conflicts, warnings = [], []
normalized = {h: _norm(h) for h in herbs}
names = list(normalized.items())
# 十八反: 组内对立(含通行扩展,结果标注来源)
for grp in self.lib["用药安全"]["十八反"]["相反组"]:
side_a = {(h, n) for h, n in names
if n in grp["组"] or n in grp.get("组_通行扩展", [])}
side_b = {(h, n) for h, n in names
if n in grp["反"] or n in grp.get("反_通行扩展", [])}
if side_a and side_b:
src = "书列"
a_ext = any(n in grp.get("组_通行扩展", []) for _, n in side_a)
b_ext = any(n in grp.get("反_通行扩展", []) for _, n in side_b)
if a_ext or b_ext: src = "通行扩展"
conflicts.append({"类型": "十八反", "来源": src,
"组": sorted(h for h, _ in side_a), "反": sorted(h for h, _ in side_b),
"行号": self.lib["用药安全"]["十八反"]["行号"]})
# 十九畏: 组内畏对
pairset = {frozenset(p) for p in self.lib["用药安全"]["十九畏"]["畏对"]}
for i in range(len(names)):
for j in range(i + 1, len(names)):
if frozenset([names[i][1], names[j][1]]) in pairset:
warnings.append({"类型": "十九畏", "对": [names[i][0], names[j][0]],
"行号": self.lib["用药安全"]["十九畏"]["行号"]})
# 妊娠禁忌
preg = [h for h, n in names
if n in self.lib["用药安全"]["妊娠禁忌"]["药"] or h in self.lib["用药安全"]["妊娠禁忌"]["药"]]
return {"核查药味": herbs, "十八反冲突": conflicts or None,
"十九畏警式": warnings or None,
"妊娠禁忌药": preg or None,
"结论": "存在配伍禁忌,须调整" if conflicts else
("有相畏提示,慎用并权衡" if warnings else
("含妊娠禁忌药,孕妇须避" if preg else "书侧十八反/十九畏/妊娠禁忌未命中"))}
# ---------- 治法 ----------
def method(self, keyword: str):
out = []
for num, z in self.lib["治法72"]["条目"].items():
hay = z["名称"] + (z["适应症"] or "")
if keyword in z["名称"] or keyword in hay or z["名称"][:2] in keyword:
out.append({"治法": f"{num}.{z['名称']}", "适应症": z["适应症"],
"药如": z["药如"], "行号": z["行号"],
"原文": self._quote(z["行号"])})
for bn, bv in self.lib["八法"].items():
if keyword in bn or keyword in bv["定义原文"] or bn[0] in keyword:
out.append({"八法": bn, "定义": bv["定义原文"], "行号": bv["行号"]})
return {"关键词": keyword, "命中": out or None}
# ---------- 体质调理依据 ----------
CONSTITUTION_SYNONYMS = {
"气虚": ["补气", "中气"], "血虚": ["补血", "养血"], "阴虚": ["补阴", "滋阴", "养阴"],
"阳虚": ["补阳", "助阳", "温阳", "扶阳"], "痰湿": ["化湿", "化痰", "淡渗"],
"湿热": ["清湿热", "化湿", "利湿"], "血瘀": ["活血", "破瘀"], "气滞": ["行气", "破气", "疏肝"],
"寒": ["温中", "祛寒", "散寒", "扶阳"], "热": ["清热", "泻火", "凉血"], "食积": ["消食", "消导"]}
def constitution(self, keyword: str):
"""按 气虚/血虚/阴虚/阳虚/痰湿/湿热/血瘀/气滞/寒/热/食积 等关键词聚合理论依据"""
syns = self.CONSTITUTION_SYNONYMS.get(keyword, [keyword])
res = {"关键词": keyword, "同义词展开": syns, "补益药组": [], "治法": [], "八法": []}
for g in self.lib["功效药组"]["条目"]:
if any(s in g["组"] for s in syns):
res["补益药组"].append({"组": g["组"], "药": g["药"], "行号": g["行号"]})
for num, z in self.lib["治法72"]["条目"].items():
hay = z["名称"] + (z["适应症"] or "")
if any(s in hay for s in syns):
res["治法"].append({"治法": f"{num}.{z['名称']}", "药如": z["药如"], "行号": z["行号"]})
for bn, bv in self.lib["八法"].items():
if any(s in bv["定义原文"] for s in syns):
res["八法"].append({"八法": bn, "行号": bv["行号"]})
res["提示"] = "示例方与药组的完整组成请调用 formula()/herb() 逐层获取" if (res["补益药组"] or res["治法"]) else None
return res
# ---------- 内部 ----------
def _safety_of(self, n):
recs = self.safety_index.get(n, [])
out = {}
for typ, desc, src in recs:
out.setdefault(typ, []).append(f"{desc}[{src}]" if src != "书列" else desc)
return out or None
def _jixing_hint(self, name):
m = re.search(r'(丸|散|膏|丹|酒|汤|饮)', name)
if not m: return None
jx = m.group(1)
return {"剂型": jx, "说明": "丸散膏丹等剂型各具性质效用(方剂之部·剂型)"}
if __name__ == "__main__":
t = TCMTheory()
print("== herb 黄芪 =="); print(json.dumps(t.herb("黄芪"), ensure_ascii=False, indent=1)[:600])
print("\n== formula 大承气汤 =="); print(json.dumps(t.formula("大承气汤"), ensure_ascii=False, indent=1)[:700])
print("\n== safety 甘草+大戟 =="); print(json.dumps(t.safety_check(["甘草", "大戟", "茯苓"]), ensure_ascii=False, indent=1))
print("\n== method 补中 =="); print(json.dumps(t.method("补中"), ensure_ascii=False, indent=1)[:400])
print("\n== constitution 气虚 =="); print(json.dumps(t.constitution("气虚"), ensure_ascii=False, indent=1)[:500])
+67
View File
@@ -0,0 +1,67 @@
# 中医入门资料库
> 建库日期: 2026-09-07
> 数据源: MinerU OCR 扫描转换(繁体影印本 → Markdown)
## 一、书籍信息
《中医入门》,秦伯未著作体例,全书分四章:
| 章 | 内容 | 收录内容 |
|----|------|----------|
| 第一章 理论之部 | 中医特点、基本学说、生理、病因 | 整体观念、辨症论治、阴阳五行、经络、预防、五脏六腑、十二经脉、气血精津液、三因 |
| 第二章 法则之部 | 辨症、诊法、治法 | 表里寒热虚实、六经三焦、望闻问切、二十八脉、正治反治、标本、八法、常用治法 |
| 第三章 方剂之部 | 方制、基本方剂和处方 | 君臣佐使、七方、剂型、通治方、脉案处方示例 |
| 第四章 药物之部 | 采集炮制、药性、使用 | 采集炮制、气味效能、扶正祛邪类、归经、配伍禁忌、用量 |
定位(用户定级 2026-09-08):**重要理论基础**。中医入门级理论教材,权威性高于普通科普读物,属系统学习类资料,作为资料库体系的理论层基石。可与健康管理师教材、中华药膳全书、大医网四库交叉关联。
## 二、目录结构与数据谱系
```
中医入门资料库/
├── README.md ← 本文件(数据谱系总览)
├── 01_来源数据/
│ └── 中医入门_MinerU_OCR_2026-09-07.md ← MinerU OCR 原始输出(繁简混杂,224,843 字节,1,829 行)
├── 02_加工数据/
│ ├── 中医入门.md ← 清洗成品(全文简体,224,415 字节)
│ ├── 理论依据库.json ← 应用调用层:八法/治法72/七方/效能15/药组42/示例方40/脉27/用药安全(原文+行号溯源)
│ └── OCR文本清洗报告.md ← 清洗规则表(39+8+12 处错字修正 + 传/傅辨析等,可复用)
├── 03_关联融合/
│ ├── 大医网-中医入门_理论锚点反向标注.json ← 大医网2000实体→本书理论锚点反向标注(243药材+69方剂实质锚点)
│ └── 关联融合总览.json ← 本目录清单与统计
├── 04_分析报告/
├── 初步分析报告.md ← 全书结构与内容要素分析(2026-09-08)
├── 理论依据调用指南.md ← 应用层调用说明(接口用法/依据分级)
├── 人工核对清单.md ← A/B/C 三级核对清单(行号定位)
└── 手工核验复检报告.md ← 用户手工核验后的复检报告(定稿确认)
```
### 数据谱系
```
纸质影印本(繁体竖排)
└─ MinerU OCR 扫描转换 ──→ 01_来源数据/中医入门_MinerU_OCR_2026-09-07.md
└─ OCR 清洗(繁转简 + 错字修正 + 结构重建)──→ 02_加工数据/中医入门.md
└─ 理论锚点反向标注 ──→ 03_关联融合/大医网-中医入门_理论锚点反向标注.json
└─ 分析报告 ──→ 04_分析报告/
```
## 三、清洗质量摘要
详见 02_加工数据/OCR文本清洗报告.md:
- 全文繁转简(OpenCC t2s),转换后繁体残留 0
- OCR 形近错字修正 39 处(逐处上下文核对)
- 傅→传 63 处("相傅"宰相义 1 处保留)
- 辩/辯→辨 统一
- 标题层级重建 58 个(章 ## / 节 ### / 小节 ####)
- MinerU CDN 页面截图引用移除 2 处
- **如实保留**:17 处页边界截断(OCR 逐页丢句,源文件信息缺失);"雷福亭曾说"引文出处存疑未臆改
## 四、后续可扩展方向
1. 交叉关联:与健康管理师教材(治未病/体质)、中华药膳全书(药性/配伍)、大医网四库(方剂/药材/穴位/疾病)建交叉索引 → 03_关联融合
2. 主题分析:如"八法与常用治法对照""二十八脉主症速查"等专题提炼 → 04_分析报告
3. 内容补全:获取完整版本补齐 17 处页边界截断句
4. **理论书群扩展**(用户规划 2026-09-08):将逐步增加理论书籍,与本书共同构成"理论依据层"——新书按六步管线接入(OCR入库→清洗定稿→用户定级→初步分析→依据提取→API多书源扩展),流程见 tcm-data-analysis 技能 references/theory-book-onboarding.md;theory_api.py 预留多书源改造(结果标注书源、冲突按定级排序)