更新文档系统归并优化方案
This commit is contained in:
493
胡汉三千年项目/分析工具/符号分析系统.py
Normal file
493
胡汉三千年项目/分析工具/符号分析系统.py
Normal file
@@ -0,0 +1,493 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user