Spaces:
Sleeping
Sleeping
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
|