python中英文字频率_python 统计英语文档词汇出现频率,以六级真题为例
很多人免不了参加各种英语考试,词汇量就是参加英语考试的一个拦路虎,单词不认识,技巧再多也枉然。但考试大纲要求的单词太多了,时间紧,任务重,背了又容易忘,如果能知道真题中词汇出现的频率高低,那么有意识的去记忆出现频率较高的词汇,不失为一种有效的记单词方法。本文为了解决这个问题,以近三年六级真题词频统计为例,使用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 统计英语文档词汇出现频率,以六级真题为例相关推荐
- python中英文字频率_python统计文本字符串里单词出现频率的方法
本文实例讲述了python统计文本字符串里单词出现频率的方法.分享给大家供大家参考.具体实现方法如下: # word frequency in a text # tested with Python2 ...
- 软件工程师如何提高英语文档阅读能力
今天在知乎上被邀请回答这个问题,一不小心写了很多,算算已经可以当作一篇博客了,于是记录下来. 问题:作为一名程序员,虽说每天都在和英语打交道,但是当看到一篇英语文档或者英语技术文章的时候还是比较头疼, ...
- python英文字符频率统计_python统计文本字符串里单词出现频率的方法
本文实例讲述了python统计文本字符串里单词出现频率的方法.分享给大家供大家参考.具体实现方法如下: # word frequency in a text # tested with Python2 ...
- python统计word词频_python统计word文档中的词频
如何将统计word文档中的词频呢?先用docx模块将word文档转变成txt格式,然后使用jieba模块进行分词,并统计词频.是不是很简单- #2020年3月10日 #Elizabeth from d ...
- React组件库Concis | 组件突破50+,移动端concis起步,新增英语文档,持续更新中...
您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ Concis是什么? 首先,感谢大家的支持,让Concis突破了100star~也是有你们的不断支持,让博主在开源路 ...
- python认证考试有哪些_Python入门习题(19)——CCF CSP认证考试真题:中间数
问题描述 试题编号:201703-1 试题名称:分蛋糕 时间限制:1.0s 内存限制:256.0MB 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, ...
- python中英文字频率_python实现统计文本中单词出现的频率详解
本文实例为大家分享了python统计文本中单词出现频率的具体代码,供大家参考,具体内容如下 #coding=utf-8 import os from collections import Counte ...
- 用python做频数分析_Python统计如何进行DNA序列整理
Python统计在我们的使用中有很多的障碍,其中在DNA序列上的相关问题就需要我们不断的去学习.下面我们就向大家介绍有关的问题,希望在以后Python统计的使用过程中有所收获. 给定一堆DNA序列,即 ...
- python股票历史最低点_Python统计某一只股票每天的开盘,收盘,最高,最低价格!...
模块:Numpy 码字不易,转载请注明出处!十分感谢! 准备工作: 抓取某一只股票的信息,每30min为一组数据,可以参考上一篇: Note: 只为演示如何统计,更精准的可以抓取每5min为一组数据 ...
最新文章
- 乔布斯当年是这样面试我的,你能挺到哪一步?
- [SHOI2015]自动刷题机
- 如何养成一个习惯(持续更新)
- 2021-09-15
- java爬虫之正则表达式
- Android中TextView中string的特殊符号显示的方法
- arm架构安装rxtx_Parallels推新版本 M1芯片Mac能安装Win 10
- OPencv_边缘检测算法
- 【Spark Summit EU 2016】沃森媒体分析系统:从单租户Hadoop到3000租户Spark的架构演进...
- 谁说数学好编程就好了?MIT告诉你:不对!
- 其利断金前一句是什么_成渝为什么不改成渝蓉?官方答案来了
- 纯C++代码实现将像素矩阵保存为bmp图片
- 只属于你我的共同记忆
- HTML data-* 属性
- AOS V0.6 发布,JavaEE 应用基础平台
- 在MonthCalendar控件中选中日期
- Flink的重启策略(RestartStrategy)实战
- 关于原生js里报这个错:Cannot read properties of undefined (reading ‘classList‘) at HTMLLIElement.
- 【目标检测】什么是mAP?如计算模型的mAP?(mAP的相关概念以及求法)
- 用这个工具,让人抓狂的领导驾驶舱报表五步搞定