Python 刷英语六级段落匹配仅需 3 秒?
作者 | 叶庭云
来源 | AI庭云君
一、前言
一年二度的四六级考试就此落下帷幕,本次考试体验感极强,反手就是一个 "五星好评"

本文利用 Python 的模糊匹配方法来刷英语六级段落匹配,仅需要3秒!Python的 FuzzyWuzzy 库,是一个易用而又强大的模糊字符串匹配工具包。它依据 Levenshtein Distance 算法,计算两个序列之间的差异。Levenshtein Distance算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
后面的编程都是在 jupyter notebook 环境中,安装 FuzzyWuzzy 库如下所示:
pip install fuzzywuzzy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
二、fuzz模块
导入方法,直接导入这个模块的话,系统会提示UserWarning,这不代表报错,程序依旧可以运行(使用的默认算法,执行速度较慢),可以按照系统的提示安装 python-Levenshtein 库进行辅助,这有利于提高计算的速度。
1. 简单匹配
这个其实不怎么精确,也不常用,测试如下:

2. 部分匹配(Partial Ratio)
尽量使用部分匹配,精度较高!测试如下:

可以发现,fuzz.partial_ratio(S1, S2)部分匹配,如果 S2 是 S1 的子串依然返回100
3. 忽略顺序匹配(Token Sort Ratio)
原理:以 空格 为分隔符,小写化所有字母,无视空格外的其它标点符号,测试如下:

fuzz.token_sort_ratio(S1,S2)比较S1,S2单词是否相同,不考虑词语之间的顺序。
4. 去重子集匹配(Token Set Ratio)
相当于比对之前有一个集合去重的过程,注意最后两个,可理解为该方法是在 token_sort_ratio 方法的基础上添加了集合去重的功能,下面三个匹配的都是倒序。
fuzz的这几个 ratio 函数最后得到的结果都是匹配数值,如果需要获得匹配度最高的字符串结果,还需要依旧自己的数据类型选择不同的函数,然后再进行结果提取,如果但看文本数据的匹配程度使用这种方式是可以量化的,但是对于我们要提取匹配的结果来说就不是很方便了,因此就有了 process 模块。
三、process模块
用于处理备选答案有限的情况,返回模糊匹配的字符串和相似度。测试如下:

四、实践
实践当然就是利用 fuzz 模块来刷英语六级段落匹配,看看结果怎么样!!
知乎找到一个网址可以下载六级真题PDF:
https://pan.uvooc.com/Learn/CET/
它的 PDF 直接编辑不了,貌似是扫描的。这里我们用 Adobe Acrobat Pro DC 识别后,将阅读材料和要匹配的选项直接复制粘贴到 txt 里面。


顺便说一下:利用 Adobe Acrobat Pro DC 裁剪页面提取 PDF 里的矢量图保存下来,图像放大不会失真,你直接截图的话,放大肯定会失真的。
读取 txt 数据,组织成字典:
with open("Englishreading.txt", "r", encoding="utf-8") as f1:con1 = f1.read().split("\n")
dic1 = {}
for i in con1:data = i.split(":")dic1[data[0]] = data[1]print(dic1)
with open("match.txt", "r") as f2:con2 = f2.read().split("\n")dic2 = {}
for i in con2:data = i.split(":")dic2[data[0]] = data[1]
print(dic2)
先简单测试一个,比如一个是匹配F,如下所示:

test_str = "Marconi was central to our present-day understanding of communication."
# test_str = "As an adult, Marconi had an intuition that he had to be loyal to politicians in order to be influential."
big_lst = []
for k, v in dic1.items():sentence = [x.strip(" ") for x in v.split(".")]scores = []for a in sentence:score = fuzz.partial_ratio(a, test_str)scores.append(score)# print(scores, sum(scores), round(sum(scores) / len(scores), 2))k_score = sum(scores) * 0.2 + sum(scores) / len(scores)big_lst.append((k, scores, round(k_score, 2)))results = sorted(big_lst, key=lambda x: x[2], reverse=True)
print(results)
print(results[0][0])

得到答案也是 F,我们的算法做对了!最后刷整个英语六级段落匹配(10个题),结果如下:
# -*- coding: UTF-8 -*-
"""
@Author :叶庭云
@公众号 :AI庭云君
@CSDN :https://yetingyun.blog.csdn.net/
"""
answers = []
for idx, ans in dic2.items():big_lst = []for k, v in dic1.items():sentence = [x.strip(" ") for x in v.split(".")]scores = []for a in sentence:# score = fuzz.token_sort_ratio(a, ans)score = fuzz.partial_ratio(a, ans)if score > 30:scores.append(score)scores.sort()if len(scores) >= 2:max_ = max(scores) + scores[-2]else:max_ = max(scores)big_lst.append((k, max_, scores))results = sorted(big_lst, key=lambda x: x[1], reverse=True)print(results)print("-" * 66)answers.append(results[0][0])print("answer:", answers)
感兴趣的读者后面可以自行动手实践呀,看看能对多少个。
往
期
回
顾
资讯
OpenAI开放GPT-3微调功能
技术
LTSM实现多元素时序数据预测
资讯
380万播放量,机器学习视频
技术
从深度学习到深度森林方法
分享
点收藏
点点赞
点在看
相关文章:

