Spaces:
Sleeping
Sleeping
from fastapi import APIRouter, Request | |
from schema import PredictData | |
from collections import defaultdict | |
from utils import compute_normalized_score | |
import torch | |
import json | |
router = APIRouter(prefix="/predict") | |
async def predict_english(request: Request, data: PredictData): | |
transcripts_by_competency = defaultdict(list) | |
for q in data.questions: | |
transcripts_by_competency[q.competency_id].append(q.transcript) | |
sorted_competencies = sorted(data.competency_sets, key=lambda c: c.competency_id) | |
ordered_transcripts = [ | |
" ".join(transcripts_by_competency.get(comp.competency_id, [])) | |
for comp in sorted_competencies | |
] | |
ordered_competence_sets = [comp.descriptions for comp in sorted_competencies] | |
print("Calculating scores with these inputs:\n") | |
print( | |
f"Ordered transcript: {json.dumps(ordered_transcripts, indent=4, ensure_ascii=False)}\n" | |
) | |
print( | |
f"Ordered competence sets: {json.dumps(ordered_competence_sets, indent=4, ensure_ascii=False)}\n" | |
) | |
english_scoring_model = request.app.state.english_scoring_model | |
with torch.no_grad(): | |
raw_scores = english_scoring_model(ordered_transcripts, ordered_competence_sets) | |
final_scores = [] | |
for score_array, comp_descriptions in zip( | |
raw_scores.tolist(), ordered_competence_sets | |
): | |
expected_levels = len(comp_descriptions) | |
normalized_score = compute_normalized_score(score_array, expected_levels) | |
final_scores.append(normalized_score) | |
raw_list = raw_scores.tolist() | |
details = [] | |
for comp, score_array in zip(sorted_competencies, raw_list): | |
k = len(comp.descriptions) | |
details.append( | |
{"competency_id": comp.competency_id, "scores": score_array[: k + 1]} | |
) | |
return { | |
"score": sum(final_scores) / len(final_scores), | |
"details": details, | |
} | |
async def predict_indonesian(request: Request, data: PredictData): | |
transcripts_by_competency = defaultdict(list) | |
for q in data.questions: | |
transcripts_by_competency[q.competency_id].append(q.transcript) | |
sorted_competencies = sorted(data.competency_sets, key=lambda c: c.competency_id) | |
ordered_transcripts = [ | |
" ".join(transcripts_by_competency.get(comp.competency_id, [])) | |
for comp in sorted_competencies | |
] | |
ordered_competence_sets = [comp.descriptions for comp in sorted_competencies] | |
print("Calculating scores with these inputs:\n") | |
print( | |
f"Ordered transcript: {json.dumps(ordered_transcripts, indent=4, ensure_ascii=False)}\n" | |
) | |
print( | |
f"Ordered competence sets: {json.dumps(ordered_competence_sets, indent=4, ensure_ascii=False)}\n" | |
) | |
indonesian_scoring_model = request.app.state.indonesian_scoring_model | |
with torch.no_grad(): | |
raw_scores = indonesian_scoring_model( | |
ordered_transcripts, ordered_competence_sets | |
) | |
final_scores = [] | |
for score_array, comp_descriptions in zip( | |
raw_scores.tolist(), ordered_competence_sets | |
): | |
expected_levels = len(comp_descriptions) | |
normalized_score = compute_normalized_score(score_array, expected_levels) | |
final_scores.append(normalized_score) | |
raw_list = raw_scores.tolist() | |
details = [] | |
for comp, score_array in zip(sorted_competencies, raw_list): | |
k = len(comp.descriptions) | |
details.append( | |
{"competency_id": comp.competency_id, "scores": score_array[: k + 1]} | |
) | |
return { | |
"score": sum(final_scores) / len(final_scores), | |
"details": details, | |
} | |