使用Python编写词频统计工具的示例代码

 更新时间:2025年06月18日 09:36:08   作者:晨曦543210  
这篇文章主要为大家详细介绍了如何使用Python编写词频统计工具的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、程序工作流程

1.启动程序,显示主菜单

2.用户选择加载文本的方式:

  • 直接输入文本
  • 从文件加载

3.程序处理文本,统计词频

4.用户可以选择:

  • 查看统计摘要
  • 查询特定单词频率
  • 查看所有单词频率
  • 导出结果到CSV
  • 可视化展示常见单词

5.用户可以选择退出程序

二、完善代码

1. 导入库

import re
from collections import Counter
import matplotlib.pyplot as plt

re: Python的正则表达式库,用于文本处理

Counter: 来自collections模块,用于高效计数

matplotlib.pyplot: 用于数据可视化

2. WordFrequencyAnalyzer类

这是程序的核心类,负责文本分析和统计:

初始化方法 __init__

def __init__(self):
    self.word_freq = Counter()  # 存储单词频率的计数器
    self.total_words = 0         # 总单词数
    self.unique_words = 0        # 唯一单词数
    self.most_common = []        # 最常见的单词列表
    self.text_source = "未加载文本" # 文本来源信息

文本加载方法

def load_text(self, text):
    """从字符串加载文本"""
    self.text_source = "直接输入的文本"
    self._process_text(text)
    