在自己的网站添加关注新浪关注按钮
有2种方法 第一种是参照新浪开发平台的API 地址如下: http://open.weibo.com/widget/followbutton.php 第二种是在html页面引入一段js <iframe allowtransparency"" border"0" frameborder"0" height"22" marginheight…

pandas中DataFrame的ix,loc,iloc索引方式的异同
pandas中DataFrame的ix,loc,iloc索引方式的异同 1、loc: 按照标签索引,范围包括start和end 2、iloc: 在位置上进行索引,不包括end 3、ix: 先在index上索引,索引不到就在index的位置上进行索引(如果index非全…

Linux crontab 命令格式
基本格式 :* * * * * command分 时 日 月 周 命令 第1列表示分钟1~59 每分钟用*或者 */1表示第2列表示小时1~23(0表示0点)第3列表示日期1~31第4列表示月份1~12第5列标识号星期0&#x…

5分钟学会打游戏的活体人脑细胞,比 AI 学习速度更快
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 在人工智能研究领域,最有前景的途径之一是尝试让软件模拟人脑的工作方式。 在两年前就有媒体报道称,澳大利亚生物科技初创公司 Cortical Labs 正致力于把真正的生物神经元嵌入到…

如何进行屏幕录制?
为什么80%的码农都做不了架构师?>>> 推荐的软件 屏幕录像专家选择avi输出,编码选择x264或者xvid total video converter将 avi格式转为mp4 优酷客户端也可以将 avi格式转为mp4。 狸窝全能视频转换器也可以将 avi格式转为mp4。 我使用格式工厂…

如何用ABAP代码读取CDS view association的数据
我有如下一个CDS view, 这个view的数据来自CRMD_ORDERADM_H, 定义了一个名称为_statushelp的association, 指向了另一个CDS view Z_C_Status_Valuehelp.该view暴露了两个字段STATUS_KEY和STATUS_TEXT. 现在我的需求是:在ABAP代码里只需要一次读操作,既能…

linux Crontab 使用
cron用法说明cron的用法老是记不住,索性写下来备忘。下文内容大部分是根据《Cron Help Guide》翻译而来,有些部分是自己加上的。全文如下:cron来源于希腊单词chronos(意为“时间”),是linux系统下一个自动执…

iOS开发之圆角指定
如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架)。而若要指定某几个角(小于4)为圆角而别的不变时,这种方法就不好用了。…

网友抱怨:「苹果除了每年收我的钱,似乎什么都不想做」
整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)一直以来,苹果的开发者账号都贵得众所周知。不仅每年都要续费,一年费用甚至比微软和 Google 开发者账号的一次性收费还高:微软 MicroSoft Developer 账号&#x…

PHP最简单写文件记日志当前时间
定义和用法 fopen() 函数打开文件或者 URL。 如果打开失败,本函数返回 FALSE。 语法 fopen(filename,mode,include_path,context)参数描述filename必需。规定要打开的文件或 URL。mode必需。规定要求到该文件/流的访问类型。可能的值见下表。include_path可选。如果…

【MySQL笔记】mysql来源安装/配置步骤和支持中国gbk/gb2312编码配置
不久的学习笔记。分享。我想有很大的帮助谁刚开始学习其他人的 备注:该票据于mysql-5.1.73版本号例如 1. mysql源代码编译/安装步骤 1) 官网下载mysql源代码并解压 2) cd至源代码文件夹。运行 ./configure --prefix/home/slvher/tools/mysql-5.1.73 --with-charset…

预告|开源操作系统年度技术会议
本次会议的主会场设在麒麟软件(北京),由于疫情原因,为尽量减少讲师和参会人员因疫情带来的出行不便,我们同时在北京、上海和深圳设置三个线下交流的分会场。 有部分讲师和圈内大咖将会在三个分会场与大家面对面交流&a…

“智享未来 知行合一”,开为科技AI产品发布会于2月6日召开
届时,开为科技将展示系列装有自研人脸识别算法的人工智能硬件产品,包括人证比对一体机、人脸识别双面闸机、人脸访客广告机等。 过去一年,人工智能的新闻铺天盖地,发展速度之快让人目不暇接,各大巨头纷纷布局…

linux下history(历史)命令用法详解
如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率。本文将通过实例的方式向你介绍 history 命令的15个用法。1. 使用 HISTTIMEFORMAT 显示时间戳当你从命令行执行 history 命令后,通常只会显示已执…

js获取当前页面的URL信息
2019独角兽企业重金招聘Python工程师标准>>> window.location属性 描述 hash 设置或获取 href 属性中在井号“#”后面的分段。 host 设置或获取 location 或 URL 的 hostname 和 port 号码。 hostname 设置或获取 location 或 URL 的主机名称部分。 href 设置或获取…

