493 lines
16 KiB
Python
493 lines
16 KiB
Python
#!/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() |