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