作为一部跨越十年的经典美剧,《老友记》的剧本文本量堪称庞大——全十季共236集,原始剧本文件往往混杂着场景描述、角色对话和中英双语台词。去年我在整理这些资料时,发现手动处理不仅耗时费力,还难以实现高级检索和统计分析。于是我用Python开发了一套自动化处理流程,现在把核心思路和代码分享给同样热爱技术与这部剧集的你。
拿到原始剧本文件的第一件事,是观察其文本特征。典型的美剧剧本通常包含以下元素:
第一季第一集 中央咖啡馆)python复制def detect_scene(text):
"""识别场景标题的正则表达式"""
import re
pattern = r'第.季第.集.*'
return re.match(pattern, text)
sample_text = "第一季第一集 中央咖啡馆"
print(detect_scene(sample_text)) # 输出匹配对象
处理这类文本时,建议先建立结构化存储模型。我用SQLite设计了这样的数据库表结构:
| 字段名 | 类型 | 描述 |
|---|---|---|
| season | INT | 季数 |
| episode | INT | 集数 |
| scene | TEXT | 场景描述 |
| character | TEXT | 角色名 |
| dialogue_en | TEXT | 英文台词 |
| dialogue_cn | TEXT | 中文翻译 |
| stage_direction | TEXT | 舞台指示 |
提示:在正式处理前,建议先用小样本测试正则表达式的准确性。我曾因为漏考虑空格字符导致20%的场景未被正确识别。
实际处理时会遇到几个典型问题:
这个函数可以高效分离中英文台词:
python复制def split_bilingual(text):
"""分离中英文混合台词"""
import re
en_part = re.sub(r'[\u4e00-\u9fa5]+', '', text).strip()
cn_part = re.sub(r'[^\u4e00-\u9fa5]', '', text).strip()
return en_part, cn_part
sample = "There's nothing to tell! 这没什么好说的"
print(split_bilingual(sample))
# 输出: ("There's nothing to tell!", "这没什么好说的")
对于角色对话的提取,我总结出这些特征:
python复制def extract_dialogue(text):
"""提取角色对话"""
lines = text.split('\n')
dialogues = []
current_character = None
for line in lines:
if line.isupper() or ':' in line:
current_character = line.split(':')[0]
elif line.strip() and current_character:
dialogues.append((current_character, line))
return dialogues
当数据完成结构化存储后,真正的乐趣才开始。以下是几个值得尝试的分析方向:
python复制def count_character_lines(db_path):
"""统计各角色台词数量"""
import sqlite3
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
query = """
SELECT character, COUNT(*) as line_count
FROM scripts
GROUP BY character
ORDER BY line_count DESC
LIMIT 10
"""
cursor.execute(query)
return cursor.fetchall()
# 示例输出:
# [('CHANDLER', 4231), ('JOEY', 3987), ('ROSS', 3852)]
使用NLTK库分析台词情感倾向:
python复制from nltk.sentiment import SentimentIntensityAnalyzer
def analyze_sentiment(text):
sia = SentimentIntensityAnalyzer()
return sia.polarity_scores(text)
sample = "This is the best day ever!"
print(analyze_sentiment(sample))
# 输出: {'neg': 0.0, 'neu': 0.308, 'pos': 0.692, 'compound': 0.6696}
用WordCloud可视化高频词汇:
python复制def generate_wordcloud(texts):
from wordcloud import WordCloud
import matplotlib.pyplot as plt
wordcloud = WordCloud(width=800, height=400).generate(' '.join(texts))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
# 使用示例
# generate_wordcloud(all_ross_dialogues)
为了让整个流程更易用,我最终打包成命令行工具:
code复制friends_script_analyzer/
├── scripts/ # 原始剧本存放目录
├── processed/ # 处理后的结构化数据
├── config.yaml # 配置文件
├── requirements.txt # 依赖库
└── main.py # 主程序
典型使用流程:
python main.py --process-all进行批量处理python main.py --query "character=CHANDLER"进行特定查询python main.py --analyze sentiment生成情感分析报告注意:处理完整十季剧本约需要3-5分钟(取决于硬件配置),建议首次运行时先用小样本测试。
这套系统最让我惊喜的应用是创建个性化台词检索——比如找出所有包含"smelly cat"的片段,或是统计Joey说"How you doin'"的次数。有次朋友聚会时,我甚至用它能即时调出任意场景的完整对话,成了当晚最受欢迎的"活字典"。
完整项目代码和示例数据已整理在GitHub仓库(需替换为实际可用链接),包含:
遇到任何技术问题欢迎在项目Issues区讨论。毕竟,正如这部剧教会我们的——技术问题的解决之道,有时候就像Monica的厨房秘密一样,需要朋友们的共同智慧。