如何基于Watson Speech-to-Text输出重构带时序的对话?
如何将Watson Speech-to-Text的词汇按连续说话人分组
针对你用Watson Speech-to-Text得到的分词DataFrame,要把连续同说话人的词汇合并成组,我给你整理了一套简洁的实现方案,咱们直接上代码和解释:
首先,先把你的示例数据转换成DataFrame方便操作:
import pandas as pd words = [['said', 0.01, 0.06, 0],['this', 0.06, 0.12, 0],['said', 0.12, 0.15, 1],['that', 0.15, 0.22, 1],['said', 0.22, 0.31, 0],['something', 0.31, 0.45, 0],['else', 0.45, 0.56, 0]] df = pd.DataFrame(words, columns=['word', 'start_time', 'end_time', 'speaker'])
接下来关键的一步是生成分组标识:我们需要判断每一行的说话人和上一行是否不同,如果不同就开启一个新分组。用shift()对比当前行和上一行的speaker,再用cumsum()生成唯一的分组ID:
# 生成分组ID:当speaker变化时,分组号+1 df['group_id'] = (df['speaker'] != df['speaker'].shift()).cumsum()
然后就可以按group_id聚合了,聚合规则很明确:
- 词汇列:把同一组的word拼成列表
- start_time:取组内最小的起始时间(也就是第一个词的start)
- end_time:取组内最大的结束时间(也就是最后一个词的end)
- speaker:取组内任意一个即可(因为同一组speaker相同)
代码实现:
grouped_df = df.groupby('group_id').agg( words_list=('word', list), start_time=('start_time', 'min'), end_time=('end_time', 'max'), speaker=('speaker', 'first') ).reset_index(drop=True)
最后把聚合后的DataFrame转换成你需要的嵌套列表格式:
grouped_words = grouped_df.apply(lambda x: [x['words_list'], x['start_time'], x['end_time'], x['speaker']], axis=1).tolist()
运行完这些代码,grouped_words就是你想要的结果:
[[['said', 'this'], 0.01, 0.12, 0], [['said', 'that'], 0.12, 0.22, 1], [['said', 'something', 'else'], 0.22, 0.56, 0]]
补充说明
- 这个方法完美处理说话人多次切换的情况,哪怕同一个说话人在不同时间段出现,也会被分成不同的组(完全符合你要的“连续说出的词汇分组”需求)
- 如果你的原始DataFrame包含其他字段,只需要调整
agg里的对应字段即可,核心逻辑完全通用
内容的提问来源于stack exchange,提问作者cookie1986
相关产品推荐
相关产品推荐

