File size: 4,541 Bytes
c3af845
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
101
102
103
104
105
106
# ui/format.py

from string import Template

class ResultFormatter:
    @staticmethod
    def format_entity_list(entities, entity_type):
        items = entities.get(entity_type, [])
        if not items:
            return '<li>None detected</li>'
        return ''.join(f'<li>{item}</li>' for item in items)

    @staticmethod
    def format_entity_relationships(relationships):
        if not relationships:
            return ''
        
        items = []
        for rel in relationships:
            item = f"""
            <li class="mb-2">
                <strong>{rel['source']}</strong> &rarr;
                <span class="text-blue-600">{rel['type'].replace('_to_', ' to ')}</span> &rarr;
                <strong>{rel['target']}</strong>
                <br/>
                <small class="text-gray-600">Confidence: {int(rel['confidence'] * 100)}%</small>
            </li>
            """
            items.append(item)
        return ''.join(items)

    @staticmethod
    def format_related_events(events):
        if not events:
            return ''
            
        items = []
        for event in events:
            shared = f" | Shared Entities: {event['shared_entities']}" if event.get('shared_entities') else ''
            item = f"""
            <li class="mb-2">
                <div class="flex justify-between items-center">
                    <div>{event['text']}</div>
                    <div class="text-sm text-gray-600">
                        {event['timestamp']} | 
                        Confidence: {int(event['confidence'] * 100)}%{shared}
                    </div>
                </div>
            </li>
            """
            items.append(item)
        return ''.join(items)

    @staticmethod
    def format_results(analysis_result):
        if "error" in analysis_result:
            return f"<div style='color: red'>Error: {analysis_result['error']}</div>"
        
        # Load template
        with open('templates/results.html', 'r') as f:
            template = Template(f.read())
        
        # Prepare template variables
        confidence = analysis_result['confidence']
        confidence_class = "confidence-high" if confidence >= 0.6 else "confidence-low"
        
        return template.substitute(
            confidence_class=confidence_class,
            confidence_score=int(confidence * 100),
            verification_warning=ResultFormatter._verification_warning(analysis_result),
            people_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'people'),
            org_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'organizations'),
            location_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'locations'),
            temporal_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'temporal'),
            hashtag_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'hashtags'),
            entity_relationships=ResultFormatter.format_entity_relationships(analysis_result.get('entity_relationships')),
            validation_success=ResultFormatter._validation_success(analysis_result),
            related_events=ResultFormatter.format_related_events(analysis_result.get('related_events')),
            base_confidence=int(confidence * 70),
            entity_boost=int((confidence - 0.7 if confidence > 0.7 else 0) * 100),
            types_detected=len([t for t in ['people', 'organizations', 'locations', 'temporal', 'hashtags'] 
                              if analysis_result['entities'].get(t)]),
            total_entities=sum(len(e) for e in analysis_result['entities'].values() if isinstance(e, list)),
            direct_relationships=len(analysis_result.get('entity_relationships', [])),
            related_event_count=len(analysis_result.get('related_events', []))
        )

    @staticmethod
    def _verification_warning(result):
        if not result["verification_needed"]:
            return ''
        return '''
        <div class="alert-warning">
            &#9888; <strong>Verification Required:</strong> Low confidence score detected. Please verify the extracted information.
        </div>
        '''

    @staticmethod
    def _validation_success(result):
        if result["verification_needed"]:
            return ''
        return '''
        <div class="alert-success mt-4">
            &#9989; <strong>Event Validated:</strong> The extracted information meets confidence thresholds.
        </div>
        '''