首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >记一次英语批改作业软件的开发-除了老师和家长,它也可以批改作业

记一次英语批改作业软件的开发-除了老师和家长,它也可以批改作业

作者头像
呆呆
修改于 2021-05-24 02:40:36
修改于 2021-05-24 02:40:36
3.6K00
代码可运行
举报
文章被收录于专栏:centosDaicentosDai
运行总次数:0
代码可运行

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

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

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

调用API接口的准备工作

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

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

开发过程详细介绍

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

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

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

字段名

类型

含义

必填

备注

q

text

图片的 base64。大小不超过 5MB

True

图片的 base64

langType

text

语言,目前仅支持英文

False

en

appKey

text

应用标识(应用 ID)

True

可在 应用管理 查看

salt

text

随机字符串

True

hfa12lak56ja9gjl

sign

text

签名信息:sha256(appKey+input+salt+密钥)

True

xxxxx

grade

text

作文等级。支持列表见下面 grade 支持列表,默认不管等级,只评价句子好坏

false

default

title

text

作文标题

false

0

modelContent

text

用户提供的范文内容

false

0

goodExpression

text

用户提供的好的表达

false

0

needTypo

text

是否需要 typo,(true/false),默认为 true

false

true

signType

text

签名类型

true

v3

limitedWords

text

作文字数限制

false

1000

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

字段名

类型

含义

必填

备注

q

text

批改的文本。文本不超过 5000 字符

True

text

langType

text

语言,目前仅支持英文

False

en

appKey

text

应用标识(应用 ID)

True

可在 应用管理 查看

salt

text

随机字符串

True

hfa12lak56ja9gjl

sign

text

签名信息:sha256(appKey+input+salt+密钥)

True

xxxxx

grade

text

作文等级。支持列表见下面 grade 支持列表,默认不管等级,只评价句子好坏

false

default

title

text

作文标题

false

0

modelContent

text

用户提供的范文内容

false

0

goodExpression

text

用户提供的好的表达

false

0

needTypo

text

是否需要 纠错,默认为 true(true/false)

false

true

signType

text

签名类型

true

v3

limitedWords

text

作文字数限制

false

1000

curtime

text

当前UTC时间戳(秒)

true

时间戳

最好传输 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为以下几类:

级别

代码

不考虑级别,单纯评价句子好坏

default

小学

elementary

初中

junior

高中

high

四级

cet4

六级

cet6

考研

graduate

托福

toefl

GRE

gre

雅思

ielts

Demo开发:

这个demo使用python3开发,包括maindow.py,correctclass.py,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)
  2. correctclass.py 这里主要配合UI的逻辑,分析文件类型,选取合适的接口来批改作文。 首先定义一个类Correct: 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()
  3. 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()) # 读取文件内容,转换为base64编码 f.close() data = {} curtime = str(int(time.time())) data['curtime'] = curtime salt = str(uuid.uuid1()) #print(q) signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET sign = encrypt(signStr) data['appKey'] = APP_KEY data['salt'] = salt data['q'] = q data['sign'] = sign data['grade'] = grade data['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'] = curtime salt = str(uuid.uuid1()) signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET sign = encrypt(signStr) data['appKey'] = APP_KEY data['q'] = q data['salt'] = salt data['sign'] = sign data['signType'] = "v3" data['grade'] = grade response = do_request(data,YOUDAO_URL_TEXT) print(response.content) result = json.loads(str(response.content, 'utf-8'))['Result'] print(result) return result

效果展示

我分别选了一段英文的图片和txt文档来进行测试:

