一、前言
一年二度的四六級考試就此落下帷幕,本次考試體驗感極強,反手就是一個 “五星好評”

星光不負趕路人,時光不負有心人,想要輕松通過四六級,還得是腳踏實地,一步一個腳印,做好充足的復習準備,預祝大家無論是期末考還是四六級,都能取得理想的成績,然后回家過個好年~~
本文利用 Python 的模糊匹配方法來刷英語六級段落匹配,僅需要3秒!Python的 FuzzyWuzzy 庫,是一個易用而又強大的模糊字串匹配工具包,它依據 Levenshtein Distance 演算法,計算兩個序列之間的差異,Levenshtein Distance演算法,又叫 Edit Distance 演算法,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符,洗掉一個字符,一般來說,編輯距離越小,兩個串的相似度越大,

Github傳送門:https://github.com/seatgeek/fuzzywuzzy
后面的編程都是在 jupyter notebook 中,安裝 FuzzyWuzzy 庫如下所示:
pip install fuzzywuzzy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
原文鏈接:https://yetingyun.blog.csdn.net/article/details/122022033
未經作者允許,禁止轉載,更勿做其他用途,違者必究,
二、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 : 葉庭云
@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)


本文利用 Python 的模糊匹配方法來刷英語六級段落匹配,僅需要3秒!(還是在列印了中間結果的情況下),選取的是 2021 年 6 月英語六級真題(卷一)來進行測驗,昨天剛考的六級,網上還沒有找到能用的真題PDF,感興趣的讀者后面可以自行動手實踐呀,看看能對多少個,不會吧不會吧,不會有人六級錯兩個以上吧🚀🚀
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/386601.html
標籤:python
下一篇:那些年,我們畫過的圣誕樹
