首页 >> 大全

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

2023-08-19 大全 26 作者:考证青年

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

上传资源链接:

统计中文文章中汉字个数和字频 要求 给出前100个汉字高频字的频率统计结果;分别给出前1、20、100、600、2000、3000汉字的字频总和;计算汉字的熵值;

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

我使用的是来进行分析,感觉还是比较简单一点,而且非常方便,代码很少就能实现很多功能。

各个汉字出现个数

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

找出前100个高频汉字的个数和字频

可以看到我们在进行构造字典的时候,已经统计了总的汉字字数,也就是上面的变量s,接下来我们对字典进行排序,使用函数,是字典变成元组的形式,然后输出前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])/sshannonEnt -= prob * log(prob, 2)
print('熵:',shannonEnt)

统计英文文章中单词个数和词频 要求 给出前 100 个高频单词的频率统计结果;分别给出前 1、20、100、600、2000、3000 单词的词频总和;计算单词的熵值;

中文词频统计软件__在线英文单词字数统计器

统计方法与中文文章差不多,只不过在读取的时候不是剔除不满足的字符,而是以特殊字符作为分隔符,来提取整个单词

此处我选择的是哈利波特的英文版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+1d[word]=d.get(word,0)+1print('总词数:',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])/sshannonEnt -= prob * log(prob, 2)
print('熵:',shannonEnt)

来看看结果怎么样

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

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

B站:

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了