# -*- coding: utf-8 -*-
"""
Created on Tue Apr 16 22:15:49 2024
@author: 12052
"""
def getText():
txt = open("D:\hamlet.txt","r").read()
txt = txt.lower()
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
txt = txt.replace(ch,' ')
return txt
hamletTxt = getText()
words = hamletTxt.split()
counts = {}
for word in words:
counts[word]=counts.get(word,0)+1
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))
【问题描述】
请统计hamlet.txt文件中出现的英文单词情况,统计并输出出现最多的前n个单词,注意:
(1) 单词不区分大小写,即需将大写转换成小写;
(2) 请在文本中剔除如下特殊符号:!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~
(3) 输出n个单词和其出现次数,每个单词一行;
(4) 输出单词为小写形式。
此题不涉及编码转换,若想指定编码 可在开始加上
#-*- coding: utf-8 -*-
或 在文件打开处 指定编码
with open("hamlet.txt", "r", encoding='utf-8') as f:
........
........
【输入形式】
【输出形式】
以下仅是输出样例(仅列出3个,需要列出n个),不是最终结果:
the 1138
and 965
to 754
单词 左对齐,并占10个位置; 次数 右对齐,并占5个位置
【样例输入】
【样例输出】
【样例说明】
【评分标准】
统计Hamlet英文词频的第一步是分解并提取英文文章的单词。同一个单词会存在大小写不同形式,但计数却不能区分大小写。假设Hamlet文本由变量txt表示。可以通过txt.lower()函数将字母变成小写,排除原文大小写差异对词频统计的干扰。英文单词的分隔可以是空格、标点符号或者特殊符号。为统一分隔方式,可以将各种特殊字符和标点符号使用txt. replace()方法替换成空格,再提取单词。
统计词频的第二步是对每个单词进行计数。假设将单词保存在变量 word 中,使用一个字典类型 counts={},统计单词出现的次数可采用如下代码:
counts [word]= counts[word] + 1
当到一个新词时,单词没有出现在字典结构中,则需要在字典中新建键值对;counts (new_word] = 1因此,无论词是否在字典中,加入字典counts中的处理逻辑可以统一表示如下:if word in counts:
counts [word] = counts[word] + 1
else:
counts [word]=1
##这里可以看作当字典为空counts赋值为1 如果有则counts++
或者,这个处理逻辑可以更简洁地表示为如下代码:
counts [word] = counts.get (word,0) + 1
字典类型的counts.get(word,0)方法表示:如果word在counts中,则返回word 对应的值,如果word不在counts中,则返回0。
该实例的第三步是对单词的统计值从高到低进行排序,输出前10个高频词语,并格式化打印输出。由于字典类型没有顺序,需要将其转换为有顺序的列表类型,再使用sort()方法和lambda函数配合实现根据单词出现的次数对元素进行排序。最后输出排序结果前10位的单词。
##items()表示返回所有的键值对
items = list (counts.items())
输出的结果如下:

#将字典转换为记录列表,将键值对按对存为列表形式
items.sort (key=lambda x:x[1], reverse=True)
#lambda函数代表简洁方式的函数定义 return x[1],即列表中表示值的数字
#sort 函数 reverse=True 表示降序
本文通过Python代码统计了《哈姆雷特》文本文件中英文单词的出现频率,忽略大小写并剔除了特殊符号,展示了出现频率最高的前几个单词。

被折叠的 条评论
为什么被折叠?