超前探秘首个国产元宇宙百度“希壤”:率先实现10万人同屏互动
12月21日,百度发布的首个国产元宇宙产品“希壤”正式开放定向内测,用户凭邀请码可以进入希壤空间进行超前体验。百度方面表示,12月27日“希壤”将面向所有用户开放,届时百度Create 2021(百度AI开发者大会)将…

什么是跨域?怎么解决跨域问题?
什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子&#…

mysql 使用位运算
如果你不知道什么是位运算的话, 那么请你先去看看基础的C语言教程吧。 与运算 a & b , 或运算 a | b , 异或运算 a ^ b ,或者 你也可以将 与运算理解为 法 例如 1|2 3 (12 3) 1|2|4 7 (124 7)将 异…

轻松抓鸡蛋、剪纸、夹芯片,这只“机械爪”堪比人手!
作者 | 学术头条来源 | 学术头条如果机器手能执行与人手一样的功能,那在执行任务时就可拥有高度的灵活性。然而,在保持人手般灵巧度和抓握力等重要功能的同时,开发无需额外驱动部件的集成机器手是一项挑战。因为驱动部件使得这些机器手很难集…

Js_Span 滑动手型鼠标样式
<span style"cursor: pointer;">搜索</span> 为了可以更灵活控制. 使用span布局 加上滑动手型鼠标样式. 配合JS各种自定义按钮样式. ZhLingF W转载于:https://www.cnblogs.com/may26/p/4689219.html

No.6 PHP的基本配置与优化
PHP下载http://www.php.net/downloads.php安装yum -y install libxml2-devel libcurl-devel libjpeg-devel libpng-devel freetype-devel libxslt-devel gcc gcc-copenssl-develtar xf php-7.2.3.tar.bz2 -C /tmp./configure --prefix/usr/local/php --with-curl --with-freety…

php连接Mysql
<?php echo "This is a test</br>"; echo "asdfasdfadsf"; $mysql_server_name"localhost:3306"; //数据库服务器名称 $mysql_username"root"; // 连接数据库用户名 $mysql_password"rootpass"; // 连…

谁是 2021「IT 圈」年度 C 位?快来报名,彰显你的影响力!
2021年,数字化转型正磅礴兴起,大批传统企业正在拥抱数字化,云计算、大数据、AI、5G应用能力正在变成企业的核心竞争力;核心技术正在崛起,在操作系统、数据库,依靠开源的力量,众多开发者背后的行…

为什么Scrum模式适合软件开发?
2019独角兽企业重金招聘Python工程师标准>>> 摘自基于Visual Studio 2010 进行敏捷/Scrum模式开发 软件行业至今已经有超过40年的历史,很多在软件工程中的管理方法都是在不断摸索中改进而来的。早期的软件行业由于规模有限,绝大多数属于作坊型…
一分钟了解 TCP/IP 模型
原文讲的不是特别细,为了便于理解,我颠倒了顺序。写在开始 我们需要知道协议到底是什么。 在网络上,一个协议对应于管理系统之间如何相互通信的规则。然后我们需要知道什么是协议族。 一个协议族是一系列协同工作的协议的集合。什么是 TCP/IP…

网站流量UV是什么意思?什么是流量UV/PV/IP
雅虎统计基础数据定义PV(访问量): 即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。 UV(独立访客): 即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。IP(独立IP)…

摇橹船以“硬科技+人工智能”助推高质量发展
12月13日和14日,2021雷克大会暨智能经济年会在线上成功举办,大会得到了专业观众和行业媒体的广泛关注,全网累计数万人次在线观看直播。 本届大会聚焦产业智能化、智能基础设施、智能产业化和机器人产业发展助力智能经济等议题。专家学者和企…

一句话的设计模式(转)
如题,实际上,我想这是很困难的。 除非——只是为了给自己做一个提醒,能够看一眼就快速回想起该设计模式的种种记忆。 下列是我之前在学习《大话设计模式》时做的笔记总结,当中有部分措辞来自其作者程杰。(非常感谢他为…

高性能ORM框架XLinq功能详细介绍
之前简单介绍了XLinq的一些功能,有很多功能都没有提到,现在给XLinq加了一些功能,这次把所有功能都介绍一遍。 设计目标 易用性 在使用一个框架的时候 应该没几个人会喜欢写一大堆的配置文件吧 也应该没几个人会喜欢为了完成一个小功能却需要写…

太好玩了,爬虫、部署API、加小程序,一条龙玩转知乎热榜!
作者 | 周萝卜来源 | 萝卜大杂烩一直想做一个从爬虫到数据处理,到API部署,再到小程序展示的一条龙项目,最近抽了些时间,实现了一个关于知乎热榜的,今天就来分享一下!数据爬取首先我们看下需要爬取的知乎热榜…