作者 | 叶庭云

来源 | 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万播放量,机器学习视频

技术

从深度学习到深度森林方法

分享

点收藏

点点赞

点在看

Python 刷英语六级段落匹配仅需 3 秒?相关推荐

  1. Python模糊匹配 | 刷英语六级段落匹配只需要3秒?

    一.前言 一年二度的四六级考试就此落下帷幕,本次考试体验感极强,反手就是一个 "五星好评" 星光不负赶路人,时光不负有心人,想要轻松通过四六级.还得是脚踏实地,一步一个脚印,做好充 ...

  2. 英语六级段落匹配技巧

    英语六级段落匹配技巧 1.做题方法 2.什么样的词不标 3.什么样的词标出 4.如何找线索

  3. python数据分析要求高性能计算机_仅需1秒!搞定100万行数据:超强Python数据分析利器...

    作者:Maarten.Roman.Jovan 编译:1+1=6 1.前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 ...

  4. 超级计算机算200p什么意思,超级计算机一万年的运算仅需200秒,量子霸权的神话真的能实现吗?...

    原标题:超级计算机一万年的运算仅需200秒,量子霸权的神话真的能实现吗? 近日,一篇刊登在NASA官网的重量级文章引起全球热议.谷歌的科研人员利用一台53量子比特的量子计算机成功执行了一项计算任务,2 ...

  5. 亿条数据读取工具_仅需1秒!搞定100万行数据:超强Python数据分析利器

    作者:Maarten.Roman.Jovan 编译:1+1=6 1.前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 ...

  6. 仅需1秒!搞定100万行数据:超强Python数据分析利器

    前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 Vaex 很多人学习python,不知道从何学起. 很多人学习py ...

  7. python秒转换成小时分钟秒_仅需1秒!搞定100万行数据:超强Python数据分析利器...

    文章来源:量化投资与机器学习 作者:Maarten.Roman.Jovan 编译:1+1=6 1 前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介 ...

  8. 处理100万条数据 python_仅需1秒!搞定100万行数据:超强Python数据分析利器

    作者:Maarten.Roman.Jovan 编译:1+1=6 1.前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 ...

  9. 仅需1秒!搞定100万行数据:超强Python数据分析利器!掌握了吗!

    1 前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 Vaex Vaex是 一种更快.更安全.总体上更方便的方法,可 ...

最新文章

  1. 【C++】重载运算符(二)
  2. http status 汇总
  3. Linux系统分析之启动流程
  4. PAT甲级1011 World Cup Betting:[C++题解]模拟
  5. Eclipse导入项目facet版本问题:Project facet Java version 1.8 is not supported
  6. 几种常见的RAID形式
  7. Python 第三方模块之 beautifulsoup(bs4)- 解析 HTML
  8. linux lnmp1.5.tar.gz,Linux 下lnmp
  9. 设计灵感|排版太死板?提高品质的角度很重要
  10. 转换成的jar文件接收后台的信息乱码cmd解决办法
  11. 第二阶段团队冲刺站立会议05
  12. firefox浏览器全键盘操作
  13. ubuntu 18.04 增加新磁盘、挂载、格式化
  14. ActiveMQ实现负载均衡+高可用部署方案 -转载
  15. 分享正在构想的开源门户/B2B框架理念 与现有流行的门户系统/B2B系统有很大不同...
  16. paip.JAVA的几大优点与缺点相比C#.NET.txt
  17. Oracle数据库文件中的导入\导出(imp/exp命令)
  18. 2020年Spring学习笔记目录
  19. scratch游戏中背景移动的奥秘
  20. EDA学习1.3之开关的封装

热门文章

  1. 最热开源无服务器函数:五大Fission架构参考
  2. Feign实现服务调用
  3. Airlaunch 快捷设置代码分享
  4. Java开发常用Linux命令
  5. Mysql INSERT、REPLACE、UPDATE的区别
  6. 屏蔽“网页上有错误”提示,屏蔽java script 错误的代码
  7. Vue2.0中引入element-ui
  8. Banner图的播放
  9. Spring Cloud(四)服务提供者 Eureka + 服务消费者 Feign
  10. Ubuntu双击运行Shell脚本