在教育数字化转型的背景下如何科学、客观地评价课堂教学质量尤其是师生对话的质量成为教育研究者和一线教师关注的核心问题。传统的课堂评价多依赖人工观察和主观判断存在效率低、标准不统一等问题。本文将介绍一款基于 OpenAI API 构建的课堂话语功能分析系统该系统能够自动对课堂对话文本进行分类、统计和可视化分析为课堂教学评价提供量化依据。一、系统设计思路1. 核心目标构建一套自动化的课堂话语功能分析体系将师生对话文本按照预设的分类体系进行精准分类对比优质课堂的话语功能指标生成可视化图表和专业分析报告帮助教师和研究者快速把握课堂对话的特点和不足。2. 分类体系构建系统采用四级分类体系将课堂话语功能划分为 4 个一级指标和 12 个二级指标覆盖知识理解、表达交流、实践应用、创造迁移四大维度表格一级指标二级指标知识理解观察记忆、概括理解、说明论证表达交流经历经验、主观看法、情感态度实践应用分析计算、推测解释、简单问题解决创造迁移综合问题解决、猜想探究、发现创新同时系统内置了优质课堂话语功能的基准比例为对比分析提供参照标准。二、核心功能实现1. 数据预处理模块系统首先读取包含 角色 和 内容 的 CSV 格式课堂对话数据进行以下预处理数据校验检查必要列是否存在处理空值文本分割将长文本按中文标点符号分割为独立句子预过滤自动跳过无分析价值的语句如师生问候、简单指令、重复评价等角色保留保留 教师 / 学生 等角色信息便于后续分析def load_csv_content_with_roles(self): 从CSV文件加载对话内容并保留角色信息 try: # 读取CSV文件 df pd.read_csv(self.csv_path, encodingutf-8) # 检查必要的列是否存在 if 角色 not in df.columns or 内容 not in df.columns: raise ValueError(CSV文件中缺少角色或内容列) # 提取角色和内容列 roles df[角色].fillna(未知).tolist() contents df[内容].fillna().tolist() # 组合成角色内容的形式 combined [f{role}{content} for role, content in zip(roles, contents) if content.strip()] # 文本分句处理 all_sentences [] for item in combined: sentences_in_item re.split(r(?!\w\.\w.)(?![A-Z][a-z]\.)(?[。\n])\s*, item) all_sentences.extend([s.strip() for s in sentences_in_item if s.strip()]) return all_sentences except Exception as e: print(f读取CSV文件时出错: {str(e)}) return []2. AI 智能分类模块系统集成 OpenAI API兼容阿里云通义千问等模型通过精心设计的提示词工程实现对话文本的精准分类系统提示词明确分类规则、跳过条件和输出格式对 API 返回结果进行清洗和标准化处理支持精确匹配和部分匹配两种匹配策略自动记录无法识别的文本便于人工复核def classify_text(self, sentence): 使用API对文本进行分类 system_content 你是一个专业高效的文本分类器请将以下课堂对话中的每个句子以一个对话轮次为单元分类到五大类及细分小类 必须跳过以下类型的语句 1. 师生问候如同学们好老师好 2. 教师指令如上课下课请打开课本 3. 简单复述如他说要画图你刚才说... 4. 简单评价如很好正确不错 5. 组织性语言如接下来我们继续 ...分类定义省略... try: response self.client.chat.completions.create( modeldeepseek-v3, messages[ {role: system, content: system_content}, {role: user, content: f请分类以下课堂对话句子:\n{sentence}} ] ) result response.choices[0].message.content.strip() return result except Exception as e: print(fAPI调用错误: {str(e)}) return API错误3. 可视化分析模块系统自动生成多维度的可视化图表直观展示课堂话语功能分布一级指标饼图展示四大类话语功能的占比分布二级指标饼图细化展示 12 个小类的具体分布对比柱状图 折线图对比分析实际课堂与优质课堂的指标差异自动添加数值标签、大类分隔线等提升图表可读性4. 智能分析报告模块基于分类统计数据系统调用大语言模型生成专业的课堂分析报告包含教学亮点分析待改进方面识别具体教学建议数据支撑的量化结论5.完整代码import pandas as pd import matplotlib.pyplot as plt import re import os from tqdm import tqdm from openai import OpenAI import warnings warnings.filterwarnings(ignore) # 1. 全局配置 # 替换为自己的API Key DEEPSEEK_API_KEY 你的DeepSeek API Key QWEN_API_KEY 你的通义千问API Key # 分类体系二级→一级 CATEGORY_MAP { 观察记忆: 知识理解, 概括理解: 知识理解, 说明论证: 知识理解, 经历经验: 表达交流, 主观看法: 表达交流, 情感态度: 表达交流, 分析计算: 实践应用, 推测解释: 实践应用, 简单问题解决: 实践应用, 综合问题解决: 创造迁移, 猜想探究: 创造迁移, 发现创新: 创造迁移 } # 优质课基准一级、二级 BENCHMARK_FIRST { 知识理解: 76, 表达交流: 12, 实践应用: 0, 创造迁移: 12 } BENCHMARK_SECOND { 观察记忆: 2, 概括理解: 20, 说明论证: 54, 经历经验: 0, 主观看法: 8, 情感态度: 4, 分析计算: 0, 推测解释: 0, 简单问题解决: 0, 综合问题解决: 0, 猜想探究: 12, 发现创新: 0 } # 无效话语正则 FILTER_REGEX r^(老师好|同学们好|早上好|下午好|上课|下课|请打开|翻到|很好|不错|正确|真棒|接下来|然后|继续|下面|请看|他说|你刚才说)$ # 2. 工具函数 def setup_font(): 设置中文字体 plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, KaiTi] plt.rcParams[axes.unicode_minus] False def clean_and_split(text): 清洗文本分句过滤无效话语 text str(text).strip() if len(text) 2: return [] # 分句 sentences re.split(r[。\n], text) valid_sentences [] for s in sentences: s s.strip() if len(s) 2: continue # 过滤无效话语 if re.match(FILTER_REGEX, s): continue valid_sentences.append(s) return valid_sentences def get_llm_client(api_key, base_url): 获取LLM客户端 return OpenAI(api_keyapi_key, base_urlbase_url, timeout15) def classify_sentence(sentence): 调用DeepSeek分类单句 client get_llm_client(DEEPSEEK_API_KEY, https://api.deepseek.com) prompt f 你是课堂话语分类专家严格从以下12个类别中选一个只输出类别名称无任何解释。 类别观察记忆、概括理解、说明论证、经历经验、主观看法、情感态度、分析计算、推测解释、简单问题解决、综合问题解决、猜想探究、发现创新 句子{sentence} 输出 .strip() try: res client.chat.completions.create( modeldeepseek-chat, messages[{role: user, content: prompt}], temperature0.1, max_tokens10 ) return res.choices[0].message.content.strip() except Exception as e: print(f分类错误{e}) return 分类失败 def generate_report(first_ratio, second_ratio): 调用通义千问生成教研报告 client get_llm_client(QWEN_API_KEY, https://dashscope.aliyuncs.com/compatible-mode/v1) prompt f 你是资深教研员根据以下课堂话语数据生成250字左右专业分析报告包含亮点、不足、改进建议语言简洁专业。 一级指标占比{first_ratio} 二级指标占比{second_ratio} 优质课一级基准{BENCHMARK_FIRST} 优质课二级基准{BENCHMARK_SECOND} .strip() try: res client.chat.completions.create( modelqwen-plus, messages[{role: user, content: prompt}], temperature0.3, max_tokens500 ) return res.choices[0].message.content.strip() except Exception as e: print(f报告生成错误{e}) return 报告生成失败 # 3. 绘图函数 def plot_first_pie(first_count, save_path): 一级指标饼图 labels list(first_count.keys()) sizes list(first_count.values()) colors [#1f77b4, #ff7f0e, #2ca02c, #d62728] plt.figure(figsize(8, 6)) plt.pie(sizes, labelslabels, autopct%1.1f%%, startangle90, colorscolors) plt.title(课堂话语一级指标分布, fontsize14) plt.axis(equal) plt.tight_layout() plt.savefig(save_path, dpi300, bbox_inchestight) plt.close() def plot_second_pie(second_count, save_path): 二级指标饼图 labels list(second_count.keys()) sizes list(second_count.values()) plt.figure(figsize(10, 7)) plt.pie(sizes, labelslabels, autopct%1.1f%%, startangle90) plt.title(课堂话语二级指标分布, fontsize14) plt.axis(equal) plt.tight_layout() plt.savefig(save_path, dpi300, bbox_inchestight) plt.close() def plot_first_bar(first_ratio, save_path): 一级指标柱状折线对比图 labels list(BENCHMARK_FIRST.keys()) actual [first_ratio.get(k, 0) for k in labels] bench [BENCHMARK_FIRST[k] for k in labels] x range(len(labels)) plt.figure(figsize(10, 6)) plt.bar(x, actual, width0.6, color#1f77b4, alpha0.7, label本节课) plt.plot(x, bench, o-, color#ff7f0e, linewidth2.5, markersize8, label优质课基准) for i, v in enumerate(actual): plt.text(i, v 1, f{v:.1f}%, hacenter, fontsize10) for i, v in enumerate(bench): plt.text(i, v 1, f{v}%, hacenter, fontsize10, colorred) plt.title(一级指标对比本节课 vs 优质课, fontsize14) plt.ylabel(占比%) plt.xticks(x, labels) plt.legend() plt.grid(axisy, linestyle--, alpha0.7) plt.tight_layout() plt.savefig(save_path, dpi300, bbox_inchestight) plt.close() def plot_second_bar(second_ratio, save_path): 二级指标柱状折线对比图 labels list(BENCHMARK_SECOND.keys()) actual [second_ratio.get(k, 0) for k in labels] bench [BENCHMARK_SECOND[k] for k in labels] x range(len(labels)) plt.figure(figsize(12, 6)) plt.bar(x, actual, width0.6, color#2ca02c, alpha0.7, label本节课) plt.plot(x, bench, o-, color#d62728, linewidth2.5, markersize8, label优质课基准) for i, v in enumerate(actual): plt.text(i, v 0.5, f{v:.1f}%, hacenter, fontsize9) plt.axvline(x2.5, colorgray, linestyle--, alpha0.5) plt.axvline(x5.5, colorgray, linestyle--, alpha0.5) plt.axvline(x8.5, colorgray, linestyle--, alpha0.5) plt.title(二级指标对比本节课 vs 优质课, fontsize14) plt.ylabel(占比%) plt.xticks(x, labels, rotation45, haright) plt.legend() plt.grid(axisy, linestyle--, alpha0.7) plt.tight_layout() plt.savefig(save_path, dpi300, bbox_inchestight) plt.close() # 4. 主分析类 class DiscourseAnalyzer: def __init__(self, csv_path, output_dir): self.csv_path csv_path self.output_dir output_dir os.makedirs(output_dir, exist_okTrue) setup_font() # 初始化计数 self.second_count {k:0 for k in BENCHMARK_SECOND.keys()} self.first_count {k:0 for k in BENCHMARK_FIRST.keys()} self.valid_sentences [] self.classified_results [] def load_data(self): 加载CSV数据 df pd.read_csv(self.csv_path, encodingutf-8) assert 角色 in df.columns and 内容 in df.columns, CSV需包含角色和内容列 return df def process(self): 核心处理流程 df self.load_data() print(f加载数据共{len(df)}条) # 清洗分句 for idx, row in df.iterrows(): role row[角色] content row[内容] sentences clean_and_split(content) for s in sentences: self.valid_sentences.append((role, s)) print(f清洗后有效句子共{len(self.valid_sentences)}条) # AI分类 for role, sent in tqdm(self.valid_sentences, descAI分类中): cat classify_sentence(sent) if cat in CATEGORY_MAP: first_cat CATEGORY_MAP[cat] self.second_count[cat] 1 self.first_count[first_cat] 1 self.classified_results.append(f{role}{sent} | {first_cat} | {cat}) else: self.classified_results.append(f{role}{sent} | 分类失败 | {cat}) # 计算占比 total sum(self.second_count.values()) self.first_ratio {k: v/total*100 for k, v in self.first_count.items()} self.second_ratio {k: v/total*100 for k, v in self.second_count.items()} print(f分类完成有效分类{total}条) def save_results(self): 保存所有结果 # 保存分类文本 with open(os.path.join(self.output_dir, 分类结果.txt), w, encodingutf-8) as f: f.write(\n.join(self.classified_results)) # 保存统计CSV stats_df pd.DataFrame({ 一级指标: list(self.first_ratio.keys()), 频次: list(self.first_count.values()), 占比(%): list(self.first_ratio.values()), 优质课基准(%): list(BENCHMARK_FIRST.values()) }) stats_df.to_csv(os.path.join(self.output_dir, 一级指标统计.csv), indexFalse, encodingutf-8-sig) # 生成图表 plot_first_pie(self.first_count, os.path.join(self.output_dir, 一级指标饼图.png)) plot_second_pie(self.second_count, os.path.join(self.output_dir, 二级指标饼图.png)) plot_first_bar(self.first_ratio, os.path.join(self.output_dir, 一级指标对比图.png)) plot_second_bar(self.second_ratio, os.path.join(self.output_dir, 二级指标对比图.png)) # 生成并保存报告 report generate_report(self.first_ratio, self.second_ratio) with open(os.path.join(self.output_dir, 教研报告.txt), w, encodingutf-8) as f: f.write(report) print(所有结果保存完成) return report # 5. 运行入口 if __name__ __main__: # 配置参数 CSV_PATH 你的课堂实录.csv # 替换为你的CSV文件路径 OUTPUT_DIR 课堂话语分析结果 # 运行分析 analyzer DiscourseAnalyzer(CSV_PATH, OUTPUT_DIR) analyzer.process() report analyzer.save_results() print(\n 教研报告 ) print(report)三、系统特色与优势1. 自动化与智能化全程自动化处理从数据读取、文本分类到图表生成、报告撰写大幅提升课堂分析效率减少人工成本。2. 标准化与客观性基于统一的分类标准和量化指标避免人工评价的主观性使课堂评价更具科学性。3. 可视化与易解读多维度的图表展示和结构化的分析报告让非专业人员也能快速理解课堂对话的特点。4. 可扩展性强支持自定义分类体系和基准指标兼容多种 CSV 数据格式可对接不同的大语言模型输出格式支持 TXT、CSV、JSON、Excel 等四、应用场景教师专业发展教师可通过系统分析自己的课堂对话发现教学中的优势和不足针对性改进教学策略。教研活动教研员可批量分析多个课堂案例总结优秀教学模式为区域教研提供数据支撑。教育研究教育研究者可基于系统开展大规模课堂对话分析探索优质课堂的话语特征。教学评价作为课堂教学评价的辅助工具为教学评比、职称评定等提供客观数据。五、使用建议数据准备确保 CSV 文件包含 角色 和 内容 列文本内容尽量完整准确。模型选择根据实际需求选择合适的大语言模型平衡准确性和成本。结果复核对系统标记的 未知分类 文本进行人工复核持续优化分类规则。指标调整根据不同学科、不同学段的特点调整优质课堂的基准指标。六、总结与展望这款基于 AI 的课堂话语功能分析系统将自然语言处理技术与教育评价理论相结合为课堂教学评价提供了新的思路和方法。未来可进一步优化增加角色分析维度对比教师和学生的话语特征引入时序分析展示课堂对话的动态变化构建本地模型降低 API 调用成本开发 Web 界面提升用户使用体验通过量化分析课堂话语功能我们能够更深入地理解优质课堂的对话特征为提升课堂教学质量提供数据驱动的决策支持最终惠及每一位学生的学习成长。
基于 AI 的课堂话语功能分析系统:量化解读优质课堂对话
发布时间:2026/5/19 11:58:41
在教育数字化转型的背景下如何科学、客观地评价课堂教学质量尤其是师生对话的质量成为教育研究者和一线教师关注的核心问题。传统的课堂评价多依赖人工观察和主观判断存在效率低、标准不统一等问题。本文将介绍一款基于 OpenAI API 构建的课堂话语功能分析系统该系统能够自动对课堂对话文本进行分类、统计和可视化分析为课堂教学评价提供量化依据。一、系统设计思路1. 核心目标构建一套自动化的课堂话语功能分析体系将师生对话文本按照预设的分类体系进行精准分类对比优质课堂的话语功能指标生成可视化图表和专业分析报告帮助教师和研究者快速把握课堂对话的特点和不足。2. 分类体系构建系统采用四级分类体系将课堂话语功能划分为 4 个一级指标和 12 个二级指标覆盖知识理解、表达交流、实践应用、创造迁移四大维度表格一级指标二级指标知识理解观察记忆、概括理解、说明论证表达交流经历经验、主观看法、情感态度实践应用分析计算、推测解释、简单问题解决创造迁移综合问题解决、猜想探究、发现创新同时系统内置了优质课堂话语功能的基准比例为对比分析提供参照标准。二、核心功能实现1. 数据预处理模块系统首先读取包含 角色 和 内容 的 CSV 格式课堂对话数据进行以下预处理数据校验检查必要列是否存在处理空值文本分割将长文本按中文标点符号分割为独立句子预过滤自动跳过无分析价值的语句如师生问候、简单指令、重复评价等角色保留保留 教师 / 学生 等角色信息便于后续分析def load_csv_content_with_roles(self): 从CSV文件加载对话内容并保留角色信息 try: # 读取CSV文件 df pd.read_csv(self.csv_path, encodingutf-8) # 检查必要的列是否存在 if 角色 not in df.columns or 内容 not in df.columns: raise ValueError(CSV文件中缺少角色或内容列) # 提取角色和内容列 roles df[角色].fillna(未知).tolist() contents df[内容].fillna().tolist() # 组合成角色内容的形式 combined [f{role}{content} for role, content in zip(roles, contents) if content.strip()] # 文本分句处理 all_sentences [] for item in combined: sentences_in_item re.split(r(?!\w\.\w.)(?![A-Z][a-z]\.)(?[。\n])\s*, item) all_sentences.extend([s.strip() for s in sentences_in_item if s.strip()]) return all_sentences except Exception as e: print(f读取CSV文件时出错: {str(e)}) return []2. AI 智能分类模块系统集成 OpenAI API兼容阿里云通义千问等模型通过精心设计的提示词工程实现对话文本的精准分类系统提示词明确分类规则、跳过条件和输出格式对 API 返回结果进行清洗和标准化处理支持精确匹配和部分匹配两种匹配策略自动记录无法识别的文本便于人工复核def classify_text(self, sentence): 使用API对文本进行分类 system_content 你是一个专业高效的文本分类器请将以下课堂对话中的每个句子以一个对话轮次为单元分类到五大类及细分小类 必须跳过以下类型的语句 1. 师生问候如同学们好老师好 2. 教师指令如上课下课请打开课本 3. 简单复述如他说要画图你刚才说... 4. 简单评价如很好正确不错 5. 组织性语言如接下来我们继续 ...分类定义省略... try: response self.client.chat.completions.create( modeldeepseek-v3, messages[ {role: system, content: system_content}, {role: user, content: f请分类以下课堂对话句子:\n{sentence}} ] ) result response.choices[0].message.content.strip() return result except Exception as e: print(fAPI调用错误: {str(e)}) return API错误3. 可视化分析模块系统自动生成多维度的可视化图表直观展示课堂话语功能分布一级指标饼图展示四大类话语功能的占比分布二级指标饼图细化展示 12 个小类的具体分布对比柱状图 折线图对比分析实际课堂与优质课堂的指标差异自动添加数值标签、大类分隔线等提升图表可读性4. 智能分析报告模块基于分类统计数据系统调用大语言模型生成专业的课堂分析报告包含教学亮点分析待改进方面识别具体教学建议数据支撑的量化结论5.完整代码import pandas as pd import matplotlib.pyplot as plt import re import os from tqdm import tqdm from openai import OpenAI import warnings warnings.filterwarnings(ignore) # 1. 全局配置 # 替换为自己的API Key DEEPSEEK_API_KEY 你的DeepSeek API Key QWEN_API_KEY 你的通义千问API Key # 分类体系二级→一级 CATEGORY_MAP { 观察记忆: 知识理解, 概括理解: 知识理解, 说明论证: 知识理解, 经历经验: 表达交流, 主观看法: 表达交流, 情感态度: 表达交流, 分析计算: 实践应用, 推测解释: 实践应用, 简单问题解决: 实践应用, 综合问题解决: 创造迁移, 猜想探究: 创造迁移, 发现创新: 创造迁移 } # 优质课基准一级、二级 BENCHMARK_FIRST { 知识理解: 76, 表达交流: 12, 实践应用: 0, 创造迁移: 12 } BENCHMARK_SECOND { 观察记忆: 2, 概括理解: 20, 说明论证: 54, 经历经验: 0, 主观看法: 8, 情感态度: 4, 分析计算: 0, 推测解释: 0, 简单问题解决: 0, 综合问题解决: 0, 猜想探究: 12, 发现创新: 0 } # 无效话语正则 FILTER_REGEX r^(老师好|同学们好|早上好|下午好|上课|下课|请打开|翻到|很好|不错|正确|真棒|接下来|然后|继续|下面|请看|他说|你刚才说)$ # 2. 工具函数 def setup_font(): 设置中文字体 plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, KaiTi] plt.rcParams[axes.unicode_minus] False def clean_and_split(text): 清洗文本分句过滤无效话语 text str(text).strip() if len(text) 2: return [] # 分句 sentences re.split(r[。\n], text) valid_sentences [] for s in sentences: s s.strip() if len(s) 2: continue # 过滤无效话语 if re.match(FILTER_REGEX, s): continue valid_sentences.append(s) return valid_sentences def get_llm_client(api_key, base_url): 获取LLM客户端 return OpenAI(api_keyapi_key, base_urlbase_url, timeout15) def classify_sentence(sentence): 调用DeepSeek分类单句 client get_llm_client(DEEPSEEK_API_KEY, https://api.deepseek.com) prompt f 你是课堂话语分类专家严格从以下12个类别中选一个只输出类别名称无任何解释。 类别观察记忆、概括理解、说明论证、经历经验、主观看法、情感态度、分析计算、推测解释、简单问题解决、综合问题解决、猜想探究、发现创新 句子{sentence} 输出 .strip() try: res client.chat.completions.create( modeldeepseek-chat, messages[{role: user, content: prompt}], temperature0.1, max_tokens10 ) return res.choices[0].message.content.strip() except Exception as e: print(f分类错误{e}) return 分类失败 def generate_report(first_ratio, second_ratio): 调用通义千问生成教研报告 client get_llm_client(QWEN_API_KEY, https://dashscope.aliyuncs.com/compatible-mode/v1) prompt f 你是资深教研员根据以下课堂话语数据生成250字左右专业分析报告包含亮点、不足、改进建议语言简洁专业。 一级指标占比{first_ratio} 二级指标占比{second_ratio} 优质课一级基准{BENCHMARK_FIRST} 优质课二级基准{BENCHMARK_SECOND} .strip() try: res client.chat.completions.create( modelqwen-plus, messages[{role: user, content: prompt}], temperature0.3, max_tokens500 ) return res.choices[0].message.content.strip() except Exception as e: print(f报告生成错误{e}) return 报告生成失败 # 3. 绘图函数 def plot_first_pie(first_count, save_path): 一级指标饼图 labels list(first_count.keys()) sizes list(first_count.values()) colors [#1f77b4, #ff7f0e, #2ca02c, #d62728] plt.figure(figsize(8, 6)) plt.pie(sizes, labelslabels, autopct%1.1f%%, startangle90, colorscolors) plt.title(课堂话语一级指标分布, fontsize14) plt.axis(equal) plt.tight_layout() plt.savefig(save_path, dpi300, bbox_inchestight) plt.close() def plot_second_pie(second_count, save_path): 二级指标饼图 labels list(second_count.keys()) sizes list(second_count.values()) plt.figure(figsize(10, 7)) plt.pie(sizes, labelslabels, autopct%1.1f%%, startangle90) plt.title(课堂话语二级指标分布, fontsize14) plt.axis(equal) plt.tight_layout() plt.savefig(save_path, dpi300, bbox_inchestight) plt.close() def plot_first_bar(first_ratio, save_path): 一级指标柱状折线对比图 labels list(BENCHMARK_FIRST.keys()) actual [first_ratio.get(k, 0) for k in labels] bench [BENCHMARK_FIRST[k] for k in labels] x range(len(labels)) plt.figure(figsize(10, 6)) plt.bar(x, actual, width0.6, color#1f77b4, alpha0.7, label本节课) plt.plot(x, bench, o-, color#ff7f0e, linewidth2.5, markersize8, label优质课基准) for i, v in enumerate(actual): plt.text(i, v 1, f{v:.1f}%, hacenter, fontsize10) for i, v in enumerate(bench): plt.text(i, v 1, f{v}%, hacenter, fontsize10, colorred) plt.title(一级指标对比本节课 vs 优质课, fontsize14) plt.ylabel(占比%) plt.xticks(x, labels) plt.legend() plt.grid(axisy, linestyle--, alpha0.7) plt.tight_layout() plt.savefig(save_path, dpi300, bbox_inchestight) plt.close() def plot_second_bar(second_ratio, save_path): 二级指标柱状折线对比图 labels list(BENCHMARK_SECOND.keys()) actual [second_ratio.get(k, 0) for k in labels] bench [BENCHMARK_SECOND[k] for k in labels] x range(len(labels)) plt.figure(figsize(12, 6)) plt.bar(x, actual, width0.6, color#2ca02c, alpha0.7, label本节课) plt.plot(x, bench, o-, color#d62728, linewidth2.5, markersize8, label优质课基准) for i, v in enumerate(actual): plt.text(i, v 0.5, f{v:.1f}%, hacenter, fontsize9) plt.axvline(x2.5, colorgray, linestyle--, alpha0.5) plt.axvline(x5.5, colorgray, linestyle--, alpha0.5) plt.axvline(x8.5, colorgray, linestyle--, alpha0.5) plt.title(二级指标对比本节课 vs 优质课, fontsize14) plt.ylabel(占比%) plt.xticks(x, labels, rotation45, haright) plt.legend() plt.grid(axisy, linestyle--, alpha0.7) plt.tight_layout() plt.savefig(save_path, dpi300, bbox_inchestight) plt.close() # 4. 主分析类 class DiscourseAnalyzer: def __init__(self, csv_path, output_dir): self.csv_path csv_path self.output_dir output_dir os.makedirs(output_dir, exist_okTrue) setup_font() # 初始化计数 self.second_count {k:0 for k in BENCHMARK_SECOND.keys()} self.first_count {k:0 for k in BENCHMARK_FIRST.keys()} self.valid_sentences [] self.classified_results [] def load_data(self): 加载CSV数据 df pd.read_csv(self.csv_path, encodingutf-8) assert 角色 in df.columns and 内容 in df.columns, CSV需包含角色和内容列 return df def process(self): 核心处理流程 df self.load_data() print(f加载数据共{len(df)}条) # 清洗分句 for idx, row in df.iterrows(): role row[角色] content row[内容] sentences clean_and_split(content) for s in sentences: self.valid_sentences.append((role, s)) print(f清洗后有效句子共{len(self.valid_sentences)}条) # AI分类 for role, sent in tqdm(self.valid_sentences, descAI分类中): cat classify_sentence(sent) if cat in CATEGORY_MAP: first_cat CATEGORY_MAP[cat] self.second_count[cat] 1 self.first_count[first_cat] 1 self.classified_results.append(f{role}{sent} | {first_cat} | {cat}) else: self.classified_results.append(f{role}{sent} | 分类失败 | {cat}) # 计算占比 total sum(self.second_count.values()) self.first_ratio {k: v/total*100 for k, v in self.first_count.items()} self.second_ratio {k: v/total*100 for k, v in self.second_count.items()} print(f分类完成有效分类{total}条) def save_results(self): 保存所有结果 # 保存分类文本 with open(os.path.join(self.output_dir, 分类结果.txt), w, encodingutf-8) as f: f.write(\n.join(self.classified_results)) # 保存统计CSV stats_df pd.DataFrame({ 一级指标: list(self.first_ratio.keys()), 频次: list(self.first_count.values()), 占比(%): list(self.first_ratio.values()), 优质课基准(%): list(BENCHMARK_FIRST.values()) }) stats_df.to_csv(os.path.join(self.output_dir, 一级指标统计.csv), indexFalse, encodingutf-8-sig) # 生成图表 plot_first_pie(self.first_count, os.path.join(self.output_dir, 一级指标饼图.png)) plot_second_pie(self.second_count, os.path.join(self.output_dir, 二级指标饼图.png)) plot_first_bar(self.first_ratio, os.path.join(self.output_dir, 一级指标对比图.png)) plot_second_bar(self.second_ratio, os.path.join(self.output_dir, 二级指标对比图.png)) # 生成并保存报告 report generate_report(self.first_ratio, self.second_ratio) with open(os.path.join(self.output_dir, 教研报告.txt), w, encodingutf-8) as f: f.write(report) print(所有结果保存完成) return report # 5. 运行入口 if __name__ __main__: # 配置参数 CSV_PATH 你的课堂实录.csv # 替换为你的CSV文件路径 OUTPUT_DIR 课堂话语分析结果 # 运行分析 analyzer DiscourseAnalyzer(CSV_PATH, OUTPUT_DIR) analyzer.process() report analyzer.save_results() print(\n 教研报告 ) print(report)三、系统特色与优势1. 自动化与智能化全程自动化处理从数据读取、文本分类到图表生成、报告撰写大幅提升课堂分析效率减少人工成本。2. 标准化与客观性基于统一的分类标准和量化指标避免人工评价的主观性使课堂评价更具科学性。3. 可视化与易解读多维度的图表展示和结构化的分析报告让非专业人员也能快速理解课堂对话的特点。4. 可扩展性强支持自定义分类体系和基准指标兼容多种 CSV 数据格式可对接不同的大语言模型输出格式支持 TXT、CSV、JSON、Excel 等四、应用场景教师专业发展教师可通过系统分析自己的课堂对话发现教学中的优势和不足针对性改进教学策略。教研活动教研员可批量分析多个课堂案例总结优秀教学模式为区域教研提供数据支撑。教育研究教育研究者可基于系统开展大规模课堂对话分析探索优质课堂的话语特征。教学评价作为课堂教学评价的辅助工具为教学评比、职称评定等提供客观数据。五、使用建议数据准备确保 CSV 文件包含 角色 和 内容 列文本内容尽量完整准确。模型选择根据实际需求选择合适的大语言模型平衡准确性和成本。结果复核对系统标记的 未知分类 文本进行人工复核持续优化分类规则。指标调整根据不同学科、不同学段的特点调整优质课堂的基准指标。六、总结与展望这款基于 AI 的课堂话语功能分析系统将自然语言处理技术与教育评价理论相结合为课堂教学评价提供了新的思路和方法。未来可进一步优化增加角色分析维度对比教师和学生的话语特征引入时序分析展示课堂对话的动态变化构建本地模型降低 API 调用成本开发 Web 界面提升用户使用体验通过量化分析课堂话语功能我们能够更深入地理解优质课堂的对话特征为提升课堂教学质量提供数据驱动的决策支持最终惠及每一位学生的学习成长。