响应结果说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
"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中词汇可能为空,表示没有推荐替换的近义词,但word使用频率超过3次)
            {"candidates": ["xx", "xx"], "count": 频率, "word": xx 对应词}, ...
        ]
        "Conjunction": [{
            "used": ["xx", "xx", "xx"] # 已使用连词
            "advice": ["xx", "xx", "xx"] # 推荐词
        }],
        "Topic": "主题相关性建议",
        "Grammar": "语法相关建议",
        "GoodExpression": ["xx", "xx", "xx"] # 好的表达
    },
    "AllFeatureScore": { # 对应上面AllFeatureAdvice各特征得分,除NeuralScore是没有Advice的,它代表神经网络作文打分结果,不是最终打分结果!
        "NeuralScore": 68.64,     # 范围:[0,100]
        "WordNum": 10,  # 范围:[0, 10] ---> 指的是词数得分
        "Spelling": 10,   # 范围:[0, 10]
        "WordDiversity": 0,  # 范围:[0, 10]
        "Structure": 8,  # 范围:[0, 10]
        "AdvanceVocab": 7.61,   # 范围:[0, 10]
        "Conjunction": 6.94,   # 范围:[0, 10]
        "Topic": 6.03,  # 范围:[0, 10]
        "Grammar": 2.5  # 范围:[0, 10]
        "SentComplex": 10 # 范围: [0, 10]
    },
    "majorScore": { # 是AllFeatureScore中score整合结果
        "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文档清晰,功能全面,可针对不同类型文件、不同难度的作文进行多维度批改,评价指标明确,批改结果非常具有参考价值,赞!

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

项目地址:https://github.com/LemonQH/CorrectWriting

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
无敌了,用Python给英语老师开发了个英语作文批改的神器(支持小学到雅思)
最近一个家长退群的故事在某博上了热搜。故事中老师和家长的矛盾由批改作业集中爆发,至于孰是孰非,还是交给吃瓜群众去评价吧,作为一个技术工作者,我突发奇想,是否以后能让机器来辅助老师批改作业呢?这仿佛是个维护世界和平的点子!
手撕代码八百里
2021/04/20
4.3K0
无敌了,用Python给英语老师开发了个英语作文批改的神器(支持小学到雅思)
记一次智能搜题软件的开发
很早之前曾经做过一个图片识别的项目,当时有一项功能是整题识别,即传入数学题的截图,可通过ocr技术识别出图片内容,但当时只限于识别文字,并未作更深一步的处理,现在想来实用性并不强,毕竟大家更需要的是解题思路,而不是让AI读出题干(题干的文字,我都认识,连起来我就不知道怎么下手去做了 = = ),最近刚好有时间,于是尝试来为有娃的朋友做一个搜题神器。
呆呆
2021/05/23
9180
分享一次批量文档翻译的开发过程
最近工作过程中,需要对一批文件进行汉译英的翻译,对单个文档手工复制、粘贴的翻译方式过于繁琐,考虑到工作的重复性和本人追求提高效率、少动手(懒),想通过调用已有的接口的方法,自己实现一个批量翻译工具,一劳永逸。在网上找了几款翻译api,通过对比翻译的结果和学习成本,选择了有道智云的服务,自己开发了一个批量翻译的小软件。详细记录一下使用和开发过程,后面的小伙伴们有相关需求,可以参考。
呆呆
2021/05/21
1.1K0
记一次语音转文字程序的开发-当一次野生字幕君
最近剧荒,偶然翻出了曾经下载的电视剧回味一番,经典就是经典,不论是剧情还是台词,都那么有魅力,咦?等等,台词,台词……作为一个IT从业者,我忽然灵光一现——现在语音识别技术这么发达,能否有什么办法能帮我保存下一些精彩桥段的台词呢?或许我也可以是个野生字幕君:p ,似乎也可以在此基础上顺手再翻译一下个别难懂的台词!
呆呆
2021/05/21
7220
记录一次OCR程序开发的尝试
最近工作中涉及到一部分文档和纸质文档的校验工作,就想把纸质文件拍下来,用文字来互相校验。想到之前调用有道智云接口做了文档翻译。看了下OCR文字识别的API接口,有道提供了多种OCR识别的不同接口,有手写体、印刷体、表格、整题识别、购物小票识别、身份证、名片等。干脆这次就继续用有道智云接口做个小demo,把这些功能都试了试,当练手,也当为以后的可能用到的功能做准备了。
呆呆
2021/05/21
8960
我用Python开发了一个搜题神器
很早之前曾经做过一个图片识别的项目,当时有一项功能是整题识别,即传入数学题的截图,可通过ocr技术识别出图片内容,但当时只限于识别文字,并未作更深一步的处理
Python编程与实战
2021/04/15
1.7K0
看我如何使用Python打造一个带娃神奇(一玩能玩一天)?
“再穷不能穷教育,再苦不能苦孩子”,作为娃的爸妈,不仅仅要努力工作保证物质支持,更要关注娃的学习状况,而且时刻都怕娃“输在了起跑线上”,可是,现在孩子们的起跑线也太多了点,英语、各种艺术特长,甚至跳绳,忙的不亦乐乎。然而家长也不是全才啊,这不,我的姐姐最近就开始发愁女儿的英语口语问题了,自己发音不准确,报班又不知道哪家靠谱,眼看着孩子就要落后于小伙伴了,了解到这个情况后,我拿出英语课本,想到自己每次都是60飘过的英语成绩,又放了回去,拿起了我的武器——代码。
手撕代码八百里
2021/04/20
1.7K0
看我如何使用Python打造一个带娃神奇(一玩能玩一天)?
不到100行代码搞定Python做OCR识别身份证,文字等各种字体
最近工作中涉及到一部分文档和纸质文档的校验工作,就想把纸质文件拍下来,用文字来互相校验。想到之前调用有道智云接口做了文档翻译。看了下OCR文字识别的API接口,有道提供了多种OCR识别的不同接口,有手写体、印刷体、表格、整题识别、购物小票识别、身份证、名片等。干脆这次就继续用有道智云接口做个小demo,把这些功能都试了试,当练手,也当为以后的可能用到的功能做准备了。
手撕代码八百里
2020/10/26
5.1K0
用Python解决女朋友看电影没字幕的需求
是这样子的,女朋友晚上突然翻到了自己喜欢看的一个电影,但是没有字幕,这让她很苦恼。
手撕代码八百里
2020/10/26
1.1K0
记一次讲故事机器人的开发-我有故事,让机器人来读
最近工作较忙,回家闲下来只想闭目休息,一分钟屏幕都不想再看,然而我又想追更之前看的小说,于是,需求来了——我需要一个给我讲故事的机器人!
呆呆
2021/05/21
6570
Python批量图片识别并翻译——我用python给女朋友翻译化妆品标签
最近小编遇到一个生存问题,女朋友让我给她翻译英文化妆品标签。美其名曰:"程序猿每天英语开发,英文一定很好吧,来帮我翻译翻译化妆品成分",”来,帮我看看这个面膜建议敷几分钟“。。。。看来斥巨资买化妆品不算完,还需要会各种英文介绍。
呆呆
2021/05/23
1.3K0
惊!Python居然可以读故事了(附源码)
浏览器或者阅读器App里其实也有朗读功能,但是比较僵硬,总是将引人入胜的情节念成流水账,分分钟让人弃坑,所以我考虑自己使用爬虫定时下载更新的章节,而后将文字合成存储到音频文件,这样不仅可以选择一个靠谱的语音合成工具来处理文字,而且保存下来的音频还能反复收听,一举两得。
Python研究者
2020/11/24
5750
Unity 接入有道智云AI - 文档翻译
文档翻译API接口提供有道的文档翻译服务,只需要通过调用文档翻译API,传入文档的Base64编码,指定源语言与目标语言,通过POST请求方式,就可以将文档中的文字内容进行翻译。
CoderZ
2022/08/29
1.4K0
Unity 接入有道智云AI - 文档翻译
自动化作业批改系统
题目解析模块的作用是识别题目的类型,例如选择题、填空题或简答题。针对不同学科的题目,解析方法会有所不同。
知孤云出岫
2024/08/27
9861
自动化作业批改系统
NLP-结巴分词
结巴分词是有国内程序员(https://github.com/fxsjy/jieba)做的一个分词工具,刚开始是Python版本的,后来由anderscui(https://github.com/anderscui/jieba.NET )移植到.Net上面。
全栈程序员站长
2022/09/12
7820
NLP-结巴分词
Jieba中文分词 (二) ——词性标注与关键词提取
上一篇jieba中文分词(一)分词与自定义字典已介绍了jieba中文分词安装,分词原理,分词方法,自定义字典,添加字典等多种常用分词方法。本篇将继续介绍jieba分词关键词提取、词性标注、及常见问题。
数据STUDIO
2021/06/24
8.6K0
【ChatGPT 指令大全】怎么使用ChatGPT来辅助学习英语
在当今全球化的社会中,英语已成为一门世界性的语言,掌握良好的英语技能对个人和职业发展至关重要。而借助人工智能的力量,ChatGPT为学习者提供了一个有价值的工具,可以在学习过程中提供即时的帮助和反馈。在本文中,我们将介绍如何最大限度地利用ChatGPT来提高英语学习效果。
富贵软件
2025/08/28
1130
【ChatGPT 指令大全】怎么使用ChatGPT来辅助学习英语
实用的AI:使用OpenAI GPT2,Sentence BERT和Berkley选区解析器从任何内容自动生成对或错问题
在本文中,将介绍如何使用最新的AI算法自动生成“对或错”问题,例如您在学校教科书中看到的问题。
代码医生工作室
2020/04/02
1.1K0
一个Python自动提取内容摘要的实践
利用计算机将大量的文本进行处理,产生简洁、精炼内容的过程就是文本摘要,人们可通过阅读摘要来把握文本主要内容,这不仅大大节省时间,更提高阅读效率。但人工摘要耗时又耗力,已不能满足日益增长的信息需求,因此借助计算机进行文本处理的自动文摘应运而生。近年来,自动摘要、信息检索、信息过滤、机器识别、等研究已成为了人们关注的热点。
IT派
2018/07/30
2K0
一个Python自动提取内容摘要的实践
【论文复现】上下位关系自动检测方法
本文复现论文 Hearst patterns revisited: Automatic hypernym detection from large text corpora[1] 提出的文本中上位词检测方法。
Eternity._
2024/11/27
2150
【论文复现】上下位关系自动检测方法
推荐阅读
相关推荐
无敌了,用Python给英语老师开发了个英语作文批改的神器(支持小学到雅思)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档