File size: 5,518 Bytes
37e65d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# aee_explainer_era.py
# AEE Era Sürümü: Önermenin epistemik durumu hakkında plausibility dahil açıklama üretir.

from typing import Dict, List, Optional, Any

# Era sürümündeki sınıfları ve utils'i import et
try:
    from aee_core_classes_era import Proposition
    from aee_utils import get_proposition_by_id, get_linked_propositions
except ImportError:
    print("Error: Could not import dependencies from aee_core_classes_era.py or aee_utils.py.")
    Proposition = None

# --- Açıklama Üretme Fonksiyonu (Era) ---

def generate_explanation_era(prop_id: str, kb: Dict[str, Proposition]) -> str:
    """

    Verilen ID'ye sahip önermenin epistemik durumu hakkında (Plausibility dahil)

    insan tarafından okunabilir bir açıklama metni üretir.

    """
    if not Proposition: return "Error: Proposition class not available."

    prop = get_proposition_by_id(prop_id, kb)
    if not prop:
        return f"Error: Proposition with ID '{prop_id}' not found in the Knowledge Base."

    ep_data = prop.epistemic_data

    # Bağlantıları al
    supporters = get_linked_propositions(prop_id, kb, link_type='supports')
    contradictors = get_linked_propositions(prop_id, kb, link_type='contradicts')

    # Metin parçalarını oluştur (Era versiyonu)
    explanation_lines = []
    explanation_lines.append(f"--- Epistemic Explanation (Era) for Proposition ID: {prop.prop_id[:8]} ---")
    explanation_lines.append(f"Statement        : '{prop.text_span}'")
    explanation_lines.append(f"Extracted Struct : {'[NEGATED] ' if prop.is_negated else ''}"
                             f"{prop.subject_lemma} - {prop.relation_lemma} - {prop.value_lemma}")
    explanation_lines.append("-" * 20)
    explanation_lines.append(f"Source           : {ep_data.source_id} (Type: {ep_data.source_type or 'N/A'})")
    explanation_lines.append(f"Timestamp        : {ep_data.timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
    explanation_lines.append(f"Source Reliability: {ep_data.reliability_score:.2f}" if ep_data.reliability_score is not None else "N/A")
    # Plausibility bilgilerini ekle
    explanation_lines.append(f"Plausibility Score: {ep_data.plausibility_score:.2f}" if ep_data.plausibility_score is not None else "N/A")
    explanation_lines.append(f"Validation Notes : [{', '.join(ep_data.validation_notes) if ep_data.validation_notes else 'None'}]")
    explanation_lines.append(f"Confidence Score : {ep_data.computed_confidence:.3f} (Initial: {ep_data.initial_confidence:.2f})")
    explanation_lines.append("-" * 20)
    explanation_lines.append(f"Supporting Props ({len(supporters)}): "
                             f"[{', '.join([p.prop_id[:8] for p in supporters]) if supporters else 'None'}]")
    explanation_lines.append(f"Contradicting Props ({len(contradictors)}): "
                             f"[{', '.join([p.prop_id[:8] for p in contradictors]) if contradictors else 'None'}]")
    explanation_lines.append("-" * 20)
    explanation_lines.append(f"Potential Bias Flags: "
                             f"[{', '.join(ep_data.bias_flags) if ep_data.bias_flags else 'None'}]")
    explanation_lines.append("--- End of Explanation ---")

    return "\n".join(explanation_lines)


# --- Test Bloğu ---
if __name__ == "__main__":
    print("Testing AEE Explainer Module (Era Version)...")

    if Proposition:
        from aee_core_classes_era import EpistemicData # Era class'ını import et
        print("Creating a mock Knowledge Base for Era explainer testing...")
        kb_test: Dict[str, Proposition] = {}

        # Örnek önermeler (plausibility ve notlar dahil)
        ed1 = EpistemicData(source_id="src1:news.com", initial_confidence=0.8, computed_confidence=0.85, reliability_score=0.7, source_type='news')
        prop1 = Proposition("sky is blue", "sky is blue", ed1, "sky", "be", "blue", False)
        prop1.epistemic_data.plausibility_score = 0.95 # Manuel test plausibility

        ed2 = EpistemicData(source_id="src2:user_blog", initial_confidence=0.4, computed_confidence=0.2, reliability_score=0.3, source_type='blog')
        prop2 = Proposition("sky is green", "sky is green", ed2, "sky", "be", "green", False)
        prop2.epistemic_data.plausibility_score = 0.15 # Manuel test plausibility
        prop2.epistemic_data.validation_notes.append("Low plausibility based on common knowledge")
        prop2.epistemic_data.bias_flags.append("UNCOMMON_CLAIM")

        # Manuel link ekleyelim (örnek amaçlı)
        prop1.epistemic_data.contradicts.append(prop2.prop_id) # Gerçekte bunlar çelişmez ama test için ekleyelim
        prop2.epistemic_data.contradicts.append(prop1.prop_id)

        kb_test[prop1.prop_id] = prop1
        kb_test[prop2.prop_id] = prop2
        print(f"Mock KB created with {len(kb_test)} propositions.")

        # Test 1: Açıklama üretme (prop1 için)
        print("\n--- Generating Explanation for Prop 1 (Era) ---")
        explanation1 = generate_explanation_era(prop1.prop_id, kb_test)
        print(explanation1)

        # Test 2: Açıklama üretme (prop2 için - plausibility düşük)
        print("\n--- Generating Explanation for Prop 2 (Era - Low Plausibility) ---")
        explanation2 = generate_explanation_era(prop2.prop_id, kb_test)
        print(explanation2)
    else:
        print("Could not run tests because Proposition class import failed.")

    print("\nExplainer module (Era) testing complete.")