用Python自制考研英语单词手册

本文目标:

从考研英语往年真题中提取单词,统计单词出现次数,按照频数排序并写入表格文件

第一步

导入必要的库

其中re用于文本处理,jieba用于分词,pandas用于写入表格文件

1
2
3
import re
import jieba
import pandas as pd

第二步

打开文件

1
file=open('/home/fantasy/Desktop/kyyy.txt').read()

第三步

文本处理

1
2
3
4
for line in file:
line=line.strip('\n')
#去除文本中的中文符号和英文符号
line=re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——__!,。.,\??、~@#¥%……&*()]+", "",line)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 大佬请自动忽略这段辣眼睛的代码qaq~^---^~~~
file = re.sub('________', '',file)
file=re.sub('__','',file)
file=re.sub('\n','',file)
file=re.sub('','',file)
file=re.sub(',','',file)
#file=re.sub('.','',file)
file=re.sub(r'[^\x00-\x7f]', '', file)#去掉中文字符串
file=re.sub('[A]','',file)
file=re.sub('[B]','',file)
file=re.sub('[C]','',file)
file=re.sub('[D]','',file)
#file=re.sub('[]','',file)

file=re.sub('\t','',file)
file=re.sub('()','',file)
file=re.sub('---!!!','',file)
file=re.sub('\[]','',file)
file=re.sub('、','',file)
file=re.sub("''",'',file)
1
2
f=jieba.cut(file,' ' )
f=','.join(f)

第四步

利用字典数据结构统计词频并存入

1
2
3
4
5
6
7
8
9
counter = {}
# 如果字典里有该词则加1,否则添加入字典
for s in f.split(','):
if s not in counter:
counter[s] = 1
else:
counter[s] += 1
#词频从高到低排序
sorted_counter=sorted(counter.items(),key = lambda x:x[1],reverse = True)
1
2
3
4
5
#忽略的常用词汇
ignore=['one','two','three','four','five','six','seven','eight','nine','the','of','can','may','should','in','a','an','to','and','am','is','are','be','on','that',
'this','be','he','she','you','me','him','her','mom','son','sister','brother','with','it','go','run','bed',
'home','house','great','yes','no','nope','yep','but','by','do','doing','done','over','as','who','would','the','not','or','will','have','from','their','than',
'its','all','up','down','how','for','the','like']

第五步

设定提取规则

1
2
3
4
5
6
7
8
#提取设定规则的单词及其频数
word=[]
values=[]
for i in sorted_counter:
if i[0] not in ignore and len(i[0])>3:
c=i[0].lower()
word.append(c)
values.append(i[1])
1
len(word)==len(values)
True

第六步

将词频大于1的单词写入文件并保存之

1
2
#创建一个空的数据框
result=pd.DataFrame(columns=('word','freq'))
1
2
3
#写入文件
result['word']=word
result['freq']=values
1
2
#只提取出现次数大于1的单词
final_words_file=result.loc[result['freq']>1,:]
1
2
#保存文件
final_words_file.to_csv('/home/fantasy/Desktop/kyyy.csv')

~~~~~~~~~~华丽的分割线~~~~~~~~~~~

第七步

翻译单词

以下翻译过程暂时未完成,有时间再研究下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#翻译
import http.client
import hashlib
from urllib import parse
import random

appid = '20181008000216770'
secretKey = '2fWF_wlQ5sifMJVKWqFF'
httpClient = None
myurl = '/api/trans/vip/translate'
fromLang='en'
toLang = 'zh'
salt = random.randint(32768, 65536)
for i in range(len(word)):
q=word[i]
print(q)
sign = appid+q+str(salt)+secretKey
m1 = hashlib.md5()
m1.update(sign.encode(encoding='utf-8'))
sign = m1.hexdigest()
myurl = myurl+'?appid='+appid+'&q='+parse.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign


try:
httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
response = httpClient.getresponse()
stri = response.read().decode('utf-8')
stri = eval(str)
for line in str['trans_result']:
file.write(line['dst']+'\n')
except Exception as e:
print(e)
finally:
if httpClient:
httpClient.close()
they
eval() arg 1 must be a string, bytes or code object
more
eval() arg 1 must be a string, bytes or code object
points
eval() arg 1 must be a string, bytes or code object
there
eval() arg 1 must be a string, bytes or code object
were
eval() arg 1 must be a string, bytes or code object
......

后记:

这次用到的文本文件是截止到2010年之前的考研英语真题,其原始格式是word,内容被copy至新建的txt文件中,并且部分单词拼写有误或者“被空格中断”,所以在最后get的表格文件中有大约2%的单词拼写不准确(但还可以分辨出来),如果想要使得最后获取的表格文件更加准确,可以应用更合格(单词错误率低+更多文本数据,比如加入2011至今的题目(这次因为没有找到合适的近八年真题文件,所以没有统计这一部分))的文本文件来进行上述处理。

这就好比机器学习中用于模型训练和测试的数据集一样,数据的真实性和准确性越高,则模型的拟合效果越好,其预测或分类能力也就越强。

当然,你也可以搜集高考单词,四六级单词等等进行同样的处理。发现没有,举一个栗子可以返好多栗子嘞

凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条