本例对英文文本进行简单的词频统计
IPO描述
统计英文单词的
第一步 是分解并提取单词,对同一单词会存在大小写不同形式,但是计数不能区分大小写。所以要将字母变成小写,排除大小写对计算词频的干扰。又英文单词的分割可以是空格、标点或者特殊符号,所以要统一格式来方便提取单词。
第二步 是对每个单词出现的次数进行统计。
第三步 是对统计值由高到低进行排序展示结果。
I:英文文本文件的输入
P:采用字典类型的结构统计某一词语(单词)出现的频率
O:每个单词及单词出现的次数(篇幅有限仅要求输出前10个)
关键问题:
1、单词 -- 键
2、相同单词的计数累加 -- 值\
定义什么数据类型 -- 字典类型
设计步骤
第一步:
- txt文件读取 -- txt.read("filename","r")
- 文件大小写的转换
- 特殊字符(各种标点符号)的替换
- 输出处理后的文件(定义一个函数 #将文件进行格式化处理)
第二步:对每个单词进行计数
- 定义一个字典类型的变量counts
- 单词在counts 中,单词定义的值 直接+1
- 单词不在counts 中,首先要将单词添加到字典中,然后并将其值赋值为1
第三步:
- 输出所用的键值对
- 输出排名前n的键值对
- 字典类型转换为列表类型
- 对列表类型用sort函数排序
- 按要求输出 进阶设计
第四步:
- 采用集合类型构建一个排除词汇库excludes
- 在输出结果中去掉冠词、代词、连接词等语法型词汇
第五步:
使用 wordcloud 库显示词频
将代码重现为以下新实例
统计哈姆雷特词汇频率,并使用 wordcloud 库显示词频
代码
#CalEng.PY
# -*- coding:utf-8 -*-
excludes = {"the","and","of","you","a","i","my","in"}
def getText():
txt = open("Eng.txt", "r").read()
txt = txt.lower()
for i in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
txt = txt.replace(i, " ")
return txt
EngTxt = getText()
words = EngTxt.split()
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
for word in excludes:
del(counts[word])
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(10):
word, count = items[i]
print ("{0:<10}{1:>5}".format(word, count))
代码注释
#本代码实现第一步到第四步
#CalEng.PY
# -*- coding:utf-8 -*- #注释编码类型
#实现第四步,枚举形式构建一个排除词汇库excludes来储存结果中不需要的词汇
excludes = {"the","and","of","you","a","i","my","in"}
#
def getText():
#这是一个很老旧的打开文件方式,并不推荐
txt = open("Eng.txt", "r").read()#以只读模式打开,不能修改,文件不存在,报错(异常)
#实际运行过程这个位置一直出错
txt = txt.lower()#统一小写
for i in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
txt = txt.replace(i, " ")#将各种分割作用(断句)的字符替换成空格
return txt
EngTxt = getText()
words = EngTxt.split()#去除空格提取单词(方法作用是以空格(默认参数)为界限划分成一个个单词形式的字符串)
counts = {} #新建一个空字典
for word in words:
counts[word] = counts.get(word, 0) + 1 #对单词出现的频率进行统计 counts.get(word,0)方法封装了一个if-else语句:如果word在counts中,则返回word对应的值,如果word不在counts中,则返回0
#所以上面的代码表示的是
'''
if word in counts:
counts[word] = counts[word] + 1
else:
counts[word] = 1
'''
for word in excludes:
del(counts[word])#第四步删掉需要排除的词汇
#排序后输出,字典类型没有顺序,所以要转换为有顺序的列表类型,再用sort()方法排序
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)#sort()方法配合lambda函数实现根据单词次数对元素进行排序
for i in range(10):
word, count = items[i] #返回相对应的键值对
print ("{0:<10}{1:>5}".format(word, count))
测试文档
利用这个免费网站下载英文小说的pdf/txt文档(样例是老人与海)\
(网址不让贴=。=)
复制一页写入一个Eng.txt文档并放入与.py文件同目录下
然后运行文件
运行结果
to 9
old 8
man 8
said 8
was 7
can 7
they 7
me 6
had 6
their 6
操作截图
\
报错分析
在这个打开文件代码处一直出错
\
python打开txt文件,文件路径错误报错
常规操作;
f = open(‘路径’, ‘r’) #这个是老方法了,不支持使用,麻烦
with open(r’filename.txt’) as f: print(f.read()) #文件的读操作
with open(‘filename.txt’, ‘w’) as f: f.write(‘hello world’) #文件的写操作
这俩种方法默认调用了f.close()
但是,windows系统下往往会报错,原因是转意字符“\”的影响,此时我们把"“改为”/",如果还不行,在路径前再加“r”
with open(r"../A.txt",“r”) as f:
如果这个当中有的词在文章中一次都没有出现的话
就会出现这样的报错
最终可运行代码
# CalEng.PY
# -*- coding:utf-8 -*-
excludes = {"the", "and", "of", "you", "a", "i", "in"}
def getText():
txt = open("Eng.txt",encoding='utf-8').read()
txt = txt.lower()
for i in '!"“”#$%&()*+,-./:;<=>?@[\]^_‘{|}~':
txt = txt.replace(i, " ")
return txt
EngTxt = getText()
words = EngTxt.split()
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
for word in excludes:
del (counts[word])
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
对应Eng.txt文件
略