如何在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
相关产品推荐
相关产品推荐

