分享

如何用 Python 一键搞定 CET 4 最爱考的 5000 个单词?

 dxw555 2018-11-15

不会英语的程序员不是好程序员 ?笔者不敢乱立Flag ,但是我知道的是程序员就喜欢自己动手干些实事 ,比如今天教大家自己动手做个有意思的项目——从历年四级英语真题中获取词频最高的5000个词汇 ,并进行翻译!综合用到了爬虫 、数据分析等知识 ,亲爱的读者们不来试试吗 ?


程序介绍


这是一个单词频率统计程序 ,基于Python3 ,我将往年真题按照词频排序得到了四级词库 :总结出了5000个出现频率极高的单词。

  • 自动批量收集文件中的英语单词txt (utf-8);

  • 统计排序保存到本地数据库voca.db;

  • 翻译英文得到中文解释;

  • 数据库文件提取得到CSV表格;

在结合到大量的往年CET-4真题库的情况下

  • 本软件成为了考试必备词库

  • 希望大家都能轻松过四级。  


工作流程


  1. settings.py配置查询文档;  

  2. work.py自动分析数据保存至voca.db数据库文件;  

  3. translate.py自动打开数据库调用API翻译单词并保存到数据库里;  

  4. db2csv.py将数据库文件转换成csv表格文件;  

  • python work.py;

  • python translate.py;

  • python db2csv.py。


具体实现


数据(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)


收获成果啦


翻译过程:

出现次数最多的简单词:

出现次数较少,值得一背的词:

作者简介:小詹,一名双一流高校在读研究生 ,目前维护个人订阅号[小詹学Python]。主要涉及图像处理、网络爬虫、leetcode刷题和一些有趣的Python骚操作。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多