太厉害了,竟然用 Python 给英语老师开发了个英语作文批改的神器

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

原创:TrueDei

想要获取更多Python学习资料了解更多关于Python的知识可以加Q群630390733踊跃发言大家一起来学习讨论吧!

由一个家长退群的故事在某博上了热搜。故事中老师和家长的矛盾由批改作业集中爆发,至于孰是孰非,还是交给吃瓜群众去评价吧,作为一个技术工作者,我突发奇想,是否以后能让机器来辅助老师批改作业呢?这仿佛是个维护世界和平的点子!

经过一阵调(搜)研(索),在英语作文批改上,还真的有一些成熟的方案可以使用,而且学习成本相当之低,比如有道智云的英语作文批改服务,只需阅读文档按规则开发应用,即可得到详尽的批改结果,作文可以是图片,也可以是文字,等级可以从小学一直到雅思托福,覆盖范围极广。

怀着激动的心情,我快速地开发了一个简单的 demo,下面分享一下开发过程。

调用 API 接口的准备工作

首先,是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取到应用的 id 和密钥。具体个人注册的过程和应用创建过程详见文章 分享一次批量文件翻译的开发过程

这里要特别说明一下,作文批改分为图像和文本两种形式,分别调用了不同的 api,因此需要创建两个实例。

开发过程详细介绍 下面介绍具体的代码开发过程。

英语作文批改分为两个 API,分别对应图像识别和文本输入两种形式的作文。调用方式大同小异,都是将待批改内容和时间戳等信息生成的签名 post 到 API 接口,而后接口返回批改结果。

图像识别 API 输入所需参数如下表:

文本输入 API 输入参数如下表:

  • 最好传输 limitedWords,这样评分更精确。
  • 签名生成算法如下:

signType=v3,sha256(应用 ID+input+salt+curtime + 密钥),推荐使用 sha256 签名计算方法为:sha256(应用 ID+input+salt + 当前 UTC 时间戳 + 密钥)。

其中,input 的计算方式为:input=多个q拼接后前10个字符 + 多个q拼接长度 + 多个q拼接后十个字符(当多个 q 拼接后长度大于 20)或 input=多个q拼接的字符串(当多个 q 拼接后长度小于等于 20)。

在接口输入参数中,grade 为以下几类:

Demo开发:

这个demo使用python3开发,包括maindow.py,correctclass.py,HomeworkCorrect.py 三个文件,分别为demo的界面、界面逻辑处理和英文作文批改接口调用方法的封装

HomeworkCorrect.py 三个文件,分别为 demo 的界面、界面逻辑处理和英文作文批改接口调用方法的封装。

1、界面部分: UI 部分较简单,主要功能为选择待批改作文文件、选择批改结果存储路径、选择批改类型。其布局代码如下:

root=tk.Tk()
root.title(" youdao correct writing test")
frm = tk.Frame(root)
frm.grid(padx='50', pady='50')btn_get_file = tk.Button(frm, text='选择待批改的作业(图片或文本)', command=get_files)
btn_get_file.grid(row=0, column=0, ipadx='3', ipady='3', padx='10', pady='20')
text1 = tk.Text(frm, width='40', height='10')
text1.grid(row=0, column=1)btn_get_result_path=tk.Button(frm,text='选择批改结果存放路径',command=set_result_path)
btn_get_result_path.grid(row=1,column=0)
text2=tk.Text(frm,width='40', height='2')
text2.grid(row=1,column=1)label=tk.Label(frm,text='选择年级:')
label.grid(row=3,column=0)
combox=ttk.Combobox(frm,textvariable=tk.StringVar(),width=38)
combox["value"]=select_type_dict
combox.current(0)
combox.bind("<<ComboboxSelected>>",get_grade_type)
combox.grid(row=3,column=1)btn_sure=tk.Button(frm,text="批改",command=correct_files)
btn_sure.grid(row=4,column=1)root.mainloop()
复制代码

其中启动按钮 btn_sure 的绑定事件 correct_files() 来启动批改,并在完成后打开结果存储路径:

def correct_files():correct.start_correct()os.system('start '+correct.result_path)
correctclass.py
复制代码

这里主要配合 UI 的逻辑,分析文件类型,选取合适的接口来批改作文。

首先定义一个类 Correct:

2、class Correct():

def __init__(self,file_paths,grade,result_path):	self.file_paths=file_paths		self.grade =grade				self.result_path=result_path	
复制代码

get_correct_result() 方法根据文件类型判断应调用的封装方法,并处理返回值,将批改结果存入文件系统。

