前段时间,答题 APP 如火如荼的发展,各大互联网公司都加入了撒币大战,包括像冲顶大会,百万英雄,芝士英雄等等。随之而来的也是各个答题应用辅助的兴起。

网上已经有不少答题应用的辅助,一般来说包括两个步骤,即获取题目选项以及搜索答案。对于题目以及选项的获取包括利用 adb 抓取手机屏幕截图,然后使用 ocr(optical character recognization) 的方式去识别题目和选项。大多数使用的 ocr 工具有谷歌开源的 tesseract-ocr以及百度的 ocr API。谷歌的 tesseract-ocr 可以在本地进行安装,软件下载地址是 https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.01.exe , 安装的时候注意选择增加中文简体语言包,否则无法识别中文。另外一种方法就是利用百度的 ocr API,可以免费申请,使用起来比较方便,识别率相对来说也更加准确。百度 API 还有一个优点是图片无需处理就可以进行识别,而 tesseract-ocr 一般还需要对图片进行简单的处理。获取题目以及选项的另外一种方式就是使用抓包工具去抓取 APP 请求从而获取题目以及选项信息。

另一方面,对于题目答案的搜索。常见的几种做法是直接用题目作为搜索关键字打开浏览器,或者是问题加选项搜索,获取搜索引擎搜索的结果数量。通过结果数量来判断问题和选项的相关性从而判断问题的答案,一般来说这种方式获取的答案都是不太准确的,一是因为现在题目的出题方式越来越诡异,二是相关性越大并不一定就意味着是正确答案。本来对于题目和选项的判断就是很难的一件事情,除非你能做出很完美的语意理解,否则很难判断出正确的选项。还有一种比较直白的方式就是建立题库。在本文中,我们讨论一种建立题库的方式,这里只是做一个简单的探索,未必在实际中就能够使用,因为题库必须足够全才能够发挥威力。

使用 elasticsearch 建立题库

本文主要讲解关于题库的建立方面的很小的一方面进行探索,对于答题辅助的使用可以阅读原文查看完整介绍,代码主要是基于TopSup 做了一些调整。Elasticsearch 将被用于题库的建立,对于 es 的安装可以查看第一篇文章。有人可能会觉得用 es 来做题库,简直就是高射炮打蚊子——小题大做。但我觉得 es 安装和使用都很方便,得益于其强大的 RESTFUL接口,几乎可以用任何工具操控 es。Talk is cheap, show me the code.

from elasticsearch import Elasticsearchdef write_quetion():question = {'question': '谁是世界上最帅的人','answer': 'Neal'}es = Elasticsearch({'localhost'})es.index(index='question-index', doc_type='question', id=1, body=question)

上面是一个简单的像索引中写入一条记录的代码片段,其实 es 可以算是一种非关系型数据库,在 DB-Engines 的最新排名中,es 已经蹿到了第 9 名。Elasticsearch 中的某些概念可以和关系型数据库进行类比:

关系型数据库 Elasticsearch
database index
table type
row document
column field

那么在 es 中搜索问题时应该这样:

