Python:”英文文本词频统计“实例

1,667 阅读4分钟

本例对英文文本进行简单的词频统计

IPO描述

统计英文单词的

第一步 是分解并提取单词,对同一单词会存在大小写不同形式,但是计数不能区分大小写。所以要将字母变成小写,排除大小写对计算词频的干扰。又英文单词的分割可以是空格、标点或者特殊符号,所以要统一格式来方便提取单词。

第二步 是对每个单词出现的次数进行统计。

第三步 是对统计值由高到低进行排序展示结果。

I:英文文本文件的输入
P:采用字典类型的结构统计某一词语(单词)出现的频率
O:每个单词及单词出现的次数(篇幅有限仅要求输出前10个)

关键问题:
1、单词 -- 键
2、相同单词的计数累加 -- 值\

定义什么数据类型 -- 字典类型

设计步骤

第一步:

  1. txt文件读取 -- txt.read("filename","r")
  2. 文件大小写的转换
  3. 特殊字符(各种标点符号)的替换
  4. 输出处理后的文件(定义一个函数 #将文件进行格式化处理)

第二步:对每个单词进行计数

  1. 定义一个字典类型的变量counts
  2. 单词在counts 中,单词定义的值 直接+1
  3. 单词不在counts 中,首先要将单词添加到字典中,然后并将其值赋值为1

第三步:

  1. 输出所用的键值对
  2. 输出排名前n的键值对
    • 字典类型转换为列表类型
    • 对列表类型用sort函数排序
    • 按要求输出 进阶设计

第四步:

  1. 采用集合类型构建一个排除词汇库excludes
  2. 在输出结果中去掉冠词、代词、连接词等语法型词汇

第五步:

使用 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文档(样例是老人与海)\

(网址不让贴=。=)

image.png

复制一页写入一个Eng.txt文档并放入与.py文件同目录下

image.png

image.png

然后运行文件

运行结果

to            9
old           8
man           8
said          8
was           7
can           7
they          7
me            6
had           6
their         6

操作截图

image.png

image.png\

报错分析

在这个打开文件代码处一直出错

image.png\

image.png

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:


如果这个当中有的词在文章中一次都没有出现的话

image.png

就会出现这样的报错

image.png

最终可运行代码

# 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文件