bacpilot-backend / app /services /classifier.py
debpc
Initial BacPilot backend MVP pipeline
5ffcd9d
Raw
History Blame Contribute Delete
2.55 kB
from app.core.taxonomy import AnswerType, Chapter, Level, Subject
from app.schemas.classification import ClassificationResult
CHAPTER_KEYWORDS: tuple[tuple[Chapter, tuple[str, ...]], ...] = (
(
Chapter.DERIVATION,
(
"dérivée",
"derivee",
"dérivable",
"derivable",
"dériver",
"derive",
"f'(x)",
"f’(x)",
"signe de la dérivée",
"signe de f'",
"tableau de variation",
),
),
(
Chapter.LIMITES,
(
"limite",
"tend vers",
"infini",
"+∞",
"-∞",
"asymptote",
),
),
(
Chapter.SUITES,
(
"suite",
"u_n",
"un+1",
"récurrence",
"recurrence",
"arithmétique",
"géométrique",
),
),
(
Chapter.FONCTIONS,
(
"fonction",
"image",
"antécédent",
"ensemble de définition",
"courbe",
),
),
)
def detect_answer_type(answer_text: str) -> AnswerType:
if "\\" in answer_text or "$" in answer_text:
return AnswerType.LATEX_SIMPLE
if any(marker in answer_text for marker in ("#", "-", "*", "`")):
return AnswerType.MARKDOWN
return AnswerType.TEXTE
def classify_submission_answer(answer_text: str) -> ClassificationResult:
normalized = answer_text.lower()
detected_chapter = Chapter.FONCTIONS
confidence = 0.55
skill = "raisonner sur une fonction"
for chapter, keywords in CHAPTER_KEYWORDS:
if any(keyword in normalized for keyword in keywords):
detected_chapter = chapter
confidence = 0.82
if chapter == Chapter.DERIVATION:
skill = "calculer une dérivée et exploiter son signe"
elif chapter == Chapter.LIMITES:
skill = "calculer une limite"
elif chapter == Chapter.SUITES:
skill = "étudier une suite numérique"
else:
skill = "étudier une fonction"
break
return ClassificationResult(
subject=Subject.MATHEMATIQUES,
level=Level.DEUXIEME_BAC_SCIENCES,
chapter=detected_chapter,
skill=skill,
answer_type=detect_answer_type(answer_text),
language="fr",
confidence=confidence,
reject_reason=None,
)