很多人免不了参加各种英语考试,词汇量就是参加英语考试的一个拦路虎,单词不认识,技巧再多也枉然。但考试大纲要求的单词太多了,时间紧,任务重,背了又容易忘,如果能知道真题中词汇出现的频率高低,那么有意识的去记忆出现频率较高的词汇,不失为一种有效的记单词方法。本文为了解决这个问题,以近三年六级真题词频统计为例,使用Python开发了一个简单的统计单词频率的程序。

第一步:准备真题文档

新建文件夹,命名为:file_library_txt,也可自己取名,只要改变python程序中file_library变量值即可

从网上下载近三年真题的word文档,并复制全文,新建tx文档,粘贴,另存为utf-8格式文件

本文下载了英语六级近三年(2016年12月到2019年6月)共6次考试的真题,每次3套题,一共18套题

第二步:编写Python程序文件

#!/usr/bin/python3.7

# -*- coding: utf-8 -*-

# function 自动统计英语单词词频,不翻译

import re

import os

from matplotlib import pyplot as plt

file_library = "./file_library_txt"

txt_file_name = 'combine.txt'

result_file_name = 'result.txt'

# 合并txt文件

def combine_txt(folder, combine_file_name):

# 获取目标文件夹中的文件名称列表

filenames = os.listdir(folder)

# 打开当前目录下的result.txt文件,如果没有则创建

f = open(combine_file_name, 'w', encoding='utf-8')

# 先遍历文件目录

for filename in filenames:

filepath = folder + '/' + filename

filenames_txt = os.listdir(filepath)

for filename_txt in filenames_txt:

file_txt = filepath + '/' + filename_txt

# print(file_txt)

# 遍历单个文件,读取行数

for line in open(file_txt, encoding='utf-8'):

f.writelines(line)

f.write('\n')

# 关闭文件

f.close()

# 获取txt文件内容

def gettext(file):

txt = open(file, "r", errors='ignore', encoding='utf-8').read()

txt = txt.lower()

return txt

# 统计txt文件中英文单词出现频率

def stat_freq(file_name, min_len=2, max_len=20):

content = gettext(file_name)

words = re.split(r'[^A-Za-z]+', content)

new_words = []

for word in words:

if (len(word) >= min_len) and (len(word) <= max_len):

new_words.append(word)

total_word = len(new_words)

counts = {}

for word in new_words:

counts[word] = counts.get(word, 0) + 1

items = list(counts.items())

items.sort(key=lambda w: w[1], reverse=True)

f = open(result_file_name, 'w', encoding='utf-8')

f.writelines("{0:<6}\t{1:<20}\t{2:<6}\t{3:<5}\t{4:>5}".format("No", "Word", "Count", "Freq", "Cum_Freq"))

f.write('\n')

f.writelines("{0:<6}\t{1:<20}\t{2:<6}\t{3:<5}\t{4:>5}".format(len(items), "all_word", total_word, "100%", "100%"))

f.write('\n')

f.writelines("___________________________________________________________________")

f.write('\n')

cnt = []

cum_fre = 0

for i in range(len(items)):

word, count = items[i]

cum_fre = cum_fre + count

f.writelines("{0:<6}\t{1:<20}\t{2:<6}\t{3:.4%}\t{4:.4%}".format(i+1, word, count, count/total_word, cum_fre/total_word))

f.write('\n')

cnt.append(count)

# 关闭文件

f.close()

# 绘制频率图

plt.bar(list(range(1, len(cnt)+1)), cnt, align='center')

