统计中英文文章中汉字个数字频或单词个数词频

统计中英文文章中汉字个数字频或单词个数词频

上传资源链接:
https://download.csdn.net/download/weixin_46570668/16455003.

统计中文文章中汉字个数和字频

要求

  1. 给出前100个汉字高频字的频率统计结果;
  2. 分别给出前1、20、100、600、2000、3000汉字的字频总和;
  3. 计算汉字的熵值;

选择的是三国演义的语料,内容如下:

在这里插入图片描述我使用的是python来进行分析,感觉还是Python比较简单一点,而且非常方便,代码很少就能实现很多功能。

各个汉字出现个数

首先我们来统计每个汉字在文章中出现的个数,将txt文本逐行读取字符存入列表中,接着,读取之前建立好的列表,首先判断是否为汉字,即判断字符是否属于",,。!?、;( )( )【 】< >《 》. = :+ - * —“ ”…abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",不属于则可认定为汉字;接下来判断该汉字是否已在字典中出现,如果未出现,则添加该汉字,并将值定为 1,如果已经出现,则将对应汉字值加一。
代码如下:

word_lst = []
word_dict = {}
lstWords=[]
s=0
exclude_str = ",。!?、;( )( )【 】< >《 》 = :+ - * —“ ”…" 
with open("work/171182.txt","r",encoding="utf-8") as fileIn ,open("data/c.txt",'w') as fileOut:
    for line in fileIn:
        for char in line:
            word_lst.append(char)
    #用字典统计每个字出现的次数
    for char in word_lst:
        if char not in exclude_str:
            s=s+1
            if char.strip() not in word_dict:
                word_dict[char] = 1
            else:
                word_dict[char]+=1
找出前100个高频汉字的个数和字频

可以看到我们在进行构造字典的时候,已经统计了总的汉字字数,也就是上面的变量s,接下来我们对字典进行排序,使用sorted函数,是字典变成元组的形式,然后输出前100个高频汉字的个数和字频,也就是字的个数/总的汉字个数。

    print('总字数:',s)
    lstWords = sorted(word_dict.items(), key=lambda x:x[1],  reverse=True) 
    print(type(lstWords))
    print('不同的字数:',len(lstWords))
    print ('字符\t字数\t字频')
    print ('=============================')
    for e in lstWords:
        fileOut.write('%s, %d\n' % e)
    for e in lstWords[:100]:
        print ('%s\t%d' % e,'\t',e[1]/s)

来看看结果如何:
当当当,这样就分出来啦,因为100个汉字实在太长了,这里就只放上去一部分截图了,完整的项目报告已经上传资源啦。
在这里插入图片描述

统计前1、20、100、600、2000、3000汉字的字频总和

这不就很简单啦,搞一个for循环,然后一直累加到n的字频就可以啦,在这里就以600作为示范好了

s600=0
for e in lstWords[:600]:
    s600=s600+e[1]
print ('前600',s600/s)

来看看结果吧
在这里插入图片描述

计算汉字的熵值

熵值的话根据香农公式就可以算出来,这里我们还是通过for循环来实现吧

from math import log
shannonEnt=0.0
for e in lstWords:
    prob = float(e[1])/s
    shannonEnt -= prob * log(prob, 2)
print('熵:',shannonEnt)

统计英文文章中单词个数和词频

要求

  1. 给出前 100 个高频单词的频率统计结果;
  2. 分别给出前 1、20、100、600、2000、3000 单词的词频总和;
  3. 计算单词的熵值;

统计方法与中文文章差不多,只不过在读取的时候不是剔除不满足的字符,而是以特殊字符作为分隔符,来提取整个单词
此处我选择的是哈利波特的英文版txt
直接看代码吧

from pathlib import Path
from collections import  defaultdict
basedir = Path('work/')
filename = 'harry2.txt'
lstWords2=[]
s=0
d = defaultdict(lambda :0) 
def makekey(line:str,chars = set(r"""@#$%!^&*()_+":;?><]\[]./',""") ):
    """ 使用三引号可以便于引号的输入,最前面加一个字母r,代表转义,特殊字符无需在内部输入\进行转义"""
    ret = [' ' if c in chars else c for c in line]   # 列表解析式
    return  "".join(ret).split() # 返回分割后的列表字符串
with open("work/harry2.txt","r",encoding= 'utf-8')as f :
    for line in f :
        for word in makekey(line):
            s=s+1
            d[word]=d.get(word,0)+1
    print('总词数:',s)
    lstWords2=sorted(d.items(),key = lambda x:x[1],reverse= True)
    print('不同的词数:',len(lstWords2))
    print ('单词\t词数\t词频')
    print ('=======================================')
    for e in lstWords2[:100]:
        print ('%s\t%d' % e,'\t',e[1]/s)
s1=lstWords2[0][1]
s20=0
s100=0
s600=0
s2000=0
s3000=0
for e in lstWords2[:20]:
    s20=s20+e[1]
for e in lstWords2[:100]:
    s100=s100+e[1]
for e in lstWords2[:600]:
    s600=s600+e[1]
for e in lstWords2[:2000]:
    s2000=s2000+e[1]
for e in lstWords2[:3000]:
    s3000=s3000+e[1]
print ('前1',s1/s)
print ('前20',s20/s)
print ('前100',s100/s)
print ('前600',s600/s)
print ('前2000',s2000/s)
print ('前3000',s3000/s)
from math import log
shannonEnt=0.0
for e in lstWords2:
    prob = float(e[1])/s
    shannonEnt -= prob * log(prob, 2)
print('熵:',shannonEnt)

来看看结果怎么样
在这里插入图片描述在这里插入图片描述
在这里插入图片描述完整代码和运行结果已经上传资源了,CSDN突然改版了,不能设置粉丝可下载,我之前上传的都给我变成用积分下载了,实在是不明白,不过我之后上传的资源都会设置成免费免积分下载,不会让CSDN赚大家一分钱的。

哦对啦,我开始把讲解更新B站和抖音啦,名字都叫猫猫头丁,欢迎大家来关注啊!!!
B站:https://space.bilibili.com/410893912.

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫头丁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值