Files
Jyotisha/scripts/darakaraka_reader.py
T
732642856 0f0c5dbdfa v6.1.0: Add 6 core missing modules + infrastructure
New modules (from Chinese reference articles):
- darakaraka_reader.py: DK spouse deep analysis (planet/sign/house/aspects)
- rashi_tulya_navamsa.py: RTN mapping engine (D9->D1, Gunas, curse detection)
- curse_yoga_detector.py: Curse yoga naming (Yama/Preta/Rakshasa/Pisacha)
- spouse_status_yoga.py: High-status spouse detection (7 principles)
- pancha_pakshi.py: Five-bird electional timing (daily schedule)
- tithi_analyzer.py: Tithi lord emotional pattern analysis

Infrastructure:
- technique_registry.py: Unified technique registry (31 techniques tracked)
- reading_orchestrator.py: Theme-based reading orchestrator (5 themes)

All 6 modules tested and runnable.
Current baseline: Precision 94.66%, Recall 92.95%, F1 93.80%
2026-06-07 12:11:15 +08:00

570 lines
24 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
darakaraka_reader.py — Darakaraka深度解读引擎
===============================================
Jaimini系统核心:配偶征象星的多维度深度分析
版本: v1.0 | 2026-06-07
"""
from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass, field
# DK行星特质库
PLANET_SPOUSE_TRAITS = {
"Sun": {
"core": "领导者型伴侣",
"traits": ["天生权威感", "决断力强", "稳定可靠", "有远见", "自尊心强"],
"attracted_to": ["有领导力的人", "有社会地位的人", "自信独立的人"],
"challenges": ["可能过于自我中心", "需要被尊重", "控制欲强"],
"positive": ["忠诚", "保护欲强", "有责任感", "能提供安全感"],
"career_signs": ["政府", "管理", "领导岗位", "创业"],
},
"Moon": {
"core": " nurturing型伴侣",
"traits": ["情感丰富", "关怀体贴", "直觉敏锐", "温和敏感", "依恋家庭"],
"attracted_to": ["温暖体贴的人", "能提供情感安全感的人", "重视家庭的人"],
"challenges": ["情绪波动大", "过于依赖", "安全感需求高"],
"positive": ["无条件的爱", "滋养力强", "善解人意", "母性/父性本能"],
"career_signs": ["护理", "教育", "心理咨询", "艺术创作"],
},
"Mars": {
"core": "行动派伴侣",
"traits": ["充满活力", "勇敢果断", "竞争性强", "直率坦诚", "行动迅速"],
"attracted_to": ["有活力的人", "敢于挑战的人", "独立自强的人"],
"challenges": ["脾气暴躁", "冲动", "好胜心过强", "缺乏耐心"],
"positive": ["保护欲极强", "勇敢无畏", "积极主动", "充满激情"],
"career_signs": ["军事", "体育", "工程", "外科医生", "冒险行业"],
},
"Mercury": {
"core": "智慧型伴侣",
"traits": ["聪明机智", "沟通能力强", "好奇心重", "适应力强", "理性分析"],
"attracted_to": ["聪明有趣的人", "善于交流的人", "有学识的人"],
"challenges": ["可能过于理性", "善变", "分析过度", "不够深情"],
"positive": ["善解人意", "幽默风趣", "知识渊博", "善于解决问题"],
"career_signs": ["写作", "教学", "商业", "传媒", "IT"],
},
"Jupiter": {
"core": "导师型伴侣",
"traits": ["智慧博爱", "道德感强", "慷慨大方", "乐观积极", "精神追求"],
"attracted_to": ["有智慧的人", "道德高尚的人", "有精神追求的人"],
"challenges": ["可能过于理想化", "说教倾向", "过度乐观"],
"positive": ["智慧引导", "慷慨支持", "精神伴侣", "道德榜样"],
"career_signs": ["教育", "法律", "宗教", "咨询", "金融"],
},
"Venus": {
"core": "浪漫型伴侣",
"traits": ["优雅迷人", "重视美感", "浪漫多情", "社交能力强", "追求和谐"],
"attracted_to": ["有品位的人", "浪漫体贴的人", "外表吸引的人"],
"challenges": ["可能过于注重外表", "物质倾向", "优柔寡断"],
"positive": ["浪漫体贴", "审美力强", "善于营造氛围", "关系和谐"],
"career_signs": ["艺术", "设计", "时尚", "美容", "外交"],
},
"Saturn": {
"core": "成熟型伴侣",
"traits": ["成熟稳重", "责任心强", "务实踏实", "纪律性强", "晚成"],
"attracted_to": ["成熟稳重的人", "有责任感的人", "事业稳定的人"],
"challenges": ["可能过于严肃", "情感表达困难", "冷淡疏离", "延迟"],
"positive": ["极度忠诚", "可靠稳重", "长期承诺", "共同成长"],
"career_signs": ["管理", "工程", "建筑", "政府", "传统行业"],
},
"Rahu": {
"core": "异域/非传统型伴侣",
"traits": ["独特非凡", "打破常规", "野心勃勃", "异域风情", "颠覆性"],
"attracted_to": ["与众不同的人", "有野心的人", "异域文化背景的人"],
"challenges": ["可能不稳定", "非传统关系", "社会不认可", "欺骗风险"],
"positive": ["带来全新体验", "突破局限", "独特魅力", "激发潜能"],
"career_signs": ["科技", "新媒体", "跨国业务", "非主流行业"],
},
}
# DK星座细化
SIGN_REFINEMENTS = {
"Aries": {"intensifies": ["行动力", "独立性"], "softens": [], "adds": ["冲动", "直接"]},
"Taurus": {"intensifies": ["稳定性", "感官享受"], "softens": ["急躁"], "adds": ["固执", "物质安全感"]},
"Gemini": {"intensifies": ["沟通", "多变"], "softens": ["沉闷"], "adds": ["好奇心", "不专一风险"]},
"Cancer": {"intensifies": ["情感", "保护欲"], "softens": ["冷漠"], "adds": ["情绪化", "依恋"]},
"Leo": {"intensifies": ["自信", "表现力"], "softens": [], "adds": ["需要关注", "骄傲"]},
"Virgo": {"intensifies": ["细致", "服务意识"], "softens": ["粗心"], "adds": ["挑剔", "焦虑"]},
"Libra": {"intensifies": ["和谐", "美感"], "softens": ["粗鲁"], "adds": ["优柔寡断", "依赖关系"]},
"Scorpio": {"intensifies": ["深度", "激情", "转化力"], "softens": [], "adds": ["控制欲", "嫉妒", "秘密"]},
"Sagittarius": {"intensifies": ["自由", "哲学"], "softens": ["狭隘"], "adds": ["不安定", "过度乐观"]},
"Capricorn": {"intensifies": ["野心", "责任感"], "softens": ["轻浮"], "adds": ["工作狂", "情感压抑"]},
"Aquarius": {"intensifies": ["独立", "创新"], "softens": ["传统束缚"], "adds": ["疏离", "反传统"]},
"Pisces": {"intensifies": ["同情", "灵性"], "softens": ["硬化"], "adds": ["模糊", "逃避", "牺牲"]},
}
# DK宫位解读
HOUSE_INTERPRETATIONS = {
1: "伴侣对命主影响深远,婚姻关系是自我身份的核心部分。伴侣可能性格鲜明、有领导力。",
2: "伴侣与家庭财富密切相关,可能带来财务支持或共同理财。伴侣重视家庭价值观。",
3: "伴侣与沟通、 siblings 有关。可能通过兄弟姐妹介绍认识,或伴侣重视交流。",
4: "伴侣与内心安全感、房产、家庭根基有关。伴侣提供情感庇护所。",
5: "伴侣与子女、创造力、浪漫有关。可能通过子女结识,或关系充满浪漫。",
6: "伴侣可能带来服务性质的关系,或伴侣从事服务/医疗行业。关系中需要克服困难。",
7: "伴侣特质直接显现,婚姻关系是核心人生主题。伴侣公开、直接。",
8: "深层转化型关系,伴侣可能带来重大人生变革。涉及共同资源、遗产、秘密。",
9: "伴侣与远方、高等教育、灵性有关。可能异地或文化背景不同。伴侣有智慧。",
10: "伴侣与社会地位、事业有关。伴侣可能有成就,或帮助命主事业发展。",
11: "伴侣与社交网络、愿望实现有关。通过朋友介绍认识,或共同追求理想。",
12: "隐秘或牺牲型关系,伴侣可能来自幕后或需要隐秘。灵性层面的连接。",
}
# 友好/敌对行星(影响DK
FRIENDLY_PLANETS = {
"Sun": ["Moon", "Mars", "Jupiter"],
"Moon": ["Sun", "Mercury"],
"Mars": ["Sun", "Moon", "Jupiter"],
"Mercury": ["Sun", "Venus"],
"Jupiter": ["Sun", "Moon", "Mars"],
"Venus": ["Mercury", "Saturn"],
"Saturn": ["Mercury", "Venus"],
"Rahu": ["Venus", "Saturn"],
}
ENEMY_PLANETS = {
"Sun": ["Saturn", "Venus"],
"Moon": [],
"Mars": ["Mercury"],
"Mercury": ["Moon"],
"Jupiter": ["Mercury", "Venus"],
"Venus": ["Sun", "Moon"],
"Saturn": ["Sun", "Moon", "Mars"],
"Rahu": ["Sun", "Moon", "Mars"],
}
@dataclass
class DKAnalysis:
"""DK分析结果"""
# 基础信息
dk_planet: str
dk_sign: str
dk_house: int
dk_degree: float
nakshatra: Optional[str] = None
nakshatra_pada: Optional[int] = None
# 状态
is_retrograde: bool = False
is_combust: bool = False
dignity: str = "" # exalted/own/friendly/neutral/enemy/debilitated
# D9信息
d9_sign: Optional[str] = None
d9_house: Optional[int] = None
d9_dignity: Optional[str] = None
# 解读
core_profile: str = "" # 核心配偶原型
personality_traits: List[str] = field(default_factory=list)
attracted_to: List[str] = field(default_factory=list)
challenges: List[str] = field(default_factory=list)
positive_traits: List[str] = field(default_factory=list)
career_signs: List[str] = field(default_factory=list)
# 宫位解读
house_meaning: str = ""
house_themes: List[str] = field(default_factory=list)
# 相位影响
conjunctions: List[Dict] = field(default_factory=list) # 合相
aspects_friendly: List[str] = field(default_factory=list) # 友好相位
aspects_hostile: List[str] = field(default_factory=list) # 敌对相位
# 综合评估
marriage_quality_score: float = 0.5 # 0-1
timing_clues: List[str] = field(default_factory=list)
remedies: List[str] = field(default_factory=list)
# 叙事
narrative: str = ""
class DarakarakaReader:
"""Darakaraka深度解读引擎"""
def __init__(self):
self.planet_traits = PLANET_SPOUSE_TRAITS
self.sign_refinements = SIGN_REFINEMENTS
self.house_interps = HOUSE_INTERPRETATIONS
def analyze(self, chart_data: Dict, use_8_karaka: bool = True) -> DKAnalysis:
"""
分析Darakaraka
Args:
chart_data: 标准星盘数据
use_8_karaka: 使用8星系统(含Rahu
Returns:
DKAnalysis对象
"""
# Step 1: 计算DK
dk_planet, dk_info = self._calculate_dk(chart_data, use_8_karaka)
# Step 2: 提取位置信息
dk_sign = dk_info.get("sign", "")
dk_house = dk_info.get("house", 0)
dk_degree = dk_info.get("degree_in_sign", 0)
# Step 3: 构建分析结果
analysis = DKAnalysis(
dk_planet=dk_planet,
dk_sign=dk_sign,
dk_house=dk_house,
dk_degree=dk_degree,
)
# Step 4: 填充行星特质
self._fill_planet_traits(analysis)
# Step 5: 星座细化
self._refine_by_sign(analysis)
# Step 6: 宫位解读
self._interpret_house(analysis)
# Step 7: 相位分析
self._analyze_aspects(analysis, chart_data)
# Step 8: D9分析
self._analyze_d9(analysis, chart_data)
# Step 9: 状态检测(逆行/燃烧)
self._check_status(analysis, dk_info)
# Step 10: 综合评估
self._comprehensive_assessment(analysis)
# Step 11: 生成叙事
analysis.narrative = self._generate_narrative(analysis)
return analysis
def _calculate_dk(self, chart_data: Dict, use_8_karaka: bool = True) -> Tuple[str, Dict]:
"""计算Darakaraka行星"""
planets = chart_data.get("planets", {})
# 提取各行星星座内度数
planet_degs = {}
for pname, pdata in planets.items():
if isinstance(pdata, dict) and "degree" in pdata:
deg_in_sign = pdata.get("degree_in_sign", pdata["degree"] % 30)
# Rahu逆行校正(8星系统)
if pname == "Rahu" and use_8_karaka:
deg_in_sign = 30.0 - deg_in_sign
planet_degs[pname] = deg_in_sign
# 排序(降序)
sorted_planets = sorted(planet_degs.items(), key=lambda x: x[1], reverse=True)
if not sorted_planets:
return "Unknown", {}
if use_8_karaka and len(sorted_planets) >= 8:
# 8星系统:第7高(第8颗被排除)
dk = sorted_planets[6][0] # 索引6 = 第7高
else:
# 7星系统:最低的
dk = sorted_planets[-1][0]
return dk, planets.get(dk, {})
def _fill_planet_traits(self, analysis: DKAnalysis):
"""填充行星基础特质"""
traits = self.planet_traits.get(analysis.dk_planet, {})
analysis.core_profile = traits.get("core", "")
analysis.personality_traits = traits.get("traits", [])
analysis.attracted_to = traits.get("attracted_to", [])
analysis.challenges = traits.get("challenges", [])
analysis.positive_traits = traits.get("positive", [])
analysis.career_signs = traits.get("career_signs", [])
def _refine_by_sign(self, analysis: DKAnalysis):
"""按星座细化"""
refinement = self.sign_refinements.get(analysis.dk_sign, {})
# 强化某些特质
for trait in refinement.get("intensifies", []):
if trait not in analysis.personality_traits:
analysis.personality_traits.append(f"**{trait}**")
# 软化某些特质
for trait in refinement.get("softens", []):
if trait in analysis.challenges:
analysis.challenges.remove(trait)
# 新增特质
for trait in refinement.get("adds", []):
if trait not in analysis.personality_traits:
analysis.personality_traits.append(trait)
def _interpret_house(self, analysis: DKAnalysis):
"""解读DK宫位"""
analysis.house_meaning = self.house_interps.get(
analysis.dk_house,
f"DK位于第{analysis.dk_house}"
)
# 宫位主题
house_themes = {
1: ["自我认同", "伴侣影响", "个人成长"],
2: ["家庭财富", "价值观", "语言能力"],
3: ["沟通", "兄弟姐妹", "短途旅行"],
4: ["情感安全", "房产", "母亲"],
5: ["子女", "创造力", "浪漫"],
6: ["服务", "健康", "克服困难"],
7: ["婚姻", "合作", "公开关系"],
8: ["转化", "共同资源", "秘密"],
9: ["远方", "智慧", "灵性"],
10: ["事业", "社会地位", "公众形象"],
11: ["社交网络", "愿望", "收益"],
12: ["隐秘", "牺牲", "灵性解脱"],
}
analysis.house_themes = house_themes.get(analysis.dk_house, [])
def _analyze_aspects(self, analysis: DKAnalysis, chart_data: Dict):
"""分析DK的相位影响"""
planets = chart_data.get("planets", {})
dk_lon = None
for pname, pdata in planets.items():
if pname == analysis.dk_planet and isinstance(pdata, dict):
dk_lon = pdata.get("degree")
break
if dk_lon is None:
return
# 检测合相(8度内)
conjunctions = []
for pname, pdata in planets.items():
if pname == analysis.dk_planet:
continue
if isinstance(pdata, dict) and "degree" in pdata:
diff = abs((pdata["degree"] - dk_lon + 180) % 360 - 180)
if diff < 8:
conjunctions.append({
"planet": pname,
"orb": round(diff, 2),
"nature": "friendly" if pname in FRIENDLY_PLANETS.get(analysis.dk_planet, []) else "neutral"
})
analysis.conjunctions = conjunctions
# 分类友好/敌对影响
for conj in conjunctions:
if conj["nature"] == "friendly":
analysis.aspects_friendly.append(conj["planet"])
elif conj["planet"] in ENEMY_PLANETS.get(analysis.dk_planet, []):
analysis.aspects_hostile.append(conj["planet"])
def _analyze_d9(self, analysis: DKAnalysis, chart_data: Dict):
"""分析DK在D9中的位置"""
# 简化实现:从chart_data的context中提取D9数据
context = chart_data.get("context", {})
d9_planets = context.get("navamsa_planets", {})
if analysis.dk_planet in d9_planets:
d9_data = d9_planets[analysis.dk_planet]
analysis.d9_sign = d9_data.get("sign")
analysis.d9_house = d9_data.get("house")
analysis.d9_dignity = d9_data.get("dignity")
def _check_status(self, analysis: DKAnalysis, dk_info: Dict):
"""检查DK状态"""
analysis.is_retrograde = dk_info.get("retrograde", False)
analysis.is_combust = dk_info.get("combust", False)
analysis.dignity = dk_info.get("dignity", "")
def _comprehensive_assessment(self, analysis: DKAnalysis):
"""综合评估婚姻质量"""
score = 0.5
# 正面因素
if analysis.dignity in ["exalted", "own", "friendly"]:
score += 0.15
if len(analysis.aspects_friendly) > len(analysis.aspects_hostile):
score += 0.1
if analysis.dk_house in [1, 4, 7, 10]:
score += 0.05
if not analysis.is_combust:
score += 0.1
# 负面因素
if analysis.dignity in ["debilitated", "enemy"]:
score -= 0.15
if analysis.is_combust:
score -= 0.15
if analysis.is_retrograde:
score -= 0.05
if len(analysis.aspects_hostile) > 0:
score -= 0.05 * len(analysis.aspects_hostile)
if analysis.dk_house in [6, 8, 12]:
score -= 0.05
analysis.marriage_quality_score = max(0, min(1, score))
# 时间线索
if analysis.is_retrograde:
analysis.timing_clues.append("婚姻可能较晚或经历反复")
if analysis.dk_house == 7:
analysis.timing_clues.append("婚姻关系是核心人生主题")
if analysis.dk_planet == "Saturn":
analysis.timing_clues.append("婚姻可能在30岁后或更晚")
# 补救措施
if analysis.marriage_quality_score < 0.4:
analysis.remedies.append("建议进行传统的婚姻祈福仪式")
if analysis.is_combust:
analysis.remedies.append("DK被燃烧,建议加强个人独立性")
if analysis.dk_planet == "Saturn":
analysis.remedies.append("耐心是关键,不要急于进入婚姻")
def _generate_narrative(self, analysis: DKAnalysis) -> str:
"""生成DK解读叙事"""
parts = []
# 核心画像
parts.append(f"### 伴侣核心画像:{analysis.core_profile}\n")
parts.append(f"您的Darakaraka(配偶象征星)是 **{analysis.dk_planet}**")
parts.append(f"落在 **{analysis.dk_sign}** 的第 **{analysis.dk_house}** 宫。\n")
# 性格特质
if analysis.personality_traits:
parts.append(f"\n伴侣的核心性格特质:{', '.join(analysis.personality_traits[:5])}\n")
# 宫位解读
parts.append(f"\n{analysis.house_meaning}\n")
# 吸引力
if analysis.attracted_to:
parts.append(f"\n您在伴侣身上寻找的品质:{', '.join(analysis.attracted_to[:3])}\n")
# 挑战
if analysis.challenges:
parts.append(f"\n需要注意的议题:{', '.join(analysis.challenges[:3])}\n")
# 正面
if analysis.positive_traits:
parts.append(f"\n伴侣带来的礼物:{', '.join(analysis.positive_traits[:3])}\n")
# 合相影响
if analysis.conjunctions:
parts.append(f"\n与DK合相的行星:")
for conj in analysis.conjunctions:
parts.append(f" - {conj['planet']} (orb: {conj['orb']}°)")
parts.append("")
# D9
if analysis.d9_sign:
parts.append(f"\n在Navamsa (D9) 中,DK位于 **{analysis.d9_sign}**")
if analysis.d9_dignity:
parts.append(f"状态为 **{analysis.d9_dignity}**。\n")
parts.append("这揭示了灵魂层面对伴侣的深层需求。\n")
# 综合评估
quality_desc = "优秀" if analysis.marriage_quality_score > 0.7 else \
"良好" if analysis.marriage_quality_score > 0.5 else \
"需要努力" if analysis.marriage_quality_score > 0.3 else "有挑战"
parts.append(f"\n**婚姻质量评估:{quality_desc}** ({analysis.marriage_quality_score:.0%})\n")
# 时间线索
if analysis.timing_clues:
parts.append(f"\n时间线索:{'; '.join(analysis.timing_clues)}\n")
# 补救
if analysis.remedies:
parts.append(f"\n建议:{'; '.join(analysis.remedies)}\n")
return "\n".join(parts)
def to_dict(self, analysis: DKAnalysis) -> Dict:
"""转换为字典(JSON可序列化)"""
return {
"dk_planet": analysis.dk_planet,
"dk_sign": analysis.dk_sign,
"dk_house": analysis.dk_house,
"dk_degree": round(analysis.dk_degree, 2),
"d9_sign": analysis.d9_sign,
"d9_house": analysis.d9_house,
"d9_dignity": analysis.d9_dignity,
"is_retrograde": analysis.is_retrograde,
"is_combust": analysis.is_combust,
"dignity": analysis.dignity,
"core_profile": analysis.core_profile,
"personality_traits": analysis.personality_traits,
"attracted_to": analysis.attracted_to,
"challenges": analysis.challenges,
"positive_traits": analysis.positive_traits,
"career_signs": analysis.career_signs,
"house_meaning": analysis.house_meaning,
"house_themes": analysis.house_themes,
"conjunctions": analysis.conjunctions,
"aspects_friendly": analysis.aspects_friendly,
"aspects_hostile": analysis.aspects_hostile,
"marriage_quality_score": round(analysis.marriage_quality_score, 2),
"timing_clues": analysis.timing_clues,
"remedies": analysis.remedies,
"narrative": analysis.narrative,
}
# ============================================================================
# 便捷函数
# ============================================================================
def analyze_darakaraka(chart_data: Dict, use_8_karaka: bool = True) -> Dict:
"""便捷函数:分析Darakaraka"""
reader = DarakarakaReader()
analysis = reader.analyze(chart_data, use_8_karaka)
return reader.to_dict(analysis)
# ============================================================================
# CLI 调试
# ============================================================================
if __name__ == "__main__":
# 模拟测试数据
mock_chart = {
"planets": {
"Sun": {"degree": 20.0, "degree_in_sign": 20.0, "sign": "Aries", "house": 1, "retrograde": False, "combust": False, "dignity": "exalted"},
"Moon": {"degree": 50.0, "degree_in_sign": 20.0, "sign": "Taurus", "house": 2, "retrograde": False},
"Mars": {"degree": 80.0, "degree_in_sign": 20.0, "sign": "Gemini", "house": 3, "retrograde": False},
"Mercury": {"degree": 110.0, "degree_in_sign": 20.0, "sign": "Cancer", "house": 4, "retrograde": False},
"Jupiter": {"degree": 140.0, "degree_in_sign": 20.0, "sign": "Leo", "house": 5, "retrograde": False},
"Venus": {"degree": 170.0, "degree_in_sign": 20.0, "sign": "Virgo", "house": 6, "retrograde": False},
"Saturn": {"degree": 200.0, "degree_in_sign": 20.0, "sign": "Libra", "house": 7, "retrograde": True},
"Rahu": {"degree": 230.0, "degree_in_sign": 20.0, "sign": "Scorpio", "house": 8, "retrograde": False},
},
"context": {
"navamsa_planets": {
"Saturn": {"sign": "Capricorn", "house": 10, "dignity": "own"}
}
}
}
print("=" * 60)
print("Darakaraka 深度解读引擎")
print("=" * 60)
result = analyze_darakaraka(mock_chart, use_8_karaka=True)
print(f"\nDK行星: {result['dk_planet']}")
print(f"DK星座: {result['dk_sign']}")
print(f"DK宫位: {result['dk_house']}")
print(f"\n核心画像: {result['core_profile']}")
print(f"\n婚姻质量评分: {result['marriage_quality_score']}")
print("\n" + "=" * 60)
print("完整叙事")
print("=" * 60)
print(result['narrative'])