Spaces:
Running
Running
File size: 3,681 Bytes
bf3184f 3515f11 bf3184f 3515f11 bf3184f 3515f11 bf3184f |
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 |
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")
@router.post("/english")
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,
}
@router.post("/indonesian")
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,
}
|