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

如何在Pandas DataFrame中实现条件分组以提取AMI转录数据集的话语并识别交叉对话

我来帮你搞定这个分组和交叉对话检测的问题!咱们一步步来实现你的需求:

处理AMI转录数据集:话语分组与交叉对话检测

步骤1:计算关键分割指标

首先我们需要给原DataFrame新增辅助列,用来判断哪些单词属于同一个话语。核心是计算同说话者相邻单词的时间间隔,并标记话语的分割点:

import pandas as pd

# 复制原数据避免修改原始内容
df = your_dataframe.copy()
# 确保数据按时间/索引顺序排列(你的示例是按序的,保险起见做个排序)
df = df.sort_index()

# 新增列:下一个单词的说话者、下一个单词的开始时间
df['next_speaker'] = df['speaker'].shift(-1)
df['next_start'] = df['start_time'].shift(-1)

# 计算同说话者相邻单词的时间间隔:不同说话者直接设为1.0(超过0.5秒,触发分割)
df['interval'] = df.apply(
    lambda row: row['next_start'] - row['end_time'] 
    if row['speaker'] == row['next_speaker'] 
    else 1.0,
    axis=1
)

# 标记话语结束点:间隔超0.5秒 或 说话者变化
df['is_utterance_end'] = (df['interval'] > 0.5) | (df['speaker'] != df['next_speaker'])
# 给每个话语分配唯一ID(从1开始计数)
df['utterance_id'] = df['is_utterance_end'].cumsum() + 1

步骤2:分组提取话语核心信息

现在我们可以按utterance_id分组,提取每个话语的说话者、单词列表、时间范围和原索引:

utterances = df.groupby('utterance_id').agg(
    speaker=('speaker', 'first'),
    words=('word', list),
    start_time=('start_time', 'min'),
    end_time=('end_time', 'max'),
    original_indices=('index', list)
).reset_index()

# 整理单词格式(去掉示例里的单引号,比如把'Kay转成Kay)
utterances['words'] = utterances['words'].apply(
    lambda x: [w.strip("'") if w.startswith("'") else w for w in x]
)

这一步生成的utterancesDataFrame会完全匹配你示例里的7个话语,比如第5个话语会包含A的所有连续单词,原索引对应8-19。

步骤3:检测交叉对话

交叉对话的核心判断逻辑是:当前话语的时间范围,是否和其他说话者的任意单词时间有重叠。我们写个辅助函数来实现:

def check_cross_talk(row, original_df):
    current_speaker = row['speaker']
    current_start = row['start_time']
    current_end = row['end_time']
    
    # 检查是否存在其他说话者的单词,时间和当前话语有交集
    overlap_mask = (
        (original_df['speaker'] != current_speaker) &
        (original_df['start_time'] < current_end) &
        (original_df['end_time'] > current_start)
    )
    return overlap_mask.any()

# 给每个话语添加交叉对话标记
utterances['has_cross_talk'] = utterances.apply(check_cross_talk, args=(df,), axis=1)

运行后,你示例里的第2、3、6、7个话语会被标记为True(存在交叉对话),其余为False,完全符合你的要求。

验证结果

你可以打印utterances查看最终输出,比如:

  • 第6个话语:说话者E,单词列表['Is', 'there', 'much', 'more', 'in', 'it', 'than', 'he'],has_cross_talk=True
  • 第7个话语:说话者D,单词列表['I', 'I', 'dry-read'],has_cross_talk=True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:28:11