You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取每位说话者的唯一词汇及词频?代码问题求助

对话文本说话者词汇统计实现方案

需求

从以下对话文本中提取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}")

代码说明

  1. 数据结构:使用嵌套defaultdict,自动初始化说话者和词汇的统计项,避免键不存在的报错
  2. 字符修复:将文本中的乱码引号替换为标准单引号,确保词汇统计的一致性
  3. 文本清理:用正则表达式移除标点,统一转为小写,消除"Thing"和"thing"这类大小写差异带来的统计误差
  4. 说话者统一:将"WAYMAR ROYCE"映射为"ROYCE",匹配需求中指定的说话者范围
  5. 统计逻辑:遍历每个词汇,累加对应说话者的词汇出现次数
  6. 结果输出:按说话者分组,以出现次数降序展示词汇和对应次数

内容的提问来源于stack exchange,提问作者ADITYA YADAV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:03:35