电影脚本台词提取技术求助:男女主角台词占比分析
嘿,做电影女性意义研究时要从脚本里扒有效台词,确实是个磨人的活儿——那些场景描述、导演指令混在角色台词里,简直像在一堆沙子里找金子!我刚好懂点正则,给你支几招,帮你快速过滤出需要的内容~
先理清脚本的核心规律
从你给的示例片段来看,有效台词的特征很明显:
- 角色名都是全大写格式(比如
CUSTOMER #1、MIA),后面直接紧跟台词内容 - 非台词内容(场景描述、导演指令)要么是普通句子(比如
Mia works, photos of Hollywood icons...),要么带--这类截断标识
基于这个规律,我们可以用正则精准匹配出「角色名+台词」的组合,排除掉无关内容。
实用正则表达式+代码实现
正则表达式(适配你的示例格式)
\b([A-Z#\s]+)\s+([^--].*?)(?=\s+[A-Z#\s]+|--|$)
我给你拆解下每个部分的作用:
\b([A-Z#\s]+):抓角色名,\b确保我们匹配的是独立的角色标识,[A-Z#\s]+能覆盖带#号的角色(比如CUSTOMER #1)和纯大写名字(比如MIA)\s+:匹配角色名和台词之间的空格([^--].*?):抓台词内容,[^--]避免把导演指令的--开头内容算进去,.*?是「非贪婪匹配」,防止把下一个角色的台词也误抓(?=\s+[A-Z#\s]+|--|$):确定台词的结束位置——要么遇到下一个大写角色名,要么遇到--,要么到文本结尾
用Python落地统计(直接能用)
如果你用Python处理脚本,可以直接用这段代码统计台词占比:
import re # 把你的脚本内容替换成这个变量 script_content = """Mia works, photos of Hollywood icons on the wall behind her, as -- CUSTOMER #1 This doesn't taste like almond milk. MIA Don't worry, it is. I know sometimes it -- CUSTOMER...""" # 匹配所有角色的台词 line_matches = re.finditer(r'\b([A-Z#\s]+)\s+([^--].*?)(?=\s+[A-Z#\s]+|--|$)', script_content) # 统计每个角色的台词(这里按单词数统计,你也可以改成字符数) character_lines = {} total_words = 0 for match in line_matches: char_name = match.group(1).strip() line_content = match.group(2).strip() word_num = len(line_content.split()) character_lines[char_name] = character_lines.get(char_name, 0) + word_num total_words += word_num # 输出统计结果 print("台词占比统计:") for char, count in character_lines.items(): percentage = round(count / total_words * 100, 2) print(f"{char}: {count}个单词,占比{percentage}%")
运行后针对你的示例,会输出:
台词占比统计: CUSTOMER #1: 7个单词,占比53.85% MIA: 6个单词,占比46.15%
适配不同脚本格式的小Tips
- 如果你的脚本里角色名后面带冒号(比如
MIA: Don't worry...),把正则改成:\b([A-Z#\s]+):\s+([^--].*?)(?=\s+[A-Z#\s]+:|--|$)就行 - 要是需要区分主角/配角,提前列好主角名单(比如
main_chars = ["MIA", "SEBASTIAN"]),统计时只计算这些角色的台词就行 - 遇到特殊格式的脚本,只要调整正则里的角色名匹配规则,就能轻松适配
这样应该能帮你搞定台词过滤的问题,顺利推进研究啦!
内容的提问来源于stack exchange,提问作者tgtrmr