def get_correct_result(self,file_path):file_type=file_path.split(".")[1]if file_type=="txt":print(file_path)result=connect_context(file_path,self.grade)self.save_result(file_path,result)elif file_type=="png" or file_type=="jpg" or file_type=="jepg" :result=connect_pic(file_path,self.grade)self.save_result(file_path,result)
复制代码

save_result() 方法实现了保存结果的功能:

def save_result(self,file_path,result):result_file_name=os.path.basename(file_path).split('.')[0]+'_result.txt'f=open(self.result_path+'/'+result_file_name,'w')f.write(str(result))f.close()
复制代码

HomeworkCorrect.py HomeworkCorrect.py 中封装了请求两种作业批改 API 的方法,两个 API 主要区别在于 URL 和 APP 示例的不同。最核心的方法分别是 connect_pic() 和 connect_context()

connect_pic():

def connect_pic(pic_path,grade):f = open(pic_path, 'rb')  q = base64.b64encode(f.read())  f.close()data = {}curtime = str(int(time.time()))data['curtime'] = curtimesalt = str(uuid.uuid1())signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRETsign = encrypt(signStr)data['appKey'] = APP_KEYdata['salt'] = saltdata['q'] = qdata['sign'] = signdata['grade'] = gradedata['signType'] = 'v3'response = do_request(data,YOUDAO_URL_IMAGE)result=json.loads(str(response.content,'utf-8'))['Result']return result
复制代码

connect_context():

def connect_context(file_path,grade):f=open(file_path,'rb')q=f.read()f.close()data = {}curtime = str(int(time.time()))data['curtime'] = curtimesalt = str(uuid.uuid1())signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRETsign = encrypt(signStr)data['appKey'] = APP_KEYdata['q'] = qdata['salt'] = saltdata['sign'] = signdata['signType'] = "v3"data['grade'] = graderesponse = do_request(data,YOUDAO_URL_TEXT)print(response.content)result = json.loads(str(response.content, 'utf-8'))['Result']print(result)return result
复制代码

响应结果说明:

{
"errorCode": "错误码",
"Result": {"uniqueKey": "每个请求独一无二的字符串标识","essayLangName": "语言信息","rawEssay": "请求原文","refEssay": "参考范文","stLevel": "作文级别","reqSource": "请求来源","extraParams": "额外请求参数(扩展用参数)","wordNum": "文章总词数""conjWordNum": "文章连接词数","AllFeatureAdvice": { "WordNum": "词数建议,如文章字数疑似超出该考试字数要求","Spelling": "拼写错误建议","WordDiversity": "词汇丰富度建议,如词汇量积累非常少,只能给出一些零散的简单词汇,建议多积累词汇","Structure": "文章结构建议","AdvanceVocab": ["xx", "xx", "xx" ],"AdvanceVocabLeval": [0, 1, 2], "lexicalSubs": [ {"candidates": ["xx", "xx"], "count": 频率, "word": xx 对应词}, ...]"Conjunction": [{"used": ["xx", "xx", "xx"] "advice": ["xx", "xx", "xx"] }],"Topic": "主题相关性建议","Grammar": "语法相关建议","GoodExpression": ["xx", "xx", "xx"] },"AllFeatureScore": { "NeuralScore": 68.64,     "WordNum": 10,  "Spelling": 10,   "WordDiversity": 0,  "Structure": 8,  "AdvanceVocab": 7.61,   "Conjunction": 6.94,   "Topic": 6.03,  "Grammar": 2.5  "SentComplex": 10 },"majorScore": { "WordScore": 10, "GrammarScore": 10, "StructureScore": 10, "topicScore": 10, },"essayFeedback":{"sentsFeedback": [{"sentId": "句子在全文的编号,从0开始","paraId": "该句所在的段落号,从0开始","rawSent": "原句","segSent": "原句分词后的结果","correctedSent": "原句修正后的结果","sentStartPos": "该句子在全文中相对于文章初始位置的偏移量","errorPosInfos": [{"type": "错误类型(包括`grammar`,`typo`,`refactor`)","startPos": "错误起始位置相对rawSent起始位置的偏移量","endPos": "错误结束位置相对rawSent起始位置的偏移量","orgChunk": "错误块的具体内容","correctChunk": "错误块修正后的具体内容","error_type": "(弃用) 错误的具体类别(0表示拼写错误,1表示冠词错误,2表示动词时态或者第三人称单复数错误,3表示名词单复数错误,4表示格错误,5表示介词错误,6表示其他语法错误,7表示文本格式错误,8表示正确)","new_error_type": "错误类别(0表示完全正确,1表示书写格式不规范,2表示拼写错误,3表示标点错误,4表示冠词错误,5表示动词错误,6表示名词单复数错误,7表示代词错误,8表示介词错误,9表示形容词错误,10表示副词错误,11表示连词错误,20表示其他错误,21表示代指所有语法错误(兼容))""new_sub_error_type": "细分错误类别(0表示正确,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表示不规范错误)""举例说明": 如果new_error_type=5, new_sub_error_type=2,说明是动词缺失"reason": "错误的具体原因","isValidLangChunk": "类似下面的isValidSent,判断是否为合法片段(该片段如果语言检测结果与期望不一致,则认为不合法)""analysis": "错误的原因的具体辨析(保留接口,暂时应该没用)"}, ..., {}],"isValidLangSent": "是否为合法句子(合法与否取决于语言检测对该句的语言信息识别结果与期望结果是否一致)""sentFeedback": "错误原因反馈,基于errorPosInfos中所有reason字段拼接而成","isContainTypoError": "返回是否含有typo错误","isContainGrammarError": "返回是否含有语法错误","sentScore": "句子得分(暂时没有用,即将实现)"}]}"totalScore": "文章最终得分""fullScore": "对应级别满分""essayAdvice": "文章最终评价""paraNum": "文章段落数""sentNum": "文章句子数"
}
}
复制代码

