查看原文
其他

​我拿 12 年 36 套四级真题做了什么 ?

我爱小詹 Ahab杂货铺 2019-02-25


天凉了,四级还会远吗?今天的推送是之前在小詹公众号的一篇文章,阅读完以后感叹网友真的无所不能,昨天晚上把程序跑了一遍没什么问题,今天就把这个有意思的项目分享给大家。


程序介绍

这是一个单词频率统计程序 ,基于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)

收获成果啦

翻译过程

出现次数最多的简单词

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




上述完整代码和获取到的统计结果(5000个高频词)可以加小编微信来获取。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存