赞
踩
使用collections
库的collections.Counter()方法进行词频统计
import collections
songs = 'You raise me up so I can stand on mountains You raise me up to walk on stormy seas I am strong when I am on your shoulders You raise me up To more than I can be'
word_list = songs.split() # 字符串删除空格,输出为列表形式
print(collections.Counter(word_list))
print(dict(collections.Counter(word_list))) # 转换为字典格式,统计完成
输出:
优点:
调用python内置库,很快速的一个方法进行词频统计
缺点:
大小写不分(以上实例中“To”与“to”被识别为两个单词)
代码:
songs = 'You raise me up so I can stand on mountains You raise me up to walk on stormy seas I am strong when I am on your shoulders You raise me up To more than I can be'
word_list = songs.split() # 字符串删除空格,输出为列表形式
d = {}
for word in word_list:
word = word.lower() # 单词改为小写版
if word in d:
d[word] += 1
else:
d[word] = 1
print(d)
输出:
中文词频统计首先需要进行分词,jieba库是最常用的中文分词库,其常用方法请看博文:【干货】Python:jieba库的使用
我们以《红楼梦》原文(下载链接)为例,进行人物出场统计。文件保存为“红楼梦.txt”
,分词前如下图所示:
读取文本过程中可能遇到的编码问题解决方案:UnicodeDecodeError
通过open打文本文件,使用读模式r,为避免编码错误,指定编码类型为utf-8。读取出来是一个大字符串,将这个大字符串存入变量txt。然后调用jieba进行分词。lcut的意思是切分词后再转换成列表("l"即表示list的首字母)。将切分后的词存入列表words。
import jieba
# 读取txt文件
f = open('红楼梦.txt', 'r', encoding='utf-8')
txt = f.read()
f.close()
words = jieba.lcut(txt) # jieba分词
print(words)
部分输出如下图:
由上图可见,结果基本是按照我们的汉字使用习惯来区分词的,不能组成词的字或标点符号则是按单独一个字符串存放的。
然后我们就需要将词和对应出现的次数统计出来。此处的代码与上面 “针对英文——手撕代码” 部分的思路核心一致。然后我们根据此出现的次数,降序排序,并查看前15个词的情况。
写法1:
# 词频统计
counts = {} # 新建字典用于储存词及词频
for word in words:
if len(word) == 1: # 排除单个字符的分词结果(其中包括标点)
continue
elif word.isdigit() == True: # 剔除数字
continue
else:
counts[word] = counts.get(word, 0) + 1
items = list(counts.items()) # 键值对转换为元组并保存至一个列表中
items.sort(key=lambda x: x[1], reverse=True) # 从大到小排序
print(items[:15]) # 输出前15
写法2:
# 词频统计
wordsDict = {} # 新建字典用于储存词及词频
for word in words:
if len(word) == 1: #单个的字符不作为词放入字典(其中包括标点)
continue
elif word.isdigit() == True: # 剔除数字
continue
elif word in wordsDict:
wordsDict[word] +=1 #对于重复出现的词,每出现一次,次数增加1
else:
wordsDict[word] =1
wordsDict_seq = sorted(wordsDict.items(),key=lambda x:x[1], reverse=True) #按字典的值降序排序
# wordsDict_seq #此行代码便于从全部中选取不需要的关键词
print(wordsDict_seq[:15]) # 查看前15个
输出:
[('宝玉', 3867), ('什么', 1621), ('一个', 1470), ('贾母', 1278), ('我们', 1230), ('那里', 1180), ('凤姐', 1106), ('王夫人', 1072), ('你们', 1009), ('如今', 1004), ('说道', 978), ('知道', 977), ('老太太', 972), ('起来', 961), ('姑娘', 954)]
可以看到,有些词与人名无关,它们并不是我们想要的,比如“什么”、“一个”、“我们”、“那里”等。因此需要把这些不需要的词删除。
先定义一个储存要排除的词的字典excludes
,将想排除的词放进去,然后遍历这个字典。再检查这些词是否在目标字典counts
中,如果在,就将字典中这个词对应的数据删除。
excludes = {'什么', '一个', '我们', '那里', '你们', '如今',
'说道', '知道', '老太太', '起来', '姑娘', '这里',
'出来', '他们', '众人', '自己', '一面', '太太',
'只见', '怎么', '奶奶', '两个', '没有', '不是',
'不知', '这个', '听见'} # 排除词库
for exclude in excludes: # 删除排除词
del(counts[exclude])
counts_seq = sorted(counts.items(), key=lambda x: x[1], reverse=True) # 按字典的值降序排序
print(counts_seq[:5])
然后将筛选后的数据转换成DataFrame,并增加列名“词”和“次数”,然后导出为Excel文件。
df = pd.DataFrame(counts_seq, columns=['词', '次数'])
df.to_excel("红楼梦词频.xlsx", index=False) # 存为Excel时去掉index索引列
import os
# os.getcwd() #返回当前工作目录
path = '四大名著' #文件所在文件夹,文件夹必须放在当前工作目录中
files = [path+"\\"+i for i in os.listdir(path)] #获取文件夹下的文件名,并拼接完整路径
以上,先获取到所有待分析文件的路径。然后逐个进行分析。
import jieba
import pandas as pd
import os
# os.getcwd() # 返回当前工作目录
path = '四大名著' # 文件所在文件夹,文件夹必须放在当前工作目录中
files = [path+"\\"+i for i in os.listdir(path)] # 获取文件夹下的文件名,并拼接完整路径
for file in files:
txt = open(file, "r", encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {} # 新建字典用于储存词及词频
for word in words:
if len(word) == 1: # 单个的字符不作为词放入字典
continue
else:
counts[word] = counts.get(word, 0) + 1
excludes = {'什么', '一个', '我们', '那里', '你们', '如今',
'说道', '知道', '老太太', '起来', '姑娘', '这里',
'出来', '他们', '众人', '自己', '一面', '太太',
'只见', '怎么', '奶奶', '两个', '没有', '不是',
'不知', '这个', '听见'} # 排除词库
for exclude in excludes:
if exclude in counts:
del counts[exclude] # 删除对应的词
counts_seq = sorted(counts.items(), key=lambda x: x[1], reverse=True) # 按字典的值降序排序
df = pd.DataFrame(counts_seq, columns=['词', '次数'])
df.to_excel("四大名著词频//{}.xlsx".format(file.split("\\")[1][:-4]), index=False) # 存为Excel时去掉index索引列
时间 | 内容 |
---|---|
2022.10 | 首次发表 |
2023.2.6 | 格式调整,整改违规图片 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。