重温总书记吟诵过的屈原名句

作者:







使用 Python 解构与可视化屈原诗篇:一次技术与文学的邂逅


使用 Python 解构与可视化屈原诗篇:一次技术与文学的邂逅

当总书记引用“路漫漫其修远兮,吾将上下而求索”时,我们感受到的是穿越千年的精神力量。作为一名技术从业者,除了品味其中的意境,我们是否也能用代码和数据的视角,来重新“审视”这些不朽名句呢?本文将带你使用 Python 及其数据科学库,对《离骚》进行文本分析与可视化,尝试从另一个维度理解屈原的文学世界。请注意,本文是一篇严格的技术教程,侧重于编程实现与工具使用,而非文学或政论分析。

简介

我们将构建一个简单的 Python 项目,通过以下几个步骤来探索《离骚》:
1. 文本获取与预处理:从文件中读取原文并进行清洗。
2. 分词与词频统计:使用中文分词工具,找出诗篇中的高频词汇。
3. 可视化分析:生成词云图和统计图表,直观展现诗篇特征。
4. (进阶)简单情感分析:尝试分析文本中蕴含的情感倾向。

这个项目不仅能帮助你巩固 Python 编程、数据处理和可视化的技能,也是一个练习项目工程化的绝佳机会。为了获得更好的编码体验,你可能需要一台性能可靠的 笔记本电脑。

前置准备

在开始之前,请确保你的开发环境已就绪。

  1. 安装 Python:推荐使用 Python 3.8 或更高版本。你可以从 Python官网 下载安装包。
  2. 创建项目目录:在电脑上创建一个新文件夹,例如 quyuan_analysis
  3. 安装必要的 Python 库:打开终端(或命令提示符),进入项目目录,运行以下命令安装第三方库:
    bash
    pip install jieba wordcloud matplotlib numpy pillow

    • jieba:优秀的中文分词库。
    • wordcloud:用于生成词云图。
    • matplotlib:用于绘制各种图表。
    • numpypillowwordcloud 的依赖项。
  4. 准备文本文件:将《离骚》全文保存为一个名为 lisao.txt 的纯文本文件,放入项目目录。你可以在古诗文网站找到全文。

如果你的代码编辑器支持丰富的主题和插件,那么编码会更加愉悦。可以考虑使用 机械键盘 来提升长时间编码的舒适度。

分步骤教程

步骤一:文本读取与基本清洗

我们的第一个任务是读取文件内容,并去除一些明显的噪音(如空白符、标点)。

# file: analyze.py
import re

def read_and_clean(file_path):
    """读取文本文件并进行基本清洗"""
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()

    # 去除换行符、多余空格
    text = text.replace('\n', '').replace('\r', '')
    # 去除中文标点符号 (简单示例,可根据需要扩展)
    text = re.sub(r'[,。!?;:、""‘’《》【】()\s]+', '', text)
    return text

# 使用函数
raw_text = read_and_clean('lisao.txt')
print(f"清洗后的文本长度:{len(raw_text)} 字")
print(f"前100个字:{raw_text[:100]}")

运行这段代码,你将看到清洗后的纯汉字文本。为了更高效地查看处理结果,拥有一台高分辨率显示器会很有帮助。

步骤二:中文分词与词频统计

《离骚》是古文,直接分词效果可能不佳。我们可以使用 jieba 并尝试加载一些古汉语词典(需要额外寻找资源),这里我们先使用默认模式。

# file: analyze.py (续)
import jieba
from collections import Counter

def segment_and_count(text, top_n=20):
    """对文本进行分词并统计词频"""
    # 使用jieba进行精确模式分词
    words = jieba.lcut(text)
    # 过滤掉单个字的词(通常意义不大),你也可以调整过滤条件
    words = [word for word in words if len(word) > 1]
    # 统计词频
    word_counts = Counter(words)
    return word_counts.most_common(top_n)

# 分析
top_words = segment_and_count(raw_text, top_n=30)
print("\n高频词TOP 30:")
for word, count in top_words:
    print(f"{word}: {count}")

你会看到一些诸如“芳草”、“修远”、“求索”、“美人”等高频词。这些词汇是构成屈原诗歌意象的基石。分析大量文本数据时,一台大容量的 移动硬盘 可以方便你备份和传输项目文件。

步骤三:生成词云图

词云是一种直观展示词频分布的优秀可视化工具。