plt.axis([1, len(cnt)+1, 1, cnt[len(cnt)//30]])

plt.title('Word frequency')

plt.xlabel('X axis')

plt.ylabel('Y axis')

plt.savefig('freq.png')

plt.show()

combine_txt(file_library, txt_file_name)

stat_freq(txt_file_name)

第三步:运行程序

生成的统计结果txt文件如下:

18套题中一共提取出了67595个英语单词,共计有7949个不同的单词,出现频率最高的是the,出现次数高达3643次,频率占比约5.4%,平均每套题就有5.4%左右的单词是the

让人兴奋的是,从概率上讲,掌握了600多个高频单词,就可以认识一套试题中70%左右的单词

出现次数较少的单词,平均3年才一遇的单词都在末尾,只出现一次的单词总计有7949-4327+1=3603个单词,单词占比约45.33%,频率占比总计约为5.3%

平均每篇真题都出现的单词(必备词汇)大约有520个左右,单词占比约6.54%,频率占比约为67.77%

当然,可以很清楚的看到,超高频词都是一些简单词汇,大部分还是连词、介词等词汇,很多初中就已经学过了,不用再重点记忆

所以本文认为中高频词汇才是最重要的,即累计词频大约在65%~85%之间的单词

插曲,我也不知道这张图片哪儿来的,我截图粘贴的时候就出现了这张图片,可能是csdn服务器命名冲突了,这是其他人的博客图片

按照累计词频65%~85%的标准,本文统计出的英语六级中频词汇量大约为1890-422+1 = 1469个

总结:本文使用Python开发了一个简单的统计单词出现频率的小程序,只需要按要求准备要测试的txt文档即可,可以统计单个文档,也可以统计多个文档。本文实现了对近三年英语六级词频的统计,并确定了1400多个中高频词汇(65%~85%),这部分是需要强化记忆的。当然还可以更改参数,自定义统计单词的最小长度、最大长度等,本文程序默认最小长度为2,最大长度为20。最后祝天下考四六级的小伙伴们顺利通过!

本文还存在一定的不足,统计单词时没有考虑到所有格、缩写、连字符组合词汇、短语等等因素,没有开发一个良好的操作界面,支持的文档必须是txt,频率统计的结果还不够丰富,统计出的单词还没有翻译等等,后面会进一步改进。

#!/usr/bin/python3.7

# -*- coding: utf-8 -*-

# function 自动统计英语单词词频,带翻译

import re

import os

from matplotlib import pyplot as plt

import urllib.request

import urllib.parse

import json

file_library = "./file_library_txt"

txt_file_name = 'combine.txt'

result_file_name = 'result.txt'

# 翻译地址

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'

def translate(word):

data = {'i': word, 'doctype': 'json'}

data = urllib.parse.urlencode(data).encode('utf-8')

response = urllib.request.urlopen(url, data)

html = response.read().decode('utf-8')

target = json.loads(html)

result = (target['translateResult'][0][0]['tgt'])

return result

# 合并txt文件

def combine_txt(folder, combine_file_name):

# 获取目标文件夹中的文件名称列表

filenames = os.listdir(folder)

# 打开当前目录下的result.txt文件,如果没有则创建

f = open(combine_file_name, 'w', encoding='utf-8')

# 先遍历文件目录

for filename in filenames:

filepath = folder + '/' + filename

filenames_txt = os.listdir(filepath)

for filename_txt in filenames_txt:

file_txt = filepath + '/' + filename_txt

# print(file_txt)

# 遍历单个文件,读取行数

for line in open(file_txt, encoding='utf-8'):

f.writelines(line)

f.write('\n')

# 关闭文件

f.close()

# 获取txt文件内容

def gettext(file):

txt = open(file, "r", errors='ignore', encoding='utf-8').read()

txt = txt.lower()

return txt

# 统计txt文件中英文单词出现频率

def stat_freq(file_name, min_len=2, max_len=20):

content = gettext(file_name)

words = re.split(r'[^A-Za-z]+', content)

new_words = []

for word in words:

if (len(word) >= min_len) and (len(word) <= max_len):

new_words.append(word)

total_word = len(new_words)

counts = {}

for word in new_words:

counts[word] = counts.get(word, 0) + 1

items = list(counts.items())

items.sort(key=lambda w: w[1], reverse=True)

f = open(result_file_name, 'w', encoding='utf-8')

f.writelines("{0:<6}\t{1:<20}\t{2:<20}\t{3:<6}\t{4:<5}\t{5:>5}".format

("No",

"Word",

"Translate",

"Count",

"Freq",

"Cum_Freq"))

f.write('\n')

f.writelines("{0:<6}\t{1:<20}\t{2:<20}\t{3:<6}\t{4:<5}\t{5:>5}".format

(len(items),

"all_word",

"翻译",

total_word,

"100%",

"100%"))

f.write('\n')

f.writelines(

"_____________________________________________"

"_____________________________________________")

f.write('\n')

cnt = []

cum_fre = 0

for i in range(len(items)):

word, count = items[i]

cum_fre = cum_fre + count

f.writelines("{0:<6}\t{1:<20}\t{2:<20}\t{3:<6}\t{4:.4%}\t{5:.4%}".format

(i + 1,

word,

translate(word),

count,

count / total_word,

cum_fre / total_word))

f.write('\n')

cnt.append(count)

# 关闭文件

f.close()

# 绘制频率图

plt.bar(list(range(1, len(cnt) + 1)), cnt, align='center')

plt.axis([1, len(cnt) + 1, 1, cnt[len(cnt) // 30]])

plt.title('Word frequency')

plt.xlabel('X axis')

plt.ylabel('Y axis')

plt.savefig('freq.png')

plt.show()

combine_txt(file_library, txt_file_name)

stat_freq(txt_file_name)

当使用爬虫进行有道翻译时,只能连续请求1001次,然后会因为ip请求过于频繁被封掉,可以考虑使用延时请求,但是时间会非常漫长

最近使用基于Qt的Pyside2开发了一个简单的GUI界面,初学Qt界面开发,软件过于简陋,但词频统计的功能可以完全可以实现

解压缩后,会看到如下图所示文件,其中,ui文件夹里的ui文件是界面设计的布局文件,可供参考,双击main.exe即可运行程序,

可以使用段落统计功能,直接粘贴文本进行统计,也可以对指定文件夹下的所有txt文件进行统计,

界面上可以预览出现频率前10的单词,统计全部结果放在程序所在目录下的result文件夹里

本文分享 CSDN - 乐观的lishan。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

python中英文字频率_python 统计英语文档词汇出现频率,以六级真题为例相关推荐

  1. python中英文字频率_python统计文本字符串里单词出现频率的方法

    本文实例讲述了python统计文本字符串里单词出现频率的方法.分享给大家供大家参考.具体实现方法如下: # word frequency in a text # tested with Python2 ...

  2. 软件工程师如何提高英语文档阅读能力

    今天在知乎上被邀请回答这个问题,一不小心写了很多,算算已经可以当作一篇博客了,于是记录下来. 问题:作为一名程序员,虽说每天都在和英语打交道,但是当看到一篇英语文档或者英语技术文章的时候还是比较头疼, ...

  3. python英文字符频率统计_python统计文本字符串里单词出现频率的方法

    本文实例讲述了python统计文本字符串里单词出现频率的方法.分享给大家供大家参考.具体实现方法如下: # word frequency in a text # tested with Python2 ...

  4. python统计word词频_python统计word文档中的词频

    如何将统计word文档中的词频呢?先用docx模块将word文档转变成txt格式,然后使用jieba模块进行分词,并统计词频.是不是很简单- #2020年3月10日 #Elizabeth from d ...

  5. React组件库Concis | 组件突破50+,移动端concis起步,新增英语文档,持续更新中...

    您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ Concis是什么? 首先,感谢大家的支持,让Concis突破了100star~也是有你们的不断支持,让博主在开源路 ...

  6. python认证考试有哪些_Python入门习题(19)——CCF CSP认证考试真题:中间数

    问题描述 试题编号:201703-1 试题名称:分蛋糕 时间限制:1.0s 内存限制:256.0MB 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, ...

  7. python中英文字频率_python实现统计文本中单词出现的频率详解

    本文实例为大家分享了python统计文本中单词出现频率的具体代码,供大家参考,具体内容如下 #coding=utf-8 import os from collections import Counte ...

  8. 用python做频数分析_Python统计如何进行DNA序列整理

    Python统计在我们的使用中有很多的障碍,其中在DNA序列上的相关问题就需要我们不断的去学习.下面我们就向大家介绍有关的问题,希望在以后Python统计的使用过程中有所收获. 给定一堆DNA序列,即 ...

  9. python股票历史最低点_Python统计某一只股票每天的开盘,收盘,最高,最低价格!...

    模块:Numpy 码字不易,转载请注明出处!十分感谢! 准备工作: 抓取某一只股票的信息,每30min为一组数据,可以参考上一篇: Note: 只为演示如何统计,更精准的可以抓取每5min为一组数据 ...

最新文章

  1. 乔布斯当年是这样面试我的,你能挺到哪一步?
  2. [SHOI2015]自动刷题机
  3. 如何养成一个习惯(持续更新)
  4. 2021-09-15
  5. java爬虫之正则表达式
  6. Android中TextView中string的特殊符号显示的方法
  7. arm架构安装rxtx_Parallels推新版本 M1芯片Mac能安装Win 10
  8. OPencv_边缘检测算法
  9. 【Spark Summit EU 2016】沃森媒体分析系统:从单租户Hadoop到3000租户Spark的架构演进...
  10. 谁说数学好编程就好了?MIT告诉你:不对!
  11. 其利断金前一句是什么_成渝为什么不改成渝蓉?官方答案来了
  12. 纯C++代码实现将像素矩阵保存为bmp图片
  13. 只属于你我的共同记忆
  14. HTML data-* 属性
  15. AOS V0.6 发布,JavaEE 应用基础平台
  16. 在MonthCalendar控件中选中日期
  17. Flink的重启策略(RestartStrategy)实战
  18. 关于原生js里报这个错:Cannot read properties of undefined (reading ‘classList‘) at HTMLLIElement.
  19. 【目标检测】什么是mAP?如计算模型的mAP?(mAP的相关概念以及求法)
  20. 用这个工具,让人抓狂的领导驾驶舱报表五步搞定

热门文章

  1. hpuoj 1725: 感恩节KK专场——特殊的比赛日期 (素数判断)
  2. php网页在iis里打不开,asp的网站在iis上打不开
  3. 干掉Session?这个跨域认证解决方案真的优雅
  4. 10分钟手把手教你用Android手撸一个简易的个人记账App
  5. 查看Android应用内存的方法,Android获取App内存使用情况的方法
  6. 人工智能和中国国家人工智能发展战略
  7. springboot校园二手书籍交易平台 毕业设计-附源码131558
  8. Android 时光轴 -记录生活
  9. -day26 必备SQL和表关系及授权
  10. 什么叫做信息安全?包含哪些内容?与网络安全有什么区别?