新技能Get!用 Python 高效背单词

开发 后端
作为一个程序员,经常需要阅读英文论文、文档、书籍。对于一些基础不好的同学来说,最主要的拦路虎是英语单词。计算机类文档不同于小说,其语法、句式都比较简单,可以说只要词汇量有了,阅读就很简单。

[[410261]]

本文转载自微信公众号「Python中文社区」,作者巩庆奎。转载本文请联系Python中文社区公众号。

背景

作为一个程序员,经常需要阅读英文论文、文档、书籍。对于一些基础不好的同学来说,最主要的拦路虎是英语单词。计算机类文档不同于小说,其语法、句式都比较简单,可以说只要词汇量有了,阅读就很简单。

如果能在平时提高词汇量,那是最好不过了。鸡汤警告!你必须暗自努力,然后惊艳所有人!这句话打在这里没毛病吧,老铁。但无所侧重地背普通英语字典,恐怕效率并不高。不提前学习单词,直接上手阅读,遇到生词再查,效率也提升不起来。

这里介绍一个针对专业文档背单词的方法:把当前文档的所有单词,建立一个专属字典,先背诵这个字典,再去看书,一定能一目十行。

思路

总体思路是文件分词统计,查找字典,生成新字典。

  • 首先,有一个需要阅读的英文文档,给它分词,按照单词频率排序;
  • 找一个已掌握的英语词汇表(四六级或考研等),把上文中的单词和本词汇表重复的项删除;
  • 再找一个词汇量大的字典,在其中查找对应解释;
  • 把结果存储到一个字典文件中。

得到的字典,就是这本书的专属字典了。业余背这个字典,相当于掌握了计算机专业英语。这个方法也适用于机械、电子等等任何专业英语的地方。

实现

下面,以 Python 神作《Fluent Python》为例,用 Python 自带的库实现分词、统计功能。首先看下它的内容梗概。

  1. Fluent Python  
  2. CLEAR, CONCISE, AND EFFECTIVE PROGRAMMING 
  3. Luciano Ramalho 
  4. ...... 

分词

首先来分词。

  1. from collections import Counter 
  2. import re 
  3. ct2 = Counter() 
  4. patt = re.compile(r'\w+'
  5. with open('f1.txt','r',encoding='utf-8'as f: 
  6.     for l in f.readlines(): 
  7.         ws = (n.lower() for n in patt.findall(l)) 
  8.         ct2.update(ws) 

以上代码中,导入了 Counter 和 re 模块。

Counter 负责统计单词词频,re 正则表达式分割英语单词。得到结果 ct2 中是所有单词的词频。

下面,把它保存下来。

  1. with open('result_f1.txt','w',encoding='utf-8'as f: 
  2.     f.write(''.join(('%s %s\n'%(a,b) for a,b in ct2.most_common())))  

现在,result_f1.txt 中存储的是这本书出现的单词,而且是按照词频排序的,如下。

  1. the 12414 
  2. a 5639 
  3. of 4900 
  4. in 4837 
  5. to 4689 
  6. is 3848 
  7. ...... 

和预想得很像,排名靠前的基本是介词等常用词。

另外,比较有意思的数据是,《Fluent Python》共使用词汇 9118 个,其中出现一次的单词有 3168 个。出现频次最高的 the 达到 12000 次。它的分布图如下。

载入字典

下载一个比较全的字典,十万个单词。载入内存,存储在字典数据变量 dicts 中。

  1. 这是 dict 结构第一次真正存储字典! 
  1. dicts = dict() 
  2. with open('103976.txt','r',encoding='gbk'as f: 
  3.     for l in f.readlines(): 
  4.         k = l[0:l.find('\t')] 
  5.         v = l[l.find('\t')+1:] 
  6.         dicts.update({k:v}) 

删除认识的单词

字典当中大量的 the a is,相当挑战我们的容忍度,这让旁人看了,还以为我们小学没毕业呢。去掉去掉……

众所周知,我们采用了小学二年级就掌握的 postgrade.txt 英文字典。

  1. postgrade.txt 同学们肯定耳熟能详。神奇的是第一个单词。abandon vt.离弃,丢弃;遗弃,抛弃;放弃 
  1. with open('postgrade.txt','r',encoding='utf-8'as f: 
  2.     f.readline() 
  3.     for l in f.readlines(): 
  4.         k = l[:l.find(' ')] 
  5.         try: 
  6.             del dicts[k] 
  7.         except KeyError as e: 
  8.             pass 

现在,字典 dicts 中,仅仅剩下所我们不认识的,103976 - 5000 = 98976 个单词了。

生成新字典

以词频单词来查找单词表,再把单词和释义存到新单词表中,就得到新单词表了。

  1. with open('f1_res.txt','w',encoding='utf-8'as wf,open('result_f1.txt','r',encoding='utf-8')as f: 
  2.     for l in f.readlines(): 
  3.         k = l[:l.find(' ')] 
  4.         v = dicts.get(k,None) 
  5.         if v: 
  6.             wf.write('%s %s'%(k,v)) 
  7. wf.close() 

这里第一句,两个 with 可以写到一句话里。这样代码看起来比较和谐。

查字典方法,使用v = dicts.get(k,None),这样查不着的单词,返回 None,写入新字典时判断这个值,就可以了。

总结

除此处介绍的生生单个文档字典外,还可多拿几个领域专业文档,提取它们的常用单词,然后生成专属字典,这字典,相当于相关领域的专业英语字典。

这里使用 Python 自带库写程序,效率可能不高。如果需要,可以使用 pandas 之类的库来实现,提高效率。

作者:巩庆奎,大奎,对计算机、电子信息工程感兴趣。

 

责任编辑:武晓燕 来源: Python中文社区
相关推荐

2021-07-09 09:31:04

getPython代码

2014-02-14 09:17:37

雅虎云计算服务基准YCSB

2019-09-10 15:18:44

云计算

2019-07-11 05:53:48

MySQL死锁数据

2019-06-24 09:10:31

Windows操作系统Windows 10

2011-09-06 11:20:37

2023-08-14 07:49:42

AI训练

2021-04-01 06:21:08

人工智能AI

2020-11-20 07:05:26

微信腾讯移动应用

2024-09-09 15:06:32

2017-01-03 09:20:11

Windows 10技能安装

2012-02-21 10:10:04

2018-08-30 15:36:11

NVIDIA GFE8K技能

2018-11-29 11:28:32

数据中心IT云计算

2022-07-25 11:33:48

Python大文件

2020-12-03 14:49:13

AI 技术 人工智能

2020-12-16 15:53:59

开发编程语言技术

2016-12-26 20:17:17

数据excel表效率

2011-09-20 09:51:43

程序员

2024-11-18 08:31:03

点赞
收藏

51CTO技术栈公众号