Python 实现错题归因:OCR 识别 + 错因分类,从 0 到 1

发布时间:2026/8/10 8:59:43
Python 实现错题归因:OCR 识别 + 错因分类,从 0 到 1 教育场景里有个高频需求学生做错题系统要判断他是概念没懂还是粗心算错。归因不同推荐的学习内容完全不同。这篇文章用 Python 带你从 0 到 1 搭一条可落地的错题归因流水线OCR → 特征 → 双通道分类 → 归因输出。一、数据与标签体系先把问题定义清楚。错题归因是文本分类任务输入题干、学生作答、标准答案输出错因标签。# 错因标签体系与教学端对齐 ERROR_TYPES [概念型, 方法型, 执行型, 审题型] # 一条训练样本 sample { question: 计算3/4 1/6, answer: 3/4 1/6 3/10, solution: 3/4 1/6 9/12 2/12 11/12, error_type: 概念型, # 不理解通分 }二、OCR 文本提取拍照错题先走 OCR。数学场景重点是公式识别转 LaTeX和手写纠错。def ocr_extract(image_path: str) - dict: OCR 提取题干、作答、答案。返回结构化文本。 # 实践版面分析 公式识别 手写识别 # 常用方案PaddleOCR中文 公式识别模型 # 这里演示接口真实实现按所选引擎对接 return { question: 计算3/4 1/6, answer: 3/4 1/6 3/10, solution: 3/4 1/6 11/12, }OCR 不求全对——后续特征工程对噪声有容忍度关键是能用的文本特征要提取出来。三、特征工程对每个错题样本抽三类特征文本相似度、作答结构、题目元数据。from difflib import SequenceMatcher def extract_features(sample: dict) - dict: q, a, s sample[question], sample[answer], sample[solution] # 1) 作答与标准答案的相似度字符级 sim SequenceMatcher(None, a, s).ratio() # 2) 作答是否为空 / 是否只写了答案 is_blank len(a.strip()) 3 # 3) 答案部分是否一致取数字/公式部分 import re nums_a re.findall(r\d, a) nums_s re.findall(r\d, s) num_match nums_a nums_s return { similarity: round(sim, 3), is_blank: int(is_blank), num_match: int(num_match), # 元数据章节、题型、难度来自题库 chapter: sample.get(chapter, ), }关键特征is_blank答案空 → 概念未掌握概率高、similarity低相似度且数字不匹配 → 概念/方法问题、num_match数字对但算式错 → 执行型/粗心。四、双通道分类通道一规则规则小而准抓硬特征。def rule_based(f: dict) - dict: if f[is_blank]: return {label: 概念型, confidence: 0.9} if f[num_match] and f[similarity] 0.7: return {label: 执行型, confidence: 0.8} return {label: None, confidence: 0.0}通道二模型模型大而全兜底。从轻量模型起步TF-IDF 逻辑回归。from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression def train_model(train_samples): texts [s[question] s[answer] for s in train_samples] labels [s[error_type] for s in train_samples] vec TfidfVectorizer(analyzerchar_wb, ngram_range(1, 3)) X vec.fit_transform(texts) clf LogisticRegression(max_iter1000) clf.fit(X, labels) return vec, clf融合规则给出强信号采信规则否则采信模型。def classify(sample: dict, vec, clf) - str: f extract_features(sample) r rule_based(f) if r[confidence] 0.8: return r[label] X vec.transform([sample[question] sample[answer]]) return clf.predict(X)[0]五、知识点映射与输出分类结果落到具体知识点才是完整的归因。KNOWLEDGE_MAP { 分数的通分: {error_types: [概念型, 执行型]}, } def output(question: str, label: str) - dict: # 按题干/章节查知识点映射表 kp 分数的通分 # 示例由映射表查询 return { error_type: label, knowledge_point: kp, confidence: 0.87, suggestion: 补概念课最小公倍数与通分, }六、评估三个指标分类准确率对照教师标注、归因一致性、业务指标推荐内容点击/完成率。经验先做小样本人工标注集每类 50~100 条规则模型一起评再决定是否升级 BERT/大模型。教育数据敏感评估集必须人工标注。总结从 0 到 1 实现错题归因核心四步OCR提取可用文本不求全对特征工程相似度 作答结构 元数据双通道分类规则小而准 模型大而全知识点映射分类 知识点 可落地的归因输出。先把流水线跑通再用真实标注数据迭代错题归因就能从猜变成算。实战参考错题透镜团队在 K12 错题归因中正是用这套双通道方案——规则抓硬特征、TF-IDF 逻辑回归兜底先跑通流水线再迭代升级避免一上来就上大模型的成本陷阱。相关阅读K12错题归因算法解析从OCR识别到知识图谱定位大模型如何判断 K12 错题错在概念还是执行一个错因归因的工程视角工程落地案例错题透镜多题错因诊断工具即用此思路实现多题归因——把多道错题一并上传先 OCR 提取再按上面代码走特征双通道分类最终落到知识点级建议。FAQQ错题归因代码从哪入手A先从最小闭环开始OCR 提取文本 → 特征工程similarity/is_blank/num_match→ TF-IDF逻辑回归分类 → 知识点映射。用 Python 几十行就能跑通。Q轻量模型够用吗A够。TF-IDF逻辑回归在文本分类上性价比很高A先跑通流水线再用教师标注集评估确认需要再升级 BERT/大模型兜底。参考[1] Karpicke, J. D., Roediger, H. L. (2008). Retrieval Practice Produces More Learning.Science. DOI:10.1126/science.1152408[2] Dunlosky, J., et al. (2013). Strengthening the Student Toolbox.Perspectives on Psychological Science. DOI:10.1177/1529100612453266[3] Vaswani, A., et al. (2017). Attention Is All You Need.NeurIPS.