词频统计

编写程序统计一个英文文本文件中单词的出现次数,并将出现次数最多(次数排名前10)的单词和它们的出现次数按降序显示。

1. 使用一个字典来存储包含了单词和它的次数的条目;

2. 统计单词是不考虑大小写的,例如:认为Good与good是一个单词;

 

第一步:读取文件
通过txt.lower()函数将字母变成小写

英文单词的分割可以是空格、标点符号或者特殊符号。为了统一分割方式,将各种特殊字符和标点符号使用txt.repalce()方法替换成空格,再提取单词

 

ef getText():
    # 读取txt文件
    txt=open("one.txt","r").read()
    # 将单词全部转换为小写
    txt=txt.lower()
    # 将特殊字符替换成为空格
    for ch in '!@#$%:^&*()-.;':
        txt=txt.replace(ch," ")
    return txt
test=getText()

第二步:对单词进行计数

# 对字符串通过空格进行分割
words=test.split()
# 定义空字典,用来存放单词和对应的出现次数
counts={}
for word in words:
    # 对word出现的频率进行统计,当word不在words时,返回值是0,当word在words中时,返回+1
    # counts[word]=counts.get(word,0)+1
    # 第二种写法
    if word in counts:
        counts[word] = counts[word]+1
    else:
        counts[word]=1

counts[word]=counts.get(word,0)+1

如果word在counts中,则返回word对应的值;如果word不在counts中,则返回0

第三步:对单词的统计值进行排序
由于字典类型没有顺序,需要将其转换为有顺序的列表类型,再用sort()方法和lambda函数配合实现根据单词次数对元素进行排序。

# 将字典转换为记录列表
# items()方法:以列表形式返回可遍历的(键, 值) 元组数组。
items=list(counts.items())
# 以第二列排序
items.sort(key=lambda x:x[1],reverse=True)
# 输出频率前10的单词和次数
for i in range (10): 
    word,count=items[i]
    print("{0}:{1}".format(word,count))

下面来个中文文档统计词频

import jieba
 
txt=open('xyj.txt','r',encoding ="utf-8").read()
 
# jieb.lcut 以及 jieba.lcut_for_search 直接返回list
words=jieba.lcut(txt)
 
#新建一个空字典
counts={}
 
for word in words:
    #挑出单个分词(不计数)
    if len(word) == 1:
        continue
    else:
        counts[word]=counts.get(word,0)+1
#转换为列表
items=list(counts.items())
#以第二列排序
items.sort(key=lambda x:x[1],reverse=True)
 
for i in range(10):
    #返回相对应的键值对
    word,counts=items[i]
    print('{0}:{1}'.format(word,counts))

 

posted @ 2022-10-16 01:35  布衣梦蝶1978  阅读(162)  评论(0编辑  收藏  举报