如何在有序对话转录中合并同一说话者连续文本(R语言)
解决R语言合并连续同一说话者对话的问题
要实现合并连续同一说话者的内容,同时保留非连续同名者的独立条目,可通过拆分文本、分组连续同名者、合并内容三个核心步骤完成,下面是具体实现方案:
方法实现(基于tidyverse和data.table)
# 加载所需工具包 library(dplyr) library(stringr) library(data.table) # 原始数据 df <- data.frame(x = c("Tom: I like cheese.", "Tom: Cheese is good.", "Tom: Muenster is my favorite.", "Bob: No, I like Cheddar.", "Tom: You're wrong. I think cheddar is only good on burgers.", "Gina: But what about American on burgers?", "Gina: That's better.", "Bob: Yeah, I agree with Gina.", "Bob: American is better on burgers. Cheddar is for grating on nachos.")) # 1. 拆分姓名与对话内容 df_processed <- df %>% mutate( # 提取冒号前的说话者姓名 speaker = str_extract(x, "^[^:]+"), # 提取纯对话内容(移除姓名前缀) content = str_remove(x, "^[^:]+: ") ) # 2. 创建连续同名分组标识:为每一段连续相同的说话者分配唯一ID df_processed <- df_processed %>% mutate(group_id = rleid(speaker)) # 3. 按分组合并内容,生成目标格式 result_df <- df_processed %>% group_by(group_id, speaker) %>% summarise(combined_text = paste0(speaker, ": ", paste(content, collapse = " ")), .groups = "drop") %>% select(combined_text) %>% rename(x = combined_text) # 查看最终结果 print(result_df)
代码说明
- 文本拆分:用
str_extract提取冒号前的姓名,str_remove剥离姓名前缀得到纯对话内容; - 连续分组:
data.table::rleid是核心函数,它能自动识别连续相同的说话者,为每一段连续对话分配唯一分组ID,非连续的同名者会被分到不同组; - 内容合并:按分组ID和姓名聚合,用
paste拼接同组的对话内容,再加上姓名前缀,最后整理成目标数据框格式。
运行结果
最终输出的result_df与期望格式完全一致:
x 1 Tom: I like cheese. Cheese is good. Muenster is my favorite. 2 Bob: No, I like Cheddar. 3 Tom: You're wrong. I think cheddar is only good on burgers. 4 Gina: But what about American on burgers? That's better. 5 Bob: Yeah, I agree with Gina. American is better on burgers. Cheddar is for grating on nachos.
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