def load_file(self, filename):
    """从文件加载文本"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            text = file.read()
        self.text_source = filename
        self._process_text(text)
        return True
    except FileNotFoundError:
        print(f"错误: 文件 '{filename}' 未找到")
        return False
    except Exception as e:
        print(f"读取文件时出错: {e}")
        return False

load_text: 从用户输入的字符串加载文本

load_file: 从文件加载文本,处理文件读取错误

核心文本处理方法 _process_text

def _process_text(self, text):
    """处理文本并统计词频"""
    # 转换为小写并移除标点符号
    cleaned_text = re.sub(r'[^\w\s]', '', text.lower())
    # 分割单词
    words = cleaned_text.split()
    
    # 更新统计
    self.word_freq = Counter(words)
    self.total_words = len(words)
    self.unique_words = len(self.word_freq)
    self.most_common = self.word_freq.most_common()

这是程序的核心处理逻辑:

  • 使用正则表达式移除标点符号
  • 将所有文本转为小写
  • 使用split()分割单词
  • 使用Counter统计词频
  • 计算总单词数和唯一单词数
  • 获取最常见的单词列表

信息获取方法

def get_total_words(self):
    """获取总单词数"""
    return self.total_words
    
def get_unique_words(self):
    """获取唯一单词数"""
    return self.unique_words
    
def get_most_common(self, n=10):
    """获取出现频率最高的前n个单词"""
    return self.most_common[:n]
    
def get_word_frequency(self, word):
    """获取特定单词的出现频率"""
    return self.word_freq.get(word.lower(), 0)

这些方法提供对统计结果的访问接口。

结果展示方法

def print_summary(self):
    """打印统计摘要"""
    # 显示基本信息
    # 显示最常见的10个单词
 
def print_all_frequencies(self):
    """打印所有单词及其频率"""
    # 按字母顺序显示所有单词及其出现次数
 
def export_to_csv(self, filename="word_frequency.csv"):
    """将词频统计导出到CSV文件"""
    # 创建CSV文件,包含单词、出现次数和频率
 
def visualize_top_words(self, n=15):
    """可视化展示前n个最常见单词"""
    # 使用matplotlib创建水平条形图

这些方法提供了多种结果展示方式:

控制台打印摘要

显示所有单词频率

导出到CSV文件

可视化展示

3. 主函数 main()

这是程序的入口点,提供用户交互界面:

def main():
    analyzer = WordFrequencyAnalyzer()  # 创建分析器实例
    
    # 显示菜单
    while True:
        # 显示选项菜单
        choice = input("\n请选择操作: ")
        
        # 处理用户选择
        if choice == '1':  # 输入文本
            # 获取多行输入
            # 处理文本
            
        elif choice == '2':  # 从文件加载
            # 获取文件名
            # 加载文件
            
        elif choice == '3':  # 查看统计摘要
            # 检查是否有数据
            # 显示摘要
            
        elif choice == '4':  # 查询单词频率
            # 获取单词
            # 查询并显示结果
            
        elif choice == '5':  # 查看所有单词频率
            # 检查是否有数据
            # 显示所有单词频率
            
        elif choice == '6':  # 导出到CSV
            # 获取文件名
            # 导出数据
            
        elif choice == '7':  # 可视化展示
            # 获取要显示的单词数量
            # 显示图表
            
        elif choice == '8':  # 退出
            break
        
        else:  # 无效选择
            print("无效选择,请重新输入")

4. 程序入口

if __name__ == "__main__":
    main()

当直接运行此Python文件时,会调用main()函数启动程序。

5.关键功能解析

文本处理

cleaned_text = re.sub(r'[^\w\s]', '', text.lower())
words = cleaned_text.split()
  • 使用正则表达式 [^\w\s] 匹配所有非单词字符(字母、数字、下划线)和非空白字符
  • 将这些字符替换为空字符串,从而移除标点符号
  • 将文本转为小写,使"Word"和"word"被视为同一个单词
  • 使用split()分割单词

词频统计

self.word_freq = Counter(words)

Counter是Python的高效计数工具,可以快速统计每个单词的出现次数

可视化展示

plt.figure(figsize=(12, 8))
plt.barh(top_words[::-1], counts[::-1], color='skyblue')
  • 创建水平条形图
  • 使用[::-1]反转列表,使最常见的单词显示在顶部
  • 设置图表大小和颜色

多行文本输入

text = input("请输入文本(输入空行结束):\n")
lines = []
while text.strip():
    lines.append(text)
    text = input()
full_text = "\n".join(lines)

允许用户输入多行文本

当用户输入空行时结束输入

将所有行连接成完整文本

这个程序提供了一个完整的词频分析解决方案,从文本输入、处理、分析到结果展示和导出,功能全面且用户友好。

三、完整代码

import re
from collections import Counter
import matplotlib.pyplot as plt
 
class WordFrequencyAnalyzer:
    def __init__(self):
        self.word_freq = Counter()
        self.total_words = 0
        self.unique_words = 0
        self.most_common = []
        self.text_source = "未加载文本"
    
    def load_text(self, text):
        """从字符串加载文本"""
        self.text_source = "直接输入的文本"
        self._process_text(text)
    
    def load_file(self, filename):
        """从文件加载文本"""
        try:
            with open(filename, 'r', encoding='utf-8') as file:
                text = file.read()
            self.text_source = filename
            self._process_text(text)
            return True
        except FileNotFoundError:
            print(f"错误: 文件 '{filename}' 未找到")
            return False
        except Exception as e:
            print(f"读取文件时出错: {e}")
            return False
    
    def _process_text(self, text):
        """处理文本并统计词频"""
        # 转换为小写并移除标点符号
        cleaned_text = re.sub(r'[^\w\s]', '', text.lower())
        # 分割单词
        words = cleaned_text.split()
        
        # 更新统计
        self.word_freq = Counter(words)
        self.total_words = len(words)
        self.unique_words = len(self.word_freq)
        self.most_common = self.word_freq.most_common()
    
    def get_total_words(self):
        """获取总单词数"""
        return self.total_words
    
    def get_unique_words(self):
        """获取唯一单词数"""
        return self.unique_words
    
    def get_most_common(self, n=10):
        """获取出现频率最高的前n个单词"""
        return self.most_common[:n]
    
    def get_word_frequency(self, word):
        """获取特定单词的出现频率"""
        return self.word_freq.get(word.lower(), 0)
    
    def print_summary(self):
        """打印统计摘要"""
        print("\n===== 文本词频统计摘要 =====")
        print(f"文本来源: {self.text_source}")
        print(f"总单词数: {self.total_words}")
        print(f"唯一单词数: {self.unique_words}")
        print(f"词汇丰富度: {self.unique_words/self.total_words:.2%}")
        
        # 打印最常见的10个单词
        print("\n最常见的10个单词:")
        for i, (word, count) in enumerate(self.get_most_common(10), 1):
            print(f"{i}. {word}: {count}次 ({count/self.total_words:.2%})")
    
    def print_all_frequencies(self):
        """打印所有单词及其频率"""
        print("\n===== 所有单词频率 =====")
        for word, count in sorted(self.word_freq.items()):
            print(f"{word}: {count}次")
    
    def export_to_csv(self, filename="word_frequency.csv"):
        """将词频统计导出到CSV文件"""
        try:
            with open(filename, 'w', encoding='utf-8') as file:
                file.write("单词,出现次数,频率\n")
                for word, count in self.most_common:
                    frequency = count / self.total_words
                    file.write(f"{word},{count},{frequency:.6f}\n")
            print(f"词频统计已导出到 {filename}")
            return True
        except Exception as e:
            print(f"导出失败: {e}")
            return False
    
    def visualize_top_words(self, n=15):
        """可视化展示前n个最常见单词"""
        if not self.most_common:
            print("没有可用的数据")
            return
        
        top_words = [word for word, _ in self.most_common[:n]]
        counts = [count for _, count in self.most_common[:n]]
        
        plt.figure(figsize=(12, 8))
        plt.barh(top_words[::-1], counts[::-1], color='skyblue')
        plt.xlabel('出现次数')
        plt.title(f'文本中最常见的 {n} 个单词')
        plt.tight_layout()
        plt.show()
 
 
def main():
    analyzer = WordFrequencyAnalyzer()
    
    print("===== 文本词频统计器 =====")
    print("1. 输入文本")
    print("2. 从文件加载")
    print("3. 查看统计摘要")
    print("4. 查询单词频率")
    print("5. 查看所有单词频率")
    print("6. 导出到CSV")
    print("7. 可视化展示")
    print("8. 退出")
    
    while True:
        choice = input("\n请选择操作: ")
        
        if choice == '1':
            text = input("请输入文本(输入空行结束):\n")
            lines = []
            while text.strip():
                lines.append(text)
                text = input()
            full_text = "\n".join(lines)
            analyzer.load_text(full_text)
            print(f"已加载文本,共{analyzer.get_total_words()}个单词")
        
        elif choice == '2':
            filename = input("请输入文件名: ")
            if analyzer.load_file(filename):
                print(f"已从文件加载,共{analyzer.get_total_words()}个单词")
        
        elif choice == '3':
            if analyzer.total_words > 0:
                analyzer.print_summary()
            else:
                print("请先加载文本")
        
        elif choice == '4':
            if analyzer.total_words > 0:
                word = input("请输入要查询的单词: ").strip()
                count = analyzer.get_word_frequency(word)
                if count > 0:
                    freq = count / analyzer.get_total_words()
                    print(f"单词 '{word}' 出现了 {count} 次 (频率: {freq:.2%})")
                else:
                    print(f"单词 '{word}' 未在文本中出现")
            else:
                print("请先加载文本")
        
        elif choice == '5':
            if analyzer.total_words > 0:
                analyzer.print_all_frequencies()
            else:
                print("请先加载文本")
        
        elif choice == '6':
            if analyzer.total_words > 0:
                filename = input("请输入导出文件名(默认: word_frequency.csv): ")
                if not filename:
                    filename = "word_frequency.csv"
                analyzer.export_to_csv(filename)
            else:
                print("请先加载文本")
        
        elif choice == '7':
            if analyzer.total_words > 0:
                n = input("显示前多少个单词? (默认15): ")
                try:
                    n = int(n) if n.strip() else 15
                    analyzer.visualize_top_words(n)
                except ValueError:
                    print("请输入有效数字")
            else:
                print("请先加载文本")
        
        elif choice == '8':
            print("感谢使用文本词频统计器!")
            break
        
        else:
            print("无效选择,请重新输入")
 
 
if __name__ == "__main__":
    main()

到此这篇关于使用Python编写词频统计工具的示例代码的文章就介绍到这了,更多相关Python词频统计内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python正则表达式介绍

    Python正则表达式介绍

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程
    2012-08-08
  • Python实现Excel自动分组合并单元格

    Python实现Excel自动分组合并单元格

    这篇文章主要为大家详细介绍了Python实现Excel自动分组合并单元格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • python利用requests库进行接口测试的方法详解

    python利用requests库进行接口测试的方法详解

    在python的标准库中,虽然提供了urllib,utllib2,httplib,但是做接口测试,requests真心好,正如官方说的,“让HTTP服务人类”,一言以蔽之,说明一切,这篇文章主要给大家介绍了关于python利用requests库进行接口测试的相关资料,需要的朋友可以参考下
    2018-07-07
  • 详解python tcp编程

    详解python tcp编程

    这篇文章主要介绍了python tcp编程的相关资料,帮助大家更好的理解和学习python tcp编程,感兴趣的朋友可以了解下
    2020-08-08
  • Python 包管理工具 UV 功能介绍及安装方式详解

    Python 包管理工具 UV 功能介绍及安装方式详解

    UV是Python一体化工具链,整合了venv、virtualenv、pip、poetry功能,显著提升包安装和虚拟环境配置速度(比pip快数十倍),支持依赖锁定与多种格式兼容,安装方式包含pip、官方脚本及pipx,本文给大家介绍Python 包管理工具 UV 功能介绍及安装,感兴趣的朋友一起看看吧
    2025-09-09
  • Django的restframework接口框架自定义返回数据格式的示例详解

    Django的restframework接口框架自定义返回数据格式的示例详解

    这篇文章主要介绍了Django的restframework接口框架自定义返回数据格式,本文介绍了通过Django的restframework接口框架自定义Response返回对象来自定义返回数据格式,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 基于CUDA out of memory的一种神奇解决方式

    基于CUDA out of memory的一种神奇解决方式

    这篇文章主要介绍了基于CUDA out of memory的一种神奇解决方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • pytorch中tensor转换为float的实现示例

    pytorch中tensor转换为float的实现示例

    本文主要介绍了pytorch中tensor转换为float,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • 浅谈keras中自定义二分类任务评价指标metrics的方法以及代码

    浅谈keras中自定义二分类任务评价指标metrics的方法以及代码

    这篇文章主要介绍了浅谈keras中自定义二分类任务评价指标metrics的方法以及代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python基础之模块相关知识总结

    Python基础之模块相关知识总结

    今天带大家复习Python基础知识,文中对模块相关知识介绍的非常详细,对正在学习python基础的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05

最新评论