# file: analyze.py (续)
from wordcloud import WordCloud
import matplotlib.pyplot as plt

def generate_wordcloud(text):
    """生成并显示词云图"""
    # 创建词云对象,这里需要指定中文字体路径,否则中文会显示为方框
    # 请将‘path/to/your/font.ttf’替换为你电脑上实际的中文字体文件路径
    # 例如在Windows上可能是‘C:/Windows/Fonts/simhei.ttf’
    wc = WordCloud(
        font_path='path/to/your/font.ttf',
        width=800,
        height=600,
        background_color='white',
        max_words=100
    ).generate(text) # 直接传入文本,词云内部会分词

    # 使用matplotlib显示
    plt.figure(figsize=(10, 8))
    plt.imshow(wc, interpolation='bilinear')
    plt.axis('off')
    plt.title('《离骚》词云图')
    plt.show()
    # 也可以保存到文件
    # wc.to_file('lisao_wordcloud.png')

# 生成词云
generate_wordcloud(raw_text)

关键点font_path 参数至关重要,必须指向一个包含中文字符的字体文件(如 .ttf 文件)。运行后,你会看到一幅以《离骚》词汇构成的美丽词云。

步骤四:绘制高频词柱状图

词云侧重整体感观,柱状图则能精确比较词频。

# file: analyze.py (续)
def plot_top_words(word_counts):
    """绘制高频词柱状图"""
    words, counts = zip(*word_counts) # 解包
    plt.figure(figsize=(12, 6))
    plt.bar(words, counts, color='teal')
    plt.xlabel('词语')
    plt.ylabel('出现次数')
    plt.title('《离骚》高频词统计')
    plt.xticks(rotation=45) # 旋转x轴标签,防止重叠
    plt.tight_layout()
    plt.show()

# 绘制之前统计的top_words
plot_top_words(top_words)

这幅图表会清晰地展示出“屈原式”词汇的优先级。对于数据分析工作,一个清晰的显示器能让你更好地把握图表细节。

步骤五:(进阶) 简单情感色彩分析

这是一个非常简化的分析。我们可以定义一个情感词典(如正面词和负面词),然后统计文本中出现的情感词数量。

# file: analyze.py (续)
def simple_sentiment_analysis(text):
    """基于词典的简单情感分析"""
    # 定义一个极简的情感词典(实际项目需大规模词典)
    positive_words = {'修', '美', '芳', '洁', '正', '高', '求索', '上下', '光辉'}
    negative_words = {'哀', '怨', '伤', '悲', '穷', '困', '难', '忧', '患'}

    words = jieba.lcut(text)
    pos_count = 0
    neg_count = 0
    for word in words:
        if word in positive_words:
            pos_count += 1
        elif word in negative_words:
            neg_count += 1

    total = pos_count + neg_count
    if total == 0:
        return 0
    # 情感得分:范围[-1, 1]
    sentiment_score = (pos_count - neg_count) / total
    return pos_count, neg_count, sentiment_score

# 分析情感
pos, neg, score = simple_sentiment_analysis(raw_text)
print(f"\n情感分析(基于简词典):")
print(f"正面词出现次数:{pos}")
print(f"负面词出现次数:{neg}")
print(f"情感倾向得分:{score:.2f} (越接近1越积极,越接近-1越消极)")

注意:这个分析极其粗略,仅为演示流程。真正的NLP情感分析需要复杂的模型和海量标注数据。深入学习AI技术时,你可能会需要阅读大量电子资料,一个轻便的 电子书阅读器 会是不错的选择。

代码示例(完整版)

将以上所有部分整合到一个 analyze.py 文件中:

import re
import jieba
from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np

def read_and_clean(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
    text = text.replace('\n', '').replace('\r', '')
    text = re.sub(r'[,。!?;:、""‘’《》【】()\s]+', '', text)
    return text

def segment_and_count(text, top_n=20):
    words = jieba.lcut(text)
    words = [word for word in words if len(word) > 1]
    word_counts = Counter(words)
    return word_counts.most_common(top_n)

def generate_wordcloud(text, font_path='simhei.ttf'):
    wc = WordCloud(
        font_path=font_path,
        width=800,
        height=600,
        background_color='white',
        max_words=100
    ).generate(text)
    plt.figure(figsize=(10, 8))
    plt.imshow(wc, interpolation='bilinear')
    plt.axis('off')
    plt.title('《离骚》词云图')
    plt.show()

def plot_top_words(word_counts):
    words, counts = zip(*word_counts)
    plt.figure(figsize=(12, 6))
    plt.bar(words, counts, color='teal')
    plt.xlabel('词语')
    plt.ylabel('出现次数')
    plt.title('《离骚》高频词统计')
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.show()

def simple_sentiment_analysis(text):
    positive_words = {'修', '美', '芳', '洁', '正', '高', '求索', '上下', '光辉'}
    negative_words = {'哀', '怨', '伤', '悲', '穷', '困', '难', '忧', '患'}
    words = jieba.lcut(text)
    pos_count = sum(1 for word in words if word in positive_words)
    neg_count = sum(1 for word in words if word in negative_words)
    total = pos_count + neg_count
    score = (pos_count - neg_count) / total if total != 0 else 0
    return pos_count, neg_count, score

if __name__ == '__main__':
    # 1. 读取和清洗
    cleaned_text = read_and_clean('lisao.txt')
    print(f"清洗后文本长度: {len(cleaned_text)}")

    # 2. 分词与统计
    top_words = segment_and_count(cleaned_text, top_n=30)
    print("\n高频词TOP30:")
    for word, count in top_words:
        print(f"{word}: {count}")

    # 3. 生成词云 (请确保font_path正确)
    generate_wordcloud(cleaned_text, font_path='C:/Windows/Fonts/simhei.ttf') # Windows示例路径

    # 4. 绘制柱状图
    plot_top_words(top_words)

    # 5. 简单情感分析
    pos, neg, score = simple_sentiment_analysis(cleaned_text)
    print(f"\n情感分析: 正面词{pos}, 负面词{neg}, 得分{score:.2f}")

相关工具推荐

进行文本分析和数据科学项目,以下工具非常有用:

  • IDE/编辑器
    • PyCharm:Python开发神器,社区版免费。
    • VS Code:轻量级且扩展丰富。
  • Python 数据科学库
    • pandas:用于结构化数据(如表格)处理,是数据分析基石。
    • scikit-learn:用于机器学习,可以进行更高级的文本分类、聚类。
    • spacyNLTK:专业级NLP(自然语言处理)库,功能远超jieba
  • 学习资源
    • 书籍:《利用Python进行数据分析》、《Python自然语言处理》。
    • 在线平台:Kaggle、Coursera上的相关课程。学习这些课程时,记好笔记很重要,数位板 可以帮助你高效地绘制思维导图和笔记。
  • 硬件环境
    • 对于大型文本分析或模型训练,一块好的显卡(显卡)能极大加速计算。
    • 长时间面对屏幕,一把符合人体工学的 办公椅 至关重要。

常见问题

Q1: 分词结果不好,很多古汉语词汇被错误切分。
A: jieba主要面向现代汉语。你可以尝试:
1. 使用jieba.load_userdict('guhanyu.dict')加载自定义的古汉语词典。
2. 调研更专业的古籍处理分词工具。
3. 手动添加一些词到jieba的词库中(add_word方法)。

Q2: 词云图中的中文显示为方框(□)。
A: 这是字体问题。必须在WordCloud中正确设置font_path参数,指向一个你系统中实际存在的、包含中文字符的.ttf.otf字体文件。你可以在系统字体文件夹中找到它们。

Q3: 代码运行时出现编码错误。
A: 确保所有文件读写操作都指定了正确的编码,通常是utf-8。在打开文件时使用encoding='utf-8'

Q4: matplotlib的图表显示不清晰。
A: 你可以在保存图表时使用更高的dpi参数,例如plt.savefig('plot.png', dpi=300)。拥有一个高分辨率的显示器也利于观察细节。

总结

通过这篇教程,我们绕开了文学解读的常规路径,利用Python编程实现了对《离骚》的文本量化分析。从文本清洗、分词统计到词云和图表的可视化,再到最简单的词典情感分析,我们完成了一个微型但完整的数据科学项目流程。

技术的价值在于其通用性。同样的方法,可以应用于分析任何中文文本,无论是古典文学、新闻报道还是社交媒体数据。它帮助我们跳出主观感受,从数据维度发现一些潜在的模式和特征。

“路漫漫其修远兮,吾将上下而求索”——这句诗的精神,同样适用于技术学习。数据科学和自然语言处理的领域广阔无垠,本文仅是一个起点。希望这个小项目能激发你用技术探索世界的兴趣,让古老的智慧在代码的映射下,焕发新的光彩。

Happy Coding!