统计哈姆雷特中的次数出现频次

本文通过Python代码统计了《哈姆雷特》文本文件中英文单词的出现频率,忽略大小写并剔除了特殊符号,展示了出现频率最高的前几个单词。
# -*- 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 表示降序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值