核心答案是通过python读取、清洗、分词、统计词频、过滤停用词、情感分析和主题建模来分析电影台词;2. 首先用read_script读取utf-8编码的剧本文件;3. 用正则表达式clean_script移除场景描述、人物名及空行;4. 使用word_tokenize分词并用counter统计高频词;5. 通过stopwords过滤无意义词后再次统计;6. 调用vader进行情感分析获得四类得分;7. 可选lda模型挖掘深层主题;8. 不同剧本格式需定制正则或转为统一文本;9. 提升情感准确性可自定义词典、用深度学习模型或结合剧情;10. 还可拓展分析人物关系、剧情起伏、语言风格和文化背景,完整实现机器对电影内容的理解。
用Python源码分析电影台词,核心在于提取、清洗、分析文本数据,进而识别剧本的主题和情感。简单来说,就是让机器读懂电影在说什么。
解决方案
首先,你需要一个电影剧本的文本文件。别指望直接从视频里提取台词,那得用到更复杂的语音识别技术,咱们先从简单的开始。
立即学习“Python免费学习笔记(深入)”;
- 读取剧本文件:
def read_script(filepath): with open(filepath, 'r', encoding='utf-8') as f: script = f.read() return script script = read_script('your_movie_script.txt') # 替换成你的剧本文件路径
这里用了utf-8编码,因为很多剧本文件都包含特殊字符。
- 文本清洗:
剧本里除了台词,还有人物名字、场景描述等等。我们需要把这些噪音去掉。
import re def clean_script(script): # 移除场景描述(假设场景描述都在方括号里) script = re.sub(r'[.*?]', '', script) # 移除人物名字(假设人物名字后面跟着冒号) script = re.sub(r'^[A-Zs]+:', '', script, flags=re.MULTILINE) # 移除多余的空行 script = re.sub(r'n+', 'n', script).strip() return script cleaned_script = clean_script(script)
这个清洗方法比较粗糙,可能需要根据你的剧本格式进行调整。比如,人物名字的格式可能不一样,场景描述也可能用其他符号。
- 分词:
把清洗后的文本分割成一个个单词。
import nltk from nltk.tokenize import word_tokenize nltk.download('punkt') # 首次运行需要下载punkt tokens = word_tokenize(cleaned_script)
- 词频统计:
统计每个单词出现的次数。
from collections import Counter word_counts = Counter(tokens) # 打印出现频率最高的10个词 print(word_counts.most_common(10))
通过词频统计,你可以初步了解剧本的主题。比如,如果”love”、”heart”、”forever”出现频率很高,那很可能是一个爱情故事。
- 停用词过滤:
像”the”、”a”、”is”这些词对分析主题没什么帮助,需要过滤掉。
from nltk.corpus import stopwords nltk.download('stopwords') # 首次运行需要下载stopwords stop_words = set(stopwords.words('english')) filtered_tokens = [w for w in tokens if not w in stop_words] filtered_word_counts = Counter(filtered_tokens) print(filtered_word_counts.most_common(10))
- 情感分析:
可以使用现成的情感分析库,比如VADER。
from nltk.sentiment.vader import SentimentIntensityAnalyzer nltk.download('vader_lexicon') # 首次运行需要下载vader_lexicon sid = SentimentIntensityAnalyzer() def analyze_sentiment(text): scores = sid.polarity_scores(text) return scores sentiment_scores = analyze_sentiment(cleaned_script) print(sentiment_scores)
VADER会返回一个包含积极、消极、中性和复合情感得分的字典。
- 主题建模(进阶):
如果想更深入地挖掘主题,可以使用主题建模技术,比如Latent Dirichlet Allocation (LDA)。这需要用到gensim库。
from gensim import corpora, models # 创建词典 dictionary = corpora.Dictionary([filtered_tokens]) # 创建文档词袋模型 doc_term_matrix = [dictionary.doc2bow(tokens) for tokens in [filtered_tokens]] # LDA模型 lda_model = models.LdaModel(doc_term_matrix, num_topics=3, id2word=dictionary, passes=15) # 打印主题 topics = lda_model.print_topics(num_words=5) for topic in topics: print(topic)
LDA会将剧本分成几个主题,并列出每个主题相关的关键词。
如何处理不同格式的剧本文件?
剧本格式五花八门,有的用 Courier New 字体,有的用 Final Draft 软件,所以清洗文本这一步非常关键。你需要仔细观察剧本的结构,找到人物名字、场景描述、台词的规律,然后编写相应的正则表达式。如果剧本格式非常复杂,可以考虑使用专门的剧本解析库,比如screenplain,但这类库可能需要付费。另一个思路是,手动将剧本转换成统一的格式,比如 Markdown 或纯文本,再进行分析。
如何提高情感分析的准确性?
VADER虽然简单易用,但它的情感词典是通用的,可能不适用于所有电影。比如,一些电影里可能会出现反讽、幽默等特殊情况,导致VADER的分析结果不准确。为了提高准确性,你可以尝试以下方法:
- 自定义情感词典: 根据电影的特点,添加或修改VADER的情感词典。
- 使用更高级的情感分析模型: 比如,使用基于深度学习的情感分析模型,这些模型通常能够更好地理解上下文。
- 结合其他信息: 比如,结合人物关系、剧情发展等信息,进行更全面的情感分析。
除了主题和情感,还能分析什么?
除了主题和情感,还可以分析以下内容:
- 人物关系: 分析人物之间的对话,构建人物关系网络。
- 剧情发展: 分析不同场景的情感变化,了解剧情的起伏。
- 语言风格: 分析人物的用词习惯,了解人物的性格特点。
- 文化背景: 分析剧本中出现的文化元素,了解电影的文化背景。
例如,你可以统计每个角色说的台词数量,看看谁是主角;你可以分析不同角色之间的对话情感,看看他们之间的关系是友好还是敌对;你还可以分析剧本中出现的地点、时间等信息,了解故事发生的背景。