def search_question(key_words):es = Elasticsearch({'localhost'})res = es.search(index='question-index', body={"query": {"match": {"question": key_words,"minimum_should_match": "75%"}}}})if res['hits'['total'] > 0:for hit in res['hits']['hits']:print(hit['_source']['question'] + ':' + hit['_source']['answer'])else:print('未搜索到类似结果')

从图片中获取问题和答案

题库的建立可以使用文本的方式或者直接使用答题应用的手机截图,毫无疑问后者是更有价值的。假设我们现在有一张这样的截图:

这张图片中已经包含了正确的选项,但我们如何识别这个图片并且知道这个正确答案呢?使用选项后面的数字么,不可行,正确答案并不一定是选择的最多的选项。感谢图像处理这门课程,里面有一个非常基础的概念帮我解决了这个问题。一般来说将彩色图片转化为灰度图片就是通过一个确定的函数将彩色空间映射到灰度空间。以 matlab 中将 RGB 图(可以理解为一张彩色图)转化为灰度图的 rgb2gray 函数为例,假设一个彩色像素的 RGB 值是 (R, G, B),那么它的灰度值 G 的计算方法应该是:

G = 0.2989 * R + 0.5870 * G + 0.1140 * B

业界的通用做法就是将按照一定的权重来计算彩色像素的灰度值。通过取色笔可以获取上图正确答案背景颜色的 RGB 值是(80, 215, 216),而错误答案背景颜色的 RGB 值是(194, 194, 194)。

今天教大家的是乘法分配律,秀了一波小学数学。言归正传,可以看出,彩色图像映射的灰度值更低。这对于我们区分正确选项和错误选项就有了重大的帮助。首先我们对选项区域进行裁剪,避免右边的数字影响识别结果。通过二值化算法,我们可以把问题选项图使用不同的阈值将图片转换成两张不同的图片,小于阈值的像素点变成黑色像素点,大于阈值的像素点编程白色像素点。二值化转换的算法非常简单:

def binarizing(img, threshold):pixdata = img.load()w, h = img.sizefor y in range(h):for x in range(w):if pixdata[x, y] < threshold:pixdata[x, y] = 0else:pixdata[x, y] = 255return img

通过阈值 120 和阈值 180(175到194之间的任意值都是可以的) 来获取二值化图片,结果分别为:

这下答案就呼之欲出了吧。我们将这两张图通过 ocr 的方式去识别,第一张图可以获取所有的选项,而第二张图只能获取错误的选项,那么二者的差异之处不正就是正确选项了嘛!是不是骨骼精奇,是不是没想到!

结语

本文就到此为止,本文主要是从一个很小的角度讲述一种建立题库的方式,使用一种图像处理的简单技术来获取正确的选项。是不是觉得学的课程还是有价值的。当然本文只是作为一种技术的探讨,并不一定保证实际中的可操作性,详细代码可以阅读原文查看。

以上。

欢迎搜索微信号 mad_coder 或者扫描二维码关注公众号:

聊聊答题应用题库的建立相关推荐

  1. 医学计算机应用第五版题库,医科医学计算机应用题库

    医科医学计算机应用题库 医学计算机应用第...章下列关于世界上第一台电子计算机的叙述中,不正确的是()..是年在美国诞生的.它主要采用电子管和继电器.它是首次采用存储程序和程序控制使计算机自动工作.它 ...

  2. 小米答题题库_拼多多果园答题题库74(每日更新)

    135编辑器 拼多多答题题库七十四 每周我们都会做一个总和的题库: 希望大家持续关注! 您的关注就是我们的动力! "成语之乡"指的是我国哪座城市? 1.河北邯郸  2.安徽蚌埠 答 ...

  3. 计算机自适应的应用领域,计算机自适应题库的建立

    摘    要:结合经典测量理论(CTT)和项目反应理论(IRT)的优点,建立了计算机自适应题库.本题库能为应试者建立更适合自己能力的个性化测验,在评估应试者真实能力方面取得了良好的效果. 关键词:计算 ...

  4. mysql数据库应用题库_MySQL数据库及应用题库附答案

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...

  5. mysql数据库应用题库_MySQL数据库及应用题库附参考答案.docx

    MySQL数据库及应用题库附参考答案.docx MySQLMySQL 数据库及应用题库附数据库及应用题库附参考参考答案答案 仅供参考 第一章测验 1 单选 计算机进行数据处理经历了从低级到高级的 __ ...

  6. 聊聊前端日志库在 SaaS 产品中的应用与设计

    文 | 元三 网易智企资深前端开发工程师 一.前言 笔者所在的公司业务主要是为企业提供全流程的企业服务和一整套 SaaS 解决方案.对于企业服务 SaaS 产品来说,客户完成购买并不意味着产品价值已经 ...

  7. linux 动态库建立,浅析linux下静态库和动态库的建立和使用

    在粤嵌学了很多知识,我们把常用的公用函数放在一起做成一个函数库,可以供其他程序共同使用,函数库本质上说,是一个可执行代码的二进制形式,可被操作系统载入内存执行.linux下的库分为两种:静态库,后缀名 ...

  8. 一亩三分地,答题题库,1point3acres (Time series,每周末答题一次/更新一次)

    一亩三分地对我的留学申请和签证提供了很多帮助.来美国之后,有两年没怎么上一亩三分地了,最近有看面经的需求,于是我又回到了一亩三分地的怀抱... 一亩三分地学了B站,注册新账户之后弄了一个考试.考试通过 ...

  9. 关于Protel 2004 绘制电路原理图——元件库的建立

    首先家里元件库存放路径 因为我是先做好的实验然后才开始写文档的,所以直接给出结果好啦: 我起名为PCB文件夹下,MYlibrary,方便以后我好找 这边我又细化看下,写了PCB文件夹,主要寸元件封装, ...

最新文章

  1. 无法连接NVIDIA驱动:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver
  2. 51Nod 1003 阶乘后面0的数量(数学,思维题)
  3. 世界机器人大会特种机器人报到高难度的高危险的活让它们来!
  4. Android内置第三方输入法
  5. Fedora19 搭建LAMP环境
  6. js清空本地存储_JS原理、方法与实践 本地存储
  7. 更新npm至最新版本
  8. vue2实践揭秘pdf_《Vue2.0 实践揭秘》终于出版啦!
  9. JPA 2 | 获取联接以及我们是否应该使用它们
  10. static关键字 void和void指针 函数指针
  11. CVPR2022车道线检测Efficient Lane Detection via Curve Modeling
  12. javascript 计算后 无聊的小数点处理
  13. [置顶] 高效前端优化工具--Fiddler入门教程
  14. 软件需求分析文档模板
  15. 伪原创工具,AI采集伪原创,内容伪原创工具
  16. 互联网教育:玩法与困境
  17. arm neon介绍
  18. 【特大消息】博客换地址啦!
  19. 真实感受一下县比省大不包邮,省市区乡镇多级数据重装上阵
  20. matlab建模DNA双链,matlab绘制DNA双螺旋结构模型三维图 请高手给详细步骤。 分重要,关键是我能学会。(可以加分)...

热门文章

  1. 智慧城市综合管理平台,以一种更智慧的方式促进城市运行
  2. SEO工具:5118大数据平台
  3. 弘康人寿借助区块链技术公开全部理赔结果
  4. flexnet许可证服务器_如何手动配置 Flexnet 许可管理程序
  5. mac下本地调试微信网页
  6. 威纶通触摸屏与两台汇川sv660p伺服modbus rtu通讯程序
  7. rhel 7.2 mysql_Rhel7.2Mysql数据库安装及配置
  8. uniapp - animation动画数组无效
  9. 软件工程需求分析—结对
  10. [Ruby笔记]3. 语法检查ruby -cw xx.rb /代码运行 ruby xx.rb/变量约定 @ @@ $