统计中英文文章中汉字个数字频或单词个数词频
上传资源链接:
统计中文文章中汉字个数和字频 要求 给出前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站: