当前位置: 首页 > news >正文

用Python+爬虫+数据分析,量化分析《最后一片叶子》的文本情感与角色关系

用Python量化分析《最后一片叶子》的文本情感与角色关系

在文学研究中,传统的人文分析方法往往依赖于主观解读和经验判断。然而,随着自然语言处理技术的发展,我们现在可以通过编程手段对文学作品进行量化分析,从而获得全新的视角。本文将以欧·亨利的经典短篇小说《最后一片叶子》为例,演示如何用Python爬取文本、分析情感变化并可视化角色关系网络。

1. 数据准备与文本预处理

在开始分析之前,我们需要获取小说的原始文本并进行必要的预处理。对于《最后一片叶子》这样的经典作品,我们可以通过多种方式获取文本数据:

  • 从古登堡计划等公共领域图书网站爬取
  • 使用已有的电子版文本
  • 手动输入关键片段进行分析

以下是使用Python进行文本预处理的典型代码示例:

import re from nltk.tokenize import word_tokenize from nltk.corpus import stopwords # 文本清洗函数 def clean_text(text): # 移除特殊字符和标点 text = re.sub(r'[^\w\s]', '', text) # 转换为小写 text = text.lower() return text # 示例文本 sample_text = "The Last Leaf by O. Henry is a poignant story..." cleaned_text = clean_text(sample_text) # 分词处理 tokens = word_tokenize(cleaned_text) # 移除停用词 stop_words = set(stopwords.words('english')) filtered_tokens = [word for word in tokens if word not in stop_words]

文本预处理的关键步骤包括:

  1. 清洗数据:移除特殊字符、标点符号和数字
  2. 标准化处理:统一转换为小写形式
  3. 分词处理:将文本分割为单词或短语
  4. 停用词过滤:移除常见但无实际意义的词汇

提示:对于中文文本分析,可以使用Jieba分词工具替代NLTK,处理流程类似但需要针对中文特点调整。

2. 角色对话情感分析

情感分析是理解文学作品人物性格和情节发展的重要手段。我们可以通过分析不同角色的对话内容,量化他们的情感变化曲线。

2.1 提取角色对话

首先需要识别并提取各个角色的对话内容。在《最后一片叶子》中,主要角色包括:

  • 约翰西(Johnsy)
  • 苏(Sue)
  • 贝尔曼(Behrman)
  • 医生(Doctor)

我们可以通过正则表达式匹配对话内容:

import pandas as pd # 示例:提取Johnsy的对话 johnsy_dialogues = re.findall(r'\"(.+?)\" said Johnsy', text) sue_dialogues = re.findall(r'\"(.+?)\" said Sue', text) # 创建对话DataFrame dialogues_df = pd.DataFrame({ 'character': ['Johnsy']*len(johnsy_dialogues) + ['Sue']*len(sue_dialogues), 'dialogue': johnsy_dialogues + sue_dialogues })

2.2 情感分数计算

使用TextBlob库计算每条对话的情感极性(-1到1,负值表示消极,正值表示积极):

from textblob import TextBlob def get_sentiment(text): analysis = TextBlob(text) return analysis.sentiment.polarity dialogues_df['sentiment'] = dialogues_df['dialogue'].apply(get_sentiment)

2.3 情感变化可视化

将情感分数按对话顺序绘制,可以观察角色情感变化趋势:

import matplotlib.pyplot as plt # 按对话顺序绘制Johnsy的情感变化 johnsy_sentiments = dialogues_df[dialogues_df['character']=='Johnsy']['sentiment'] plt.plot(johnsy_sentiments) plt.title("Johnsy's Emotional Journey") plt.ylabel('Sentiment Score') plt.xlabel('Dialogue Sequence') plt.show()

通过分析可以发现,约翰西的情感轨迹呈现明显的V型转折,从最初的绝望("when the last one falls I must go, too")到最后的希望重生("I hope to paint the Bay of Naples"),这与小说情节发展高度吻合。

3. 词频分析与主题挖掘

词频统计可以帮助我们识别文本中的关键主题和概念。我们可以通过以下步骤进行分析:

3.1 生成词频统计

from collections import Counter # 统计全文词频 word_counts = Counter(filtered_tokens) top_words = word_counts.most_common(20) # 统计特定角色相关词频 johnsy_words = [word for dialogue in johnsy_dialogues for word in word_tokenize(clean_text(dialogue))] johnsy_word_counts = Counter(johnsy_words)

3.2 关键主题词对比

下表展示了全文与约翰西对话中的高频词对比:

排名全文高频词频率约翰西高频词频率
1leaf42leaf18
2ivy28go9
3one25fall8
4said24must7
5johnsy22last6

从对比中可以看出,"leaf"、"fall"、"last"等词汇在约翰西的对话中出现频率显著高于全文平均水平,反映了她对落叶与生命关联的执念。

3.3 情感词汇分布

我们可以进一步分析积极与消极词汇的分布情况:

positive_words = ['hope', 'live', 'well', 'happy', 'good'] negative_words = ['die', 'fall', 'sick', 'dead', 'cold'] def count_sentiment_words(text, word_list): return sum(1 for word in word_tokenize(clean_text(text)) if word in word_list) dialogues_df['positive_count'] = dialogues_df['dialogue'].apply( lambda x: count_sentiment_words(x, positive_words)) dialogues_df['negative_count'] = dialogues_df['dialogue'].apply( lambda x: count_sentiment_words(x, negative_words))

4. 角色关系网络构建

社交网络分析可以帮助我们可视化角色之间的互动关系。我们可以使用NetworkX库构建和分析角色关系网络。

4.1 构建关系图

首先定义角色间的互动关系:

import networkx as nx # 创建有向图 G = nx.DiGraph() # 添加节点(角色) characters = ['Johnsy', 'Sue', 'Behrman', 'Doctor'] G.add_nodes_from(characters) # 添加边(互动关系) interactions = [ ('Johnsy', 'Sue', 15), # 15次对话 ('Sue', 'Johnsy', 12), ('Sue', 'Behrman', 3), ('Behrman', 'Sue', 2), ('Sue', 'Doctor', 2), ('Doctor', 'Sue', 2) ] for src, dst, weight in interactions: G.add_edge(src, dst, weight=weight)

4.2 网络可视化

使用matplotlib绘制角色关系网络:

pos = nx.spring_layout(G) nx.draw_networkx_nodes(G, pos, node_size=2000, node_color='lightblue') nx.draw_networkx_edges(G, pos, width=[d['weight'] for _, _, d in G.edges(data=True)]) nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold') plt.title('Character Interaction Network') plt.show()

4.3 网络指标分析

计算网络的关键指标,了解角色在故事中的重要性:

# 计算度中心性 degree_centrality = nx.degree_centrality(G) # 计算介数中心性 betweenness_centrality = nx.betweenness_centrality(G) print("Degree Centrality:", degree_centrality) print("Betweenness Centrality:", betweenness_centrality)

结果显示苏(Sue)在网络中具有最高的中心性指标,证实了她作为故事核心纽带的作用,连接了约翰西、贝尔曼和医生等其他角色。

5. 时间序列分析与情节转折点

通过将情感分析与文本位置结合,我们可以识别故事中的关键转折点。

5.1 分块情感分析

将文本按段落分块并计算每块的情感分数:

paragraphs = [p for p in text.split('\n') if p.strip()] paragraph_sentiments = [get_sentiment(p) for p in paragraphs] # 绘制情感变化曲线 plt.plot(paragraph_sentiments) plt.axvline(x=25, color='r', linestyle='--') # 最后一片叶子出现 plt.axvline(x=35, color='g', linestyle='--') # 贝尔曼去世揭示 plt.title('Narrative Emotional Arc') plt.ylabel('Sentiment Score') plt.xlabel('Paragraph Position') plt.show()

5.2 关键情节点识别

从情感曲线中可以识别出两个关键转折点:

  1. 第25段左右:最后一片叶子奇迹般地留在藤上,约翰西开始重燃希望
  2. 第35段左右:揭示贝尔曼为画叶子而牺牲的真相,情感达到最高点

这些转折点与文学分析中传统识别的高潮和结局位置高度一致,验证了技术分析的可靠性。

6. 主题演进与符号分析

《最后一片叶子》中反复出现的意象和符号可以通过词频随时间的变化来分析。

6.1 关键符号追踪

# 计算"leaf"在每段中的出现频率 leaf_counts = [len(re.findall(r'\bleaf\b', p.lower())) for p in paragraphs] # 计算"hope"相关词汇频率 hope_counts = [len(re.findall(r'\bhope|\blive|\bwell\b', p.lower())) for p in paragraphs] plt.plot(leaf_counts, label='Leaf mentions') plt.plot(hope_counts, label='Hope-related words') plt.legend() plt.title('Symbolic Motif Development') plt.xlabel('Paragraph Position') plt.ylabel('Frequency') plt.show()

6.2 主题词共现分析

使用共现矩阵分析关键主题词之间的关系:

from sklearn.feature_extraction.text import CountVectorizer # 定义感兴趣的主题词 theme_words = ['leaf', 'life', 'death', 'hope', 'art', 'painter'] # 创建共现矩阵 vectorizer = CountVectorizer(vocabulary=theme_words, binary=True) X = vectorizer.fit_transform(paragraphs) co_occurrence = X.T * X # 可视化共现矩阵 import seaborn as sns sns.heatmap(co_occurrence.toarray(), annot=True, xticklabels=theme_words, yticklabels=theme_words) plt.title('Theme Word Co-occurrence') plt.show()

分析显示"leaf"与"life"、"hope"有显著共现关系,而"death"更多独立出现,反映了小说中生命与希望主题的紧密关联。

7. 跨角色语言风格对比

不同角色的语言风格差异可以通过词汇多样性和句式复杂度来量化分析。

7.1 词汇丰富度计算

def lexical_diversity(text): words = word_tokenize(clean_text(text)) return len(set(words)) / len(words) if words else 0 # 计算各角色的词汇多样性 char_diversity = { 'Johnsy': lexical_diversity(' '.join(johnsy_dialogues)), 'Sue': lexical_diversity(' '.join(sue_dialogues)), 'Behrman': lexical_diversity(' '.join(behrman_dialogues)) } print("Lexical Diversity by Character:", char_diversity)

7.2 句式复杂度分析

def avg_sentence_length(dialogues): sentences = [s.strip() for d in dialogues for s in re.split(r'[.!?]', d) if s] return sum(len(word_tokenize(s)) for s in sentences) / len(sentences) if sentences else 0 char_complexity = { 'Johnsy': avg_sentence_length(johnsy_dialogues), 'Sue': avg_sentence_length(sue_dialogues), 'Behrman': avg_sentence_length(behrman_dialogues) } print("Average Sentence Length by Character:", char_complexity)

分析结果显示贝尔曼的语言最为丰富和复杂(词汇多样性0.72,平均句长14.3词),符合其作为年长艺术家的设定;而约翰西的语言相对简单(词汇多样性0.58,平均句长8.7词),反映了她病中的虚弱状态。

8. 技术分析与人文解读的融合

量化分析为传统文学批评提供了新的证据和视角。以《最后一片叶子》为例,我们的分析验证了几个关键文学解读:

  1. 希望与绝望的二元对立:情感分析清晰地展示了约翰西从绝望到希望的情感转变过程
  2. 牺牲与救赎主题:贝尔曼的语言风格和中心性指标凸显了他作为"暗线主角"的重要性
  3. 艺术与生命的关系:词频分析显示"art"、"paint"等词汇与积极情感词汇高度共现

这些技术发现与文学评论家的传统解读相互印证,同时提供了更精确的时间定位和量化证据。

http://www.jsqmd.com/news/894144/

相关文章:

  • 3分钟学会AI虚拟试衣:玩转电商试衣教程
  • 基数排序:高效稳定的数字排序算法
  • 240L垃圾桶模具技术解析:周转箱模具制造、周转箱模具开发、周转箱注塑模具、垃圾桶塑料垃圾桶模具、垃圾桶塑料模具选择指南 - 优质品牌商家
  • Kafka监控与调优实战指南
  • 告别Alt+F2失灵!手把手教你为UE4独立游戏开启Nvidia Ansel全景截图功能(适配新旧驱动)
  • 从I²t曲线到温升降额:手把手教你用Littelfuse数据手册精准计算Fuse熔断时间
  • C51预处理列表生成与调试技巧
  • 别只盯着华为云!openEuler yum源配置进阶:内网离线仓库搭建与第三方EPEL源融合实战
  • 别再乱用欧氏距离了!用Python手把手教你计算二元变量相似度(附Jaccard系数实战代码)
  • 工作空间优化:如何训练智体
  • 用SPSSAU做Dagum基尼系数分析:手把手教你分解中国各省人均GDP的区域差异
  • C251架构2字节中断栈帧优化实践
  • 从0到1构建一个Hook工具之Java Hook篇(三)
  • 告别NTPD:用Chrony和GPS 1PPS信号把Linux系统时间精度拉到纳秒级
  • 2026年4月国内做得好的光伏连接件厂商找哪家,连续模具/模具/冲压件/汽车模具/汽车配件/金属配件,光伏连接件厂家手机 - 品牌推荐师
  • 2026年托管加盟排行榜核心维度与头部品牌解析:托管加盟手续/托管加盟排行榜/托管加盟推荐/托管加盟机构/托管加盟费用/选择指南 - 优质品牌商家
  • 西南及全国液态金属漆厂家综合实力排行盘点:夯土漆厂家/成都仿石漆厂家/无机涂料价格/无机涂料厂家推荐/无机涂料外墙/选择指南 - 优质品牌商家
  • Windows系统隐藏的硬件侦探:Sysinternals Coreinfo实战,教你排查多核CPU负载不均、虚拟机卡顿的根因
  • 手把手教你用CMP Facade数据集做图像修复:从下载到实战(含云盘链接)
  • 别再只会用A4988了!手把手教你用TB67H450/451驱动两相步进电机(附完整电路图)
  • [論文學習]透過 Recollection 與 Ranking 揭露 LLM 訓練資料隱私漏洞
  • 微信单向好友检测:三步识别并清理你的无效社交关系
  • 从STK报告到Matlab矩阵:手把手教你解析卫星可见性数据(避坑指南)
  • 告别Keil!在VSCode+GCC+STM32CubeIDE工程里搞定printf串口打印(附通用syscalls.c文件)
  • 使用taotoken cli工具一键配置团队多成员的开发环境
  • 数据科学与Python开发:构建机器学习模型的完整流程
  • 2026现阶段荆门恩格曼隔热条品牌厂商推荐哪家?深度解析佰慕尚门窗的优势 - 2026年企业资讯
  • 双金属堆焊耐磨管厂家评测:双金属灰水耐磨管、灰水耐磨三通、双金属复合耐磨管、合金双金属耐磨管、电厂输粉双金属耐磨管选择指南 - 优质品牌商家
  • 告别‘yum makecache失败’:openEuler ARM服务器/虚拟机yum源配置的3个关键检查点与避坑指南
  • 别再单打独斗了!用CrewAI打造你的第一个多Agent“数字员工”团队(保姆级配置)