#!/usr/bin/python # -*- coding: UTF-8 -*- import sys import re ''' 统计文章中,汉字的字频 输入可以是任意文本; 输出所有的字的清单,和每个汉字出现的次数。 一般用于检查,清单是否全部是唯一的汉字,即最终输出的全部汉字的词频/出现次数都是1. ''' base_txt_file = sys.argv[1] with open(base_txt_file, 'r', encoding='utf-8-sig') as f: lines = f.readlines() contents = [] # 保存每条新闻的内容 i = 0 words = [] # 用来保存所有的汉字 strs = '' # 用于保存保留下的所有汉字 # 将文本文件中的内容进行分割,制表符前面的内容当作标题,制表符后面的符号当做内容,将这两部分内容放到列表中 for line in lines: # 我分析文本内容得知,每条新闻是按行存放的,所以使用python的读取行的函数就可以分离出每条新闻 content = line contents.append(content) # 将文本内容只保留汉字部分,去除标点符号以及空格 content = re.sub(r'\d', "", content) content = re.sub(r'\s', "", content) content = re.sub( pattern='[,,\-<>'《》・|~()>&\*-+"%{}=-、。.—!!??"::;;\/\.【】()\']', repl='', string=content) strs = strs + content # print(content) words.extend(list(content)) # 统计每一个汉字的出现次数,使用字典的形式进行统计 result = {} for word in words: res = result.get(word, 0) if res == 0: result[word] = 1 else: result[word] = result[word] + 1 print(len(words)) print(len(result)) result = sorted(result.items(), key=lambda kv: (kv[1], kv[0]), reverse=True) result = dict(result) print(result) ''' result = sorted(result.items(), key=lambda kv: (kv[1], kv[0]), reverse=True) result = dict(result) print("使用字典的形式进行统计的词数结果:") new_a = {} for i, (k, v) in enumerate(result.items()): new_a[k] = v if i == 19: print(new_a) break new_a.clear() # 统计每一个汉字的出现次数,使用字符串的内置函数 # print(strs) result2 = [] # print('使用字符串的内置函数统计的所有的汉字数为:', end=" ") # print(len(strs)) for w in set(strs): num = strs.count(w) tem = [w, num] result2.append(tem) result2 = sorted(result2, key=lambda x: x[1], reverse=True) # 统计词频,使用上一步得到二维列表 fre = [] for item in result2: item[1] = item[1] / len(words) fre.append(item) print('使用二维列表得到的字频结果:') print(fre[:10]) # 统计词频累计,使用上一问得到二维列表 cum = [] sum = 0 for item in fre: sum = sum + item[1] item[1] = sum cum.append(item) print('使用二维列表得到的累计字频结果:') print(cum[:10]) '''