huhan3000/胡汉三千年项目/分析工具/符号分析系统.py

493 lines
16 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 -*-
"""
符号传承分析系统
胡汉三千年项目核心分析工具
功能:实现符号的溯源分析、形义关联、跨文明对比等功能
"""
import json
import sqlite3
from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass
from enum import Enum
class YinYangAttribute(Enum):
"""阴阳属性枚举"""
YIN = "yin" # 阴
YANG = "yang" # 阳
NEUTRAL = "neutral" # 中性
class EngravingType(Enum):
"""刻法类型枚举"""
YIN_ENGRAVING = "yin_engraving" # 阴刻
YANG_ENGRAVING = "yang_engraving" # 阳刻
MIXED = "mixed" # 混合
class LinkType(Enum):
"""关联类型枚举"""
DIRECT_EVOLUTION = "direct_evolution" # 直接演化
FUNCTIONAL_PARALLEL = "functional_parallel" # 功能平行
STRUCTURAL_SIMILARITY = "structural_similarity" # 结构相似
PHONETIC_CORRESPONDENCE = "phonetic_correspondence" # 语音对应
@dataclass
class Symbol:
"""符号数据类"""
symbol_id: str
symbol_form: str
symbol_name: str
yin_yang_attribute: YinYangAttribute
engraving_type: EngravingType
origin_civilization: str
origin_period: str
description: str
@dataclass
class SymbolAttribute:
"""符号属性数据类"""
attribute_type: str
attribute_name: str
attribute_value: str
evidence_source: str
confidence_level: str
@dataclass
class CrossCivilizationLink:
"""跨文明关联数据类"""
source_symbol_id: str
target_symbol_id: str
link_type: LinkType
link_strength: str
transmission_path: str
historical_evidence: str
class SymbolAnalysisSystem:
"""符号分析系统主类"""
def __init__(self, db_path: str = "symbols.db"):
"""初始化分析系统"""
self.db_path = db_path
self.conn = None
self._init_database()
def _init_database(self):
"""初始化数据库"""
self.conn = sqlite3.connect(self.db_path)
self._create_tables()
self._load_sample_data()
def _create_tables(self):
"""创建数据库表"""
cursor = self.conn.cursor()
# 创建符号主表
cursor.execute("""
CREATE TABLE IF NOT EXISTS symbols (
symbol_id TEXT PRIMARY KEY,
symbol_form TEXT NOT NULL,
symbol_name TEXT,
yin_yang_attribute TEXT,
engraving_type TEXT,
origin_civilization TEXT,
origin_period TEXT,
description TEXT
)
""")
# 创建符号属性表
cursor.execute("""
CREATE TABLE IF NOT EXISTS symbol_attributes (
attribute_id INTEGER PRIMARY KEY AUTOINCREMENT,
symbol_id TEXT,
attribute_type TEXT,
attribute_name TEXT,
attribute_value TEXT,
evidence_source TEXT,
confidence_level TEXT,
FOREIGN KEY (symbol_id) REFERENCES symbols(symbol_id)
)
""")
# 创建跨文明关联表
cursor.execute("""
CREATE TABLE IF NOT EXISTS cross_civilization_links (
link_id INTEGER PRIMARY KEY AUTOINCREMENT,
source_symbol_id TEXT,
target_symbol_id TEXT,
link_type TEXT,
link_strength TEXT,
transmission_path TEXT,
historical_evidence TEXT,
FOREIGN KEY (source_symbol_id) REFERENCES symbols(symbol_id),
FOREIGN KEY (target_symbol_id) REFERENCES symbols(symbol_id)
)
""")
self.conn.commit()
def _load_sample_data(self):
"""加载示例数据"""
# 检查是否已有数据
cursor = self.conn.cursor()
cursor.execute("SELECT COUNT(*) FROM symbols")
if cursor.fetchone()[0] > 0:
return
# 加载核心符号数据
self._load_core_symbols()
def _load_core_symbols(self):
"""加载核心符号数据"""
cursor = self.conn.cursor()
# P类符号阴刻
p_symbols = [
("P_yin_001", "P", "拉丁字母P", "yin", "yin_engraving", "Greek", "8th century BCE",
"阴刻符号,象征凹陷、容纳的阴性特质"),
("Pi_yin_001", "Π", "希腊字母Pi", "yin", "yin_engraving", "Greek", "8th century BCE",
"阴刻符号,两竖一横形成凹槽结构"),
("Fu_gua_yin", "", "周易否卦", "yin", "yin_engraving", "Chinese", "Zhou Dynasty",
"天地否卦,上乾下坤,象征阴盛阳衰的凹陷状态")
]
# T类符号阳刻
t_symbols = [
("T_yang_001", "T", "拉丁字母T", "yang", "yang_engraving", "Greek", "8th century BCE",
"阳刻符号,象征凸起、支撑的阳性特质"),
("Tau_yang_001", "Τ", "希腊字母Tau", "yang", "yang_engraving", "Greek", "8th century BCE",
"阳刻符号,一横一竖形成立柱结构"),
("Tai_gua_yang", "", "周易泰卦", "yang", "yang_engraving", "Chinese", "Zhou Dynasty",
"地天泰卦,上坤下乾,象征阳盛阴衰的凸起状态")
]
# 插入符号数据
cursor.executemany("""
INSERT OR IGNORE INTO symbols VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""", p_symbols + t_symbols)
# 插入关联数据
links = [
("Fu_gua_yin", "Pi_yin_001", "functional_parallel", "strong",
"周易→希腊文明交流", "阴阳观的功能对应"),
("Pi_yin_001", "P_yin_001", "direct_evolution", "strong",
"希腊字母→拉丁字母演化", "字母形态的直接继承"),
("Tai_gua_yang", "Tau_yang_001", "functional_parallel", "strong",
"周易→希腊文明交流", "阴阳观的功能对应"),
("Tau_yang_001", "T_yang_001", "direct_evolution", "strong",
"希腊字母→拉丁字母演化", "字母形态的直接继承")
]
cursor.executemany("""
INSERT OR IGNORE INTO cross_civilization_links
(source_symbol_id, target_symbol_id, link_type, link_strength, transmission_path, historical_evidence)
VALUES (?, ?, ?, ?, ?, ?)
""", links)
self.conn.commit()
def trace_symbol_origin(self, symbol_id: str) -> List[Tuple[str, str, str]]:
"""
追踪符号的起源和传播路径
Args:
symbol_id: 符号ID
Returns:
List of (symbol_id, civilization, period) tuples representing the transmission path
"""
cursor = self.conn.cursor()
# 使用递归查询追踪传播路径
query = """
WITH RECURSIVE symbol_path AS (
SELECT s.symbol_id, s.origin_civilization, s.origin_period, 0 as depth
FROM symbols s
WHERE s.symbol_id = ?
UNION ALL
SELECT s.symbol_id, s.origin_civilization, s.origin_period, sp.depth + 1
FROM symbols s
JOIN cross_civilization_links l ON s.symbol_id = l.target_symbol_id
JOIN symbol_path sp ON l.source_symbol_id = sp.symbol_id
WHERE sp.depth < 10 -- 防止无限递归
)
SELECT symbol_id, origin_civilization, origin_period
FROM symbol_path
ORDER BY depth DESC
"""
cursor.execute(query, (symbol_id,))
return cursor.fetchall()
def analyze_yin_yang_correspondence(self, symbol_id: str) -> Dict:
"""
分析符号的阴阳对应关系
Args:
symbol_id: 符号ID
Returns:
包含阴阳分析结果的字典
"""
cursor = self.conn.cursor()
# 获取符号基本信息
cursor.execute("""
SELECT symbol_form, symbol_name, yin_yang_attribute, engraving_type, description
FROM symbols
WHERE symbol_id = ?
""", (symbol_id,))
result = cursor.fetchone()
if not result:
return {"error": "Symbol not found"}
symbol_form, symbol_name, yin_yang, engraving_type, description = result
# 分析阴阳属性
analysis = {
"symbol_id": symbol_id,
"symbol_form": symbol_form,
"symbol_name": symbol_name,
"yin_yang_attribute": yin_yang,
"engraving_type": engraving_type,
"description": description,
"opposite_symbols": [],
"similar_symbols": [],
"geographical_correspondences": []
}
# 寻找对立符号
opposite_yin_yang = "yang" if yin_yang == "yin" else "yin"
cursor.execute("""
SELECT symbol_id, symbol_form, symbol_name
FROM symbols
WHERE yin_yang_attribute = ?
LIMIT 5
""", (opposite_yin_yang,))
analysis["opposite_symbols"] = [
{"symbol_id": row[0], "form": row[1], "name": row[2]}
for row in cursor.fetchall()
]
# 寻找相似符号
cursor.execute("""
SELECT symbol_id, symbol_form, symbol_name
FROM symbols
WHERE yin_yang_attribute = ? AND symbol_id != ?
LIMIT 5
""", (yin_yang, symbol_id))
analysis["similar_symbols"] = [
{"symbol_id": row[0], "form": row[1], "name": row[2]}
for row in cursor.fetchall()
]
return analysis
def find_cross_civilization_parallels(self, symbol_id: str) -> List[Dict]:
"""
寻找跨文明的平行符号
Args:
symbol_id: 符号ID
Returns:
平行符号列表
"""
cursor = self.conn.cursor()
# 获取当前符号的属性
cursor.execute("""
SELECT yin_yang_attribute, engraving_type
FROM symbols
WHERE symbol_id = ?
""", (symbol_id,))
result = cursor.fetchone()
if not result:
return []
yin_yang, engraving_type = result
# 寻找具有相同阴阳属性和刻法类型的符号
cursor.execute("""
SELECT s.symbol_id, s.symbol_form, s.symbol_name, s.origin_civilization, s.origin_period
FROM symbols s
WHERE s.yin_yang_attribute = ? AND s.engraving_type = ? AND s.symbol_id != ?
ORDER BY s.origin_period
""", (yin_yang, engraving_type, symbol_id))
parallels = []
for row in cursor.fetchall():
parallels.append({
"symbol_id": row[0],
"form": row[1],
"name": row[2],
"civilization": row[3],
"period": row[4]
})
return parallels
def create_symbol_family_tree(self, base_symbol_id: str) -> Dict:
"""
创建符号家族树
Args:
base_symbol_id: 基础符号ID
Returns:
符号家族树结构
"""
cursor = self.conn.cursor()
# 获取基础符号信息
cursor.execute("""
SELECT symbol_form, symbol_name, origin_civilization, origin_period
FROM symbols
WHERE symbol_id = ?
""", (base_symbol_id,))
base_info = cursor.fetchone()
if not base_info:
return {"error": "Base symbol not found"}
family_tree = {
"base_symbol": {
"id": base_symbol_id,
"form": base_info[0],
"name": base_info[1],
"civilization": base_info[2],
"period": base_info[3]
},
"ancestors": [],
"descendants": [],
"parallels": []
}
# 寻找祖先符号(来源)
cursor.execute("""
SELECT s.symbol_id, s.symbol_form, s.symbol_name, s.origin_civilization, s.origin_period
FROM symbols s
JOIN cross_civilization_links l ON s.symbol_id = l.source_symbol_id
WHERE l.target_symbol_id = ? AND l.link_type = 'direct_evolution'
""", (base_symbol_id,))
for row in cursor.fetchall():
family_tree["ancestors"].append({
"id": row[0], "form": row[1], "name": row[2],
"civilization": row[3], "period": row[4]
})
# 寻找后代符号(演化)
cursor.execute("""
SELECT s.symbol_id, s.symbol_form, s.symbol_name, s.origin_civilization, s.origin_period
FROM symbols s
JOIN cross_civilization_links l ON s.symbol_id = l.target_symbol_id
WHERE l.source_symbol_id = ? AND l.link_type = 'direct_evolution'
""", (base_symbol_id,))
for row in cursor.fetchall():
family_tree["descendants"].append({
"id": row[0], "form": row[1], "name": row[2],
"civilization": row[3], "period": row[4]
})
# 寻找平行符号
family_tree["parallels"] = self.find_cross_civilization_parallels(base_symbol_id)
return family_tree
def export_analysis_report(self, symbol_id: str, output_format: str = "json") -> str:
"""
导出符号分析报告
Args:
symbol_id: 符号ID
output_format: 输出格式json/markdown
Returns:
分析报告内容
"""
# 获取各种分析结果
origin_path = self.trace_symbol_origin(symbol_id)
yin_yang_analysis = self.analyze_yin_yang_correspondence(symbol_id)
family_tree = self.create_symbol_family_tree(symbol_id)
# 符号基本信息
cursor = self.conn.cursor()
cursor.execute("SELECT * FROM symbols WHERE symbol_id = ?", (symbol_id,))
symbol_info = cursor.fetchone()
if output_format == "json":
report = {
"symbol_info": dict(zip([col[0] for col in cursor.description], symbol_info)),
"origin_path": origin_path,
"yin_yang_analysis": yin_yang_analysis,
"family_tree": family_tree
}
return json.dumps(report, ensure_ascii=False, indent=2)
elif output_format == "markdown":
markdown_report = f"""# 符号分析报告:{symbol_id}
## 符号基本信息
- **符号形态**: {symbol_info[1]}
- **符号名称**: {symbol_info[2]}
- **阴阳属性**: {symbol_info[3]}
- **刻法类型**: {symbol_info[4]}
- **起源文明**: {symbol_info[5]}
- **起源时期**: {symbol_info[6]}
- **描述**: {symbol_info[7]}
## 起源传播路径
"""
for i, (sym_id, civ, period) in enumerate(origin_path):
markdown_report += f"{i+1}. {sym_id} ({civ}, {period})\n"
markdown_report += f"""
## 阴阳对应分析
- **对立符号**: {len(yin_yang_analysis.get('opposite_symbols', []))}
- **相似符号**: {len(yin_yang_analysis.get('similar_symbols', []))}
## 符号家族树
- **祖先符号**: {len(family_tree.get('ancestors', []))}
- **后代符号**: {len(family_tree.get('descendants', []))}
- **平行符号**: {len(family_tree.get('parallels', []))}
"""
return markdown_report
else:
return "Unsupported output format"
# 使用示例
def main():
"""主函数示例"""
# 创建分析系统
analyzer = SymbolAnalysisSystem()
# 分析P符号
print("=== P符号分析 ===")
p_analysis = analyzer.analyze_yin_yang_correspondence("P_yin_001")
print(json.dumps(p_analysis, ensure_ascii=False, indent=2))
# 追踪P符号起源
print("\n=== P符号起源追踪 ===")
p_origin = analyzer.trace_symbol_origin("P_yin_001")
for sym_id, civ, period in p_origin:
print(f"{sym_id}: {civ} ({period})")
# 导出分析报告
print("\n=== P符号分析报告 ===")
report = analyzer.export_analysis_report("P_yin_001", "markdown")
print(report)
if __name__ == "__main__":
main()