• Python文本处理:初探《三国演义》


    三国演义

    《三国演义》是中国古代四大名著之一,它以东汉末年到晋朝统一之间的历史为背景,讲述了魏、蜀、吴三国之间的纷争与英雄们的传奇故事。今天,我们将通过Python初步探索《三国演义》的文本处理,感受这部古典名著的魅力。

    获取文本

    我们需要从本地读取《三国演义》的文本文件

    # 读取本地《三国演义》文本文件
    with open('三国演义.txt', 'r', encoding='utf-8') as file:
        sanguo_text = file.read()
    
    

    输出看一下读取的文件内容:

    print(sanguo_text[:30])
    

    输出如下:
    在这里插入图片描述

    文本预处理

    对文本进行分词前,先去除标点符号,使用正则库re来进行。

    import re
    
    # 去除标点符号和特殊字符
    sanguo_text = re.sub(r'[^\w\s]', '', sanguo_text)
    sanguo_text = re.sub(r'\n', '', sanguo_text)
    

    分词与词频统计

    使用jieba库进行中文分词,并进行词频统计,输出频率最高的10个词。

    import jieba
    from collections import Counter
    # 使用jieba进行分词
    words = jieba.lcut(sanguo_text)
    # 统计词频
    word_counts = Counter(words)
    
    # 输出出现频率最高的10个词
    print(word_counts.most_common(10))
    

    当前输出如下:

    [('曰', 7669), ('之', 2797), ('也', 2232), ('吾', 1815), ('与', 1722), ('将', 1643), ('而', 1600), ('了', 1397), ('有', 1386), ('在', 1286)]
    

    可以看到,现在大多数是一些语气助词。这里我们要引入停用词。

    引入停用词后进行词频统计

    在文本处理中,停用词是指那些在文本分析中没有实际意义的词汇,如“的”、“了”、“在”等。在进行词频统计时,我们通常会去除这些停用词,以便更准确地分析有意义的词汇。

    import jieba
    from collections import Counter
    # 使用jieba进行分词
    words = jieba.lcut(sanguo_text)
    
    # 读取停用词列表
    with open('常用停用词.txt', 'r', encoding='utf-8') as file:
        stopwords = set(file.read().split())
    
    # 去除停用词
    filtered_words = [word for word in words if word not in stopwords]
    
    # 统计词频
    word_counts = Counter(filtered_words)
    # 输出出现频率最高的10个词
    print(word_counts.most_common(10))
    
    

    当前输出:

    [('曹操', 938), ('孔明', 809), ('玄德', 494), ('丞相', 489), ('关公', 478), ('荆州', 412), ('玄德曰', 385), ('孔明曰', 382), ('张飞', 349), ('商议', 343)]
    

    我使用的停用词文件:
    在这里插入图片描述
    实际上可以根据自己的需求进行调整。

    分析人物出场次数

    注意:三国中人物可能有多个称呼,比如说刘备也可以用玄德称呼,这里的结果并不严谨。

    characters = ["刘备","玄德", "关羽", "张飞", "曹操", "孙权", "诸葛亮", "周瑜", "吕布", "貂蝉", "赵云"]
    
    # 初始化人物出场次数统计字典
    character_counts = {character: 0 for character in characters}
    
    # 统计人物出场次数
    for character in characters:
        character_counts[character] = sanguo_text.count(character)
    
    # 输出人物出场次数
    print(character_counts)
    

    输出如下:

    {'刘备': 298, '玄德': 1816, '关羽': 9, '张飞': 366, '曹操': 947, '孙权': 320, '诸葛亮': 163, '周瑜': 242, '吕布': 369, '貂蝉': 61, '赵云': 314}
    

    刘备虽然只有298次,但是玄德有1816次。

    考虑人物别名后,重新进行统计

    # 三国演义主要人物及其别名列表
    characters = {
        "刘备": ["刘备", "玄德", "皇叔"],
        "关羽": ["关羽", "云长"],
        "张飞": ["张飞", "翼德"],
        "曹操": ["曹操", "孟德", "丞相"],
        "孙权": ["孙权"],
        "诸葛亮": ["诸葛亮", "孔明", "卧龙"],
        "周瑜": ["周瑜", "公瑾"],
        "吕布": ["吕布", "奉先"],
        "貂蝉": ["貂蝉"],
        "赵云": ["赵云", "子龙"]
    }
    
    # 初始化人物出场次数统计字典
    character_counts = {key: 0 for key in characters}
    
    # 统计人物出场次数
    for character, aliases in characters.items():
        count = 0
        for alias in aliases:
            count += sanguo_text.count(alias)
        character_counts[character] = count
    
    # 输出人物出场次数
    print(character_counts)
    

    输出如下:

    {'刘备': 2232, '关羽': 452, '张飞': 426, '曹操': 1528, '孙权': 320, '诸葛亮': 1894, '周瑜': 302, '吕布': 389, '貂蝉': 61, '赵云': 415}
    

    结果可视化

    对出场次数进行可视化:

    import matplotlib.pyplot as plt
    from pylab import *
    mpl.rcParams['font.sans-serif']=['SimHei']
    
    
    # 提取人物和出场次数
    names = list(character_counts.keys())
    counts = list(character_counts.values())
    
    # 绘制柱状图
    plt.figure(figsize=(10, 6))
    plt.bar(names, counts, color='skyblue')
    plt.xlabel('人物')
    plt.ylabel('出场次数')
    plt.title('《三国演义》主要人物出场次数统计')
    plt.show()
    

    在这里插入图片描述

    完整代码

    import re
    import jieba
    from collections import Counter
    import matplotlib.pyplot as plt
    from pylab import mpl
    
    # 设置中文字体,确保图表中能显示中文
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    
    # 读取本地《三国演义》文本文件
    with open('三国演义.txt', 'r', encoding='utf-8') as file:
        sanguo_text = file.read()
    
    # 去除标点符号和特殊字符,以及换行符
    sanguo_text = re.sub(r'[^\w\s]', '', sanguo_text)
    sanguo_text = re.sub(r'\n', '', sanguo_text)
    
    # 使用jieba进行分词
    words = jieba.lcut(sanguo_text)
    
    # 读取停用词列表
    with open('常用停用词.txt', 'r', encoding='utf-8') as file:
        stopwords = set(file.read().split())
    
    # 去除停用词
    filtered_words = [word for word in words if word not in stopwords]
    
    # 统计词频
    word_counts = Counter(filtered_words)
    
    # 输出出现频率最高的10个词
    print("词频最高的10个词:", word_counts.most_common(10))
    
    # 三国演义主要人物及其别名列表
    characters = {
        "刘备": ["刘备", "玄德", "皇叔"],
        "关羽": ["关羽", "云长"],
        "张飞": ["张飞", "翼德"],
        "曹操": ["曹操", "孟德", "丞相"],
        "孙权": ["孙权"],
        "诸葛亮": ["诸葛亮", "孔明", "卧龙"],
        "周瑜": ["周瑜", "公瑾"],
        "吕布": ["吕布", "奉先"],
        "貂蝉": ["貂蝉"],
        "赵云": ["赵云", "子龙"]
    }
    
    # 初始化人物出场次数统计字典
    character_counts = {key: 0 for key in characters}
    
    # 统计人物出场次数
    for character, aliases in characters.items():
        count = 0
        for alias in aliases:
            count += sanguo_text.count(alias)
        character_counts[character] = count
    
    # 输出人物出场次数
    print("主要人物出场次数:", character_counts)
    
    # 提取人物和出场次数
    names = list(character_counts.keys())
    counts = list(character_counts.values())
    
    # 绘制柱状图
    plt.figure(figsize=(10, 6))
    plt.bar(names, counts, color='skyblue')
    plt.xlabel('人物')
    plt.ylabel('出场次数')
    plt.title('《三国演义》主要人物出场次数统计')
    plt.show()
    
    
  • 相关阅读:
    UML软件哪个好?10款好用的UML工具和画图软件推荐!
    程序员日均写7行代码被开除,这个行业真的还是普通人的最优选吗
    数组中出现次数超过一半的数字、替换空格、重建二叉树
    ssm+vue+elementUI 医院门诊互联电子病历管理信息系统-#毕业设计
    数据可视化:让数据讲述故事
    公众号网页开发 - 本地开发环境中将公众号授权域名使用内网穿透(frp+nginx)进行本地开发、调试
    某股份制银行容器云平台建设实践经验
    Android问题笔记四十六:解决open failed: EACCES (Permission denied) 问题
    CentOS 编译安装Redis
    Linux下udev应用
  • 原文地址:https://blog.csdn.net/summerriver1/article/details/139716252