总结 有道智云的英语作文批改 API 文档清晰,功能全面,可针对不同类型文件、不同难度的作文进行多维度批改,评价指标明确,批改结果非常具有参考价值,赞!

相信在未来,会有更多类型的作业批改服务出现吧,到那时,老师和家长们就都能得到解放了…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34146.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Android的网上订餐系统

网上订餐系统大家肯定都不会陌生&#xff0c;那就废话不多说&#xff0c;直接上干货。 本人大二&#xff0c;刚好这学期需要做Android应用开发的大作业&#xff0c;今天也是刚刚做完演示&#xff0c;想着留着代码可能也不会有什么太大的用处了&#xff0c;就分享出来供大家参考…

完整的外卖系统,手机端 + 后台管理(附源码)

点击上方“逆锋起笔”&#xff0c;公众号回复 编程资源 领取大佬们推荐的学习资料flash-waimai 一个完整的外卖系统&#xff0c;包括手机端&#xff0c;后台管理&#xff0c;api基于spring boot和vue的前后端分离的外卖系统包含完整的手机端&#xff0c;后台管理功能本项目主要…

Android 外卖订餐APP开发

APP展示页面 &#xff1a; 本产品适用范围&#xff1a; 购买便利店系统任何版本&#xff0c;如需进行二次开发&#xff0c;需要单独联系我们队APP进行修改和调试&#xff0c;免收服务费用。本司接收任何定制功能&#xff0c;具体定制费用根据需求另付费。 2016全新生鲜外卖系统…

小程序外卖订单界面的 代码

html页面 . <view class"container"><view class"store-box"><view class"st-bg"></view><view class" flex justify-between store-info"><view class" flex flex-direction justify-start&…

网上订餐管理系统

网上订餐系统的主要功能是在线点餐&#xff0c;除此之外还有比如充值&#xff0c;菜谱管理&#xff0c;退餐&#xff0c;查看历史订单等等众多相关服务。在撰写论文的过程中&#xff0c;将结合理论实际&#xff0c;理清相关理论知识&#xff0c;同时与系统配合以解释实际应用和…

在线订餐管理系统

1、项目介绍 在线订餐管理系统拥有两种角色 管理员&#xff1a;菜品管理、类别管理、用户管理、订单管理、评价用户、留言管理等 用户&#xff1a;登录注册、点餐、购物车、历史订餐、留言 2、项目技术 后端框架&#xff1a; Servlet、mvc模式 前端技术&#xff1a;jsp、…

ChatGPT爆火?团餐行业如何实现智慧升级

最近&#xff0c;《流浪地球2》热映&#xff0c;影片科技感爆棚&#xff0c;画面感震撼&#xff0c;电影中的一些高科技智能设备也令人赞叹&#xff0c;空间站的云霄电梯可以直通空间站&#xff0c;酷炫的“外骨骼机器人能够辅助工程&#xff0c;智能电子狗“笨笨”能干又可爱&…

瑞吉外卖 - 后台系统退出功能(4)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

外卖订餐——吃货联盟订餐系统

通过一段时间的学习&#xff0c;也到了检验成果的时候了&#xff0c;下面通过实战提升对技能点的运用能力、积累项目经验。 “吃货联盟定餐系统”需求说明 现今已进入网络时代&#xff0c;网上购物、看新闻、交友等人们的日常生活已离不开网络。“只 要点点手指&#xff0c;就…

