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

统计中英文文章中汉字个数字频或单词个数词频
上传资源链接:
统计中文文章中汉字个数和字频 要求 给出前100个汉字高频字的频率统计结果;分别给出前1、20、100、600、2000、3000汉字的字频总和;计算汉字的熵值;
选择的是三国演义的语料,内容如下:
我使用的是来进行分析,感觉还是比较简单一点,而且非常方便,代码很少就能实现很多功能 。
各个汉字出现个数
首先我们来统计每个汉字在文章中出现的个数,将txt文本逐行读取字符存入列表中,接着,读取之前建立好的列表,首先判断是否为汉字,即判断字符是否属于",, 。!?、;( )( )【 】< >《 》. = :+ - * —“ ”…89",不属于则可认定为汉字;接下来判断该汉字是否已在字典中出现,如果未出现,则添加该汉字,并将值定为 1,如果已经出现,则将对应汉字值加一 。
代码如下:
word_lst = []word_dict = {}lstWords=[]s=0exclude_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=0for e in lstWords[:600]:s600=s600+e[1]print ('前600',s600/s)
来看看结果吧
计算汉字的熵值
熵值的话根据香农公式就可以算出来,这里我们还是通过for循环来实现吧
from math import logshannonEnt=0.0for 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 Pathfrom collections importdefaultdictbasedir = Path('work/')filename = 'harry2.txt'lstWords2=[]s=0d = defaultdict(lambda :0) def makekey(line:str,chars = set(r"""@#$%!^&*()_+":;?>