使用 Python 解构与可视化屈原诗篇:一次技术与文学的邂逅
当总书记引用“路漫漫其修远兮,吾将上下而求索”时,我们感受到的是穿越千年的精神力量。作为一名技术从业者,除了品味其中的意境,我们是否也能用代码和数据的视角,来重新“审视”这些不朽名句呢?本文将带你使用 Python 及其数据科学库,对《离骚》进行文本分析与可视化,尝试从另一个维度理解屈原的文学世界。请注意,本文是一篇严格的技术教程,侧重于编程实现与工具使用,而非文学或政论分析。
简介
我们将构建一个简单的 Python 项目,通过以下几个步骤来探索《离骚》:
1. 文本获取与预处理:从文件中读取原文并进行清洗。
2. 分词与词频统计:使用中文分词工具,找出诗篇中的高频词汇。
3. 可视化分析:生成词云图和统计图表,直观展现诗篇特征。
4. (进阶)简单情感分析:尝试分析文本中蕴含的情感倾向。
这个项目不仅能帮助你巩固 Python 编程、数据处理和可视化的技能,也是一个练习项目工程化的绝佳机会。为了获得更好的编码体验,你可能需要一台性能可靠的 笔记本电脑。
前置准备
在开始之前,请确保你的开发环境已就绪。
- 安装 Python:推荐使用 Python 3.8 或更高版本。你可以从 Python官网 下载安装包。
- 创建项目目录:在电脑上创建一个新文件夹,例如
quyuan_analysis。 - 安装必要的 Python 库:打开终端(或命令提示符),进入项目目录,运行以下命令安装第三方库:
bash
pip install jieba wordcloud matplotlib numpy pillowjieba:优秀的中文分词库。wordcloud:用于生成词云图。matplotlib:用于绘制各种图表。numpy和pillow:wordcloud的依赖项。
- 准备文本文件:将《离骚》全文保存为一个名为
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:用于机器学习,可以进行更高级的文本分类、聚类。spacy或NLTK:专业级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!