如何获取每位说话者的唯一词汇及词频?代码问题求助
对话文本说话者词汇统计实现方案
需求
从以下对话文本中提取WILL、GARED、ROYCE三位说话者各自发言中的唯一词汇及其出现次数:
WILL: I’ve never seen wildlings do a thing like this. I’ve never seen a thing like this, not ever in my life. WAYMAR ROYCE: How close did you get? WILL: Close as any man would. GARED: We should head back to the wall. ROYCE: Do the dead frighten you? GARED: Our orders were to track the wildlings. We tracked them. They won’t trouble us no more.
原代码问题分析
你提供的代码存在以下核心问题:
- 未按行处理文本,直接对整个文件内容执行
split(":"),导致说话者与内容的拆分逻辑完全混乱 - 没有实现词汇统计的核心逻辑,仅尝试存储说话者和对应内容,未完成需求目标
- 未处理文本中的乱码字符(如
’)和标点符号,会严重影响词汇统计的准确性
正确实现代码
import re from collections import defaultdict # 初始化嵌套字典,存储每个说话者的词汇统计结果 speaker_word_stats = defaultdict(lambda: defaultdict(int)) # 修复文本中的乱码引号 def fix_special_quotes(text): return text.replace('’', "'") # 清理文本:去除标点、统一小写、拆分词汇 def process_text(content): # 移除所有非字母、数字和单引号的字符 cleaned_content = re.sub(r'[^a-zA-Z0-9\']', ' ', content) # 转为小写并拆分词汇,避免大小写差异导致统计错误 words = cleaned_content.lower().split() return words # 读取并处理对话文件 with open("conv.txt", "r", encoding='utf-8') as file: for line in file: line = line.strip() if not line: continue # 跳过空行 # 按第一个冒号拆分说话者与内容 if ":" in line: speaker, content = line.split(":", 1) speaker = speaker.strip() # 统一说话者名称:将WAYMAR ROYCE转为ROYCE if speaker == "WAYMAR ROYCE": speaker = "ROYCE" # 仅处理指定的三位说话者 if speaker in ["WILL", "GARED", "ROYCE"]: content = fix_special_quotes(content.strip()) words = process_text(content) # 统计每个词汇的出现次数 for word in words: speaker_word_stats[speaker][word] += 1 # 格式化输出结果 for speaker, stats in speaker_word_stats.items(): print(f"--- {speaker} 的词汇统计 ---") # 按出现次数降序排列输出 for word, count in sorted(stats.items(), key=lambda x: x[1], reverse=True): print(f"{word}: {count}")
代码说明
- 数据结构:使用嵌套
defaultdict,自动初始化说话者和词汇的统计项,避免键不存在的报错 - 字符修复:将文本中的乱码引号替换为标准单引号,确保词汇统计的一致性
- 文本清理:用正则表达式移除标点,统一转为小写,消除"Thing"和"thing"这类大小写差异带来的统计误差
- 说话者统一:将"WAYMAR ROYCE"映射为"ROYCE",匹配需求中指定的说话者范围
- 统计逻辑:遍历每个词汇,累加对应说话者的词汇出现次数
- 结果输出:按说话者分组,以出现次数降序展示词汇和对应次数
内容的提问来源于stack exchange,提问作者ADITYA YADAV
相关产品推荐
相关产品推荐

