【干货】Python:中英文词频统计

英文词频统计

调用内置collections库

使用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索引列

拓展延伸:词云图

【干货】Python:wordcloud库绘制词云图

本文代码编译环境及库版本

  1. Pycharm Community Edition 2022.3
  2. Python 3.9.1
  3. pandas 1.5.3
  4. openpyxl 3.1.0

更新日志

时间内容
2022.10首次发表
2023.2.6格式调整,整改违规图片
  • 28
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

调参侠鱼尾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值