File size: 6,310 Bytes
e82eaee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
"""Model comparison utilities."""
import utils


def select_best_model_result(model_results: dict, similarity_threshold: int = 90):
    """

    Параўноўвае вынікі ўсіх мадэлей і выбірае лепшы вынік.

    

    Args:

        model_results: Слоўнік {model_name: {"hyp_text": ..., "score": ..., "norm_ref": ..., "norm_hyp": ...}}

        similarity_threshold: Парог для вызначэння карэктнасці

    

    Returns:

        Tuple (best_model_name, best_result_dict)

    """
    if not model_results:
        return None, None
    
    best_model = None
    best_result = None
    best_score = -1
    
    for model_name, result in model_results.items():
        score = result.get('score', 0)
        if score > best_score:
            best_score = score
            best_model = model_name
            best_result = result
    
    return best_model, best_result


def compare_two_models(model_results: dict, model1: str, model2: str):
    """

    Параўноўвае вынікі двух канкрэтных мадэлей.

    

    Args:

        model_results: Слоўнік з вынікамі ўсіх мадэлей

        model1: Назва першай мадэлі

        model2: Назва другой мадэлі

    

    Returns:

        Слоўнік з параўнаннем: {"model1": ..., "model2": ..., "winner": ..., "score_diff": ...}

    """
    result1 = model_results.get(model1)
    result2 = model_results.get(model2)
    
    if not result1 and not result2:
        return {"error": "Абедзве мадэлі не знойдзены"}
    if not result1:
        return {"winner": model2, "model1": None, "model2": result2, "score_diff": None}
    if not result2:
        return {"winner": model1, "model1": result1, "model2": None, "score_diff": None}
    
    score1 = result1.get('score', 0)
    score2 = result2.get('score', 0)
    score_diff = abs(score1 - score2)
    
    if score1 > score2:
        winner = model1
    elif score2 > score1:
        winner = model2
    else:
        winner = "tie"
    
    return {
        "model1": {"name": model1, **result1},
        "model2": {"name": model2, **result2},
        "winner": winner,
        "score_diff": score_diff
    }


def get_all_model_comparison(record: dict):
    """

    Атрымлівае поўнае параўнанне вынікаў усіх мадэлей для запісу.

    

    Args:

        record: Запіс з global_results

    

    Returns:

        Слоўнік з усімі параўнаннямі і лепшым вынікам

    """
    model_results = record.get('model_results', {})
    
    if not model_results:
        return {
            "models_count": 0,
            "best_model": None,
            "comparisons": [],
            "all_scores": {}
        }
    
    best_model, best_result = select_best_model_result(model_results)
    
    # Стварыць усе парныя параўнанні
    models = list(model_results.keys())
    comparisons = []
    
    for i in range(len(models)):
        for j in range(i + 1, len(models)):
            comparison = compare_two_models(model_results, models[i], models[j])
            comparisons.append(comparison)
    
    # Сабраць усе скоры
    all_scores = {model: result.get('score', 0) for model, result in model_results.items()}
    
    return {
        "models_count": len(models),
        "best_model": best_model,
        "best_result": best_result,
        "comparisons": comparisons,
        "all_scores": all_scores
    }


def find_best_model_pair(record: dict, ref_text: str):
    """

    Знаходзіць пару крыніц з найлепшым супадзеннем ПАМІЖ САБОЙ.

    

    Args:

        record: Запіс з global_results

        ref_text: Арыгінальны тэкст для параўнання

    

    Returns:

        Слоўнік з інфармацыяй пра лепшую пару

    """
    model_results = record.get('model_results', {})
    
    if not model_results or len(model_results) < 2:
        return None
    
    # Параўнаць усе пары крыніц паміж сабой і знайсці найлепшае супадзенне
    sources = list(model_results.items())
    best_pair = None
    best_pair_similarity = -1
    
    for i in range(len(sources)):
        for j in range(i + 1, len(sources)):
            m1_name, m1_result = sources[i]
            m2_name, m2_result = sources[j]
            
            m1_hyp = m1_result.get('hyp_text', '')
            m2_hyp = m2_result.get('hyp_text', '')
            
            # Вылічыць падабенства паміж двума гіпотэзамі
            pair_similarity, _, _ = utils.calculate_similarity(m1_hyp, m2_hyp)
            
            if pair_similarity > best_pair_similarity:
                best_pair_similarity = pair_similarity
                m1_ref_score = m1_result.get('score', 0)
                m2_ref_score = m2_result.get('score', 0)
                
                # Выбраць лепшы тэкст (той, што мае вышэйшы скор з арыгіналам)
                if m1_ref_score >= m2_ref_score:
                    best_hyp = m1_hyp
                    best_model = m1_name
                    best_score = m1_ref_score
                else:
                    best_hyp = m2_hyp
                    best_model = m2_name
                    best_score = m2_ref_score
                
                best_pair = {
                    "model1": m1_name,
                    "model2": m2_name,
                    "model1_hyp": m1_hyp,
                    "model2_hyp": m2_hyp,
                    "model1_score": m1_ref_score,
                    "model2_score": m2_ref_score,
                    "pair_similarity": pair_similarity,
                    "best_hyp": best_hyp,
                    "best_model": best_model,
                    "best_score": best_score
                }
    
    return best_pair