如何用 Python 一键搞定 CET 4 最爱考的 5000 个单词?
不会英语的程序员不是好程序员 ?笔者不敢乱立Flag ,但是我知道的是程序员就喜欢自己动手干些实事 ,比如今天教大家自己动手做个有意思的项目——从历年四级英语真题中获取词频最高的5000个词汇 ,并进行翻译!综合用到了爬虫 、数据分析等知识 ,亲爱的读者们不来试试吗 ?
1.程序介绍
这是一个单词频率统计程序 ,基于Python3 ,我将往年真题按照词频排序得到了四级词库 :总结出了5000个出现频率极高的单词。
- 自动批量收集文件中的英语单词txt (utf-8);
- 统计排序保存到本地数据库voca.db;
- 翻译英文得到中文解释;
- 数据库文件提取得到CSV表格;
在结合到大量的往年CET-4真题库的情况下
- 本软件成为了考试必备词库;
- 希望大家都能轻松过四级。
2.工作流程
- settings.py配置查询文档;
- work.py自动分析数据保存至voca.db数据库文件;
- translate.py自动打开数据库调用API翻译单词并保存到数据库里;
- db2csv.py将数据库文件转换成csv表格文件;
- python work.py;
- python translate.py;
- python db2csv.py。
3.具体实现
数据(Docx复杂的文档结构不好用,可以在Word里面以TXT方式保存)。
读入文件拿到所有单词:
def _open_file(self,filename):#打开文件,返回所有单词list with open(filename,'r',encoding='utf-8')as f: raw_words = f.read() low_words = raw_words.lower() words = re.findall('[a-z]+',low_words) #正则re找到所有单词 return words
剔除常用单词(is am are do……):
def _filter_words(self,raw_words,count=NUMBERS):#载入未处理的所有单词列表 和 默认count值 new_words = [] for word in raw_words:#找出非exclude 和 长度大于1 的单词 -> new_words if word not in exclude_list and len(word) > 1: new_words.append(word) pass
计数:
from collections import Counter #计数器 pass c = Counter(words) #list new_words return c.most_common(5000) #拿到出现次数最多的5000单词,返回从大到小的排序list[(and,1),....]
数据库初始化Peewee模块:
from peewee import * db = SqliteDatabase('voca.db') class NewWord(Model): # 单词名 name = CharField() # 解释 explanation = TextField(default='') # 词频 frequency = IntegerField(default=0) # 音标 phonogram = CharField(default='') class Meta: database = db
加入单词到数据库:
def insert_data(self,words_times): # 向数据库内插入数据 for word,fre in words_times: word_ins = NewWord.create(name = word , frequency = fre) #直接调用create book.is_analyzed = True book.save()
翻译:
#iciba翻译函数 def trans(self, word): url = 'http://www.iciba.com/index.php?a=getWordMean&c=search&word=' + word try: req = requests.get(url) req.raise_for_status() info = req.json() data = info['baesInfo']['symbols'][0] assert info['baesInfo']['symbols'][0] # 去除没有音标的单词 assert data['ph_am'] and data['ph_en'] # 去除没有词性的单词 assert data['parts'][0]['part'] except: return ('none','none') ph_en = '英 [' + data['ph_en'] + ']' ph_am = '美 [' + data['ph_am'] + ']' ex = '' for part in data['parts']: ex += part['part'] + ';'.join(part['means']) + ';' return ph_en+ph_am, ex #调用翻译函数,保存中文到数据库 for i in NewWord.select(): i.explanation = str(t.trans(i.name)[1]) i.save()
提取所有单词到CSV:
import csv #提取所有数据库内容生成迭代对象 yield ~ 好好看看如何使用 def extract() pass for word in NewWord.select(): for i in [word.name, word.explanation, word.frequency]: datas.append(i) yield datas #保存函数 def save(data): with open('words.csv', 'a+', errors='ignore', newline='')as f: csv_writer = csv.writer(f) csv_writer.writerow(data) #主程序 datas = extract() #yeild 迭代对象 while True: try: data = next(datas) except: break save(data)
4.收获成果啦
翻译过程:
出现次数最多的简单词:
出现次数较少,值得一背的词:
作者简介:小詹,一名双一流高校在读研究生 ,目前维护个人订阅号[小詹学Python]。主要涉及图像处理、网络爬虫、leetcode刷题和一些有趣的Python骚操作。
本文系作者投稿,版权归作者所有。
“征稿啦”
CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。
如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱([email protected])。