基于android 订餐外卖APP,前台后台服务都齐全

基于android开发的订餐外卖APP 一 项目介绍 该项目是基于android开发的订餐外卖app&#xff0c;前台和后台管理都有&#xff0c;内容很多&#xff0c;非常值得学习&#xff0c;二次开发&#xff0c;设计指导性项目。 二 软件技术说明 软件架构说明 项目技术&#xff1a; …

瑞吉外卖-后台系统功能

目录 前言后台系统登录功能需求分析代码实现实体类Mapper层Service层Controller层 总结 后台系统退出功能需求分析代码实现总结 后台登录优化需求分析代码实现方法一&#xff1a;过滤器方法二&#xff1a;拦截器 总结 前言 所有的命名要符合开发规范&#xff0c;本项目中不再解…

【瑞吉外卖】day09:用户地址簿功能、菜品展示、购物车、下单

目录 1. 用户地址簿功能 1.1 需求分析 1.2 数据模型 1.3 导入功能代码 1.4 功能测试 2. 菜品展示 2.1 需求分析 2.2 前端页面分析 2.3 代码开发 2.4 功能测试 3. 购物车 3.1 需求分析 3.2 数据模型 3.3 前端页面分析 3.4 准备工作 3.5 代码开发 3.6 功能测试 …

外卖管理系统(一)

内容 软件开发整体介绍 瑞吉外卖项目介绍 开发环境搭建 后台登录功能开发 后台退出功能开发 1. 软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程&#xff0c; 以及软件开发过程中涉及到的岗位角色&#xff0c;角色的分工、职责&#x…

外卖订餐管理系统

需求分析 项目概述 外卖订餐系统分成前台订餐管理子系统、店家信息管理子系统和后台管理子系统这三个子系统。用户通过此平台可以浏览菜品、查询菜品、查询店家&#xff0c;注册登录后可以提交订单、查询订单、管理个人信息等&#xff1b;商家通过此平台注册登录后可以接单、…

基于android的外卖在线订餐系统app

本外卖订餐系统是一个Android 客户端JSP Servlet服务端应用程序&#xff0c;启动Android上的应用程序后可以登录、查看菜品等,再者学校学生人数的增加&#xff0c;学生对餐饮服务的要求更加高&#xff1b;许多学生不满足于学校食堂的餐饮或嫌学校食堂就餐排队时间长&#xff0c…

瑞吉外卖订单后台和用户端功能

项目场景&#xff1a; 在编写瑞吉外卖的订单功能的时候&#xff0c;还是按照惯例&#xff0c;订单的一些功能是我们自己做&#xff0c;毕竟都看了一百多集视频了&#xff0c;自己应该能写一点东西了。 遇到的坑&#xff1a; 后台的订单列表功能&#xff0c;有一个输入订单号查询…

瑞吉外卖 —— 2、后台登录和登出

目录 1、后台登录功能 1.1、接口分析 1.1.2、登录校验逻辑 1.2、代码 1.2.1、统一的返回结果实体类 1.2.2、controller 方法 1.3、测试 2、后台退出功能 2.1、分析 2.2、代码 3、未登录访问首页跳转到登录页面 3.1、分析 3.2、代码 1、后台登录功能 1.1、接口分析…

外卖点餐APP-02(后台--员工管理)

&#xff08;一&#xff09;登录 实现思路&#xff1a; 接收到用户登录输入的用户名和密码&#xff0c;封装到了emp对象中对密码进行MD5加密创建条件构造器添加sql查询判断条件&#xff0c;emp对象中的Username等于Employee数据表中的Username调用MyBatis-Plus的方法查询数据库…

瑞吉外卖-移动端菜品展示功能,购物车添加菜品及修改等功能,用户下单功能及历史订单派送功能

整理记录下学习整个瑞吉外卖项目&#xff0c;详细代码可在我的Gitee仓库瑞吉外卖实战克隆下载学习使用&#xff01; 12.菜品展示 12.1 需求分析 12.2 更改前台页面使其正常显示 由于购物车功能还未进行开发&#xff0c;所以修改main.js中的cartListJson函数中访问固定数据&a…

外卖点餐APP-04(后台--菜品管理)

&#xff08;一&#xff09;新增 controller层思路&#xff1a; 调用service处理响应处理结果 PostMapping public R<String> save(RequestBody DishDto dishDto){dishService.saveWithFlavors(dishDto);return R.success("新增成功&#xff01;"); } servi…