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

如何优化正则表达式用tidyr::extract提取访谈转录非一致存在字段

R语言访谈转录文本结构化提取正则调整方案

问题场景

现有一批格式不规整的访谈转录文本,示例如下:

tst <- c("In: ja COOL;  #00:04:24-6#  ",           
         "  in den vier, FÜNF wochen, #00:04:57-8# ",
         "In: jah,  #00:02:07-8# ",
         "In:     [ja; ] #00:03:25-5# [ja; ] #00:03:26-1#",
         "    also jA:h; #00:03:16-6# (1.1)",
         "Bz:        [E::hm;    ]  #00:03:51-4#  (3.0)  ",
         "Bz:    [mhmh,      ]",
         "  in den bilLIE da war;")

需提取4个核心字段存入数据框:

  • Role:访谈角色,即受访者或采访者
  • Utterance:访谈参与方的发言内容
  • Timestamp:两端用#包裹的时间戳
  • Gap:括号包裹的小数形式停顿时长

现有问题

使用tidyr包的extract函数编写提取代码时,既无Timestamp也无Gap的行无法被正确解析,返回NA值:

library(tidyr)
data.frame(tst) %>%
  extract(col = tst,
          into = c("Role", "Utterance", "Timestamp", "Gap"),
          regex = "^(\\w{2}:\\s|\\s+)([\\S\\s]+?)\\s*#([^#]+)?#\\s*(\\([0-9.]+\\))?\\s*")

原返回结果:

Role                 Utterance  Timestamp   Gap
1 In:                   ja COOL; 00:04:24-6      
2      in den vier, FÜNF wochen, 00:04:57-8      
3 In:                       jah, 00:02:07-8      
4 In:                     [ja; ] 00:03:25-5      
5                     also jA:h; 00:03:16-6 (1.1)
6 Bz:               [E::hm;    ] 00:03:51-4 (3.0)
7 <NA>                      <NA>       <NA>  <NA>
8 <NA>                      <NA>       <NA>  <NA>

期望输出:

Role                 Utterance  Timestamp   Gap
1 In:                   ja COOL; 00:04:24-6      
2      in den vier, FÜNF wochen, 00:04:57-8      
3 In:                       jah, 00:02:07-8      
4 In:                     [ja; ] 00:03:25-5      
5                     also jA:h; 00:03:16-6 (1.1)
6 Bz:               [E::hm;    ] 00:03:51-4 (3.0)
7 Bz:              [mhmh,      ]
8          in den bilLIE da war;

解决方案

将时间戳和停顿的组合块整体设为可选,调整正则表达式即可:

data.frame(tst) %>%
  extract(col = tst,
          into = c("Role", "Utterance", "Timestamp", "Gap"),
          regex = "^(\\w{2}:\\s|\\s+)([^#]+?)(?:\\s*#([^#]+)#)?\\s*(\\([0-9.]+\\))?\\s*$")

正则调整说明

  1. 把\\s*#([^#]+)?#替换为(?:\\s*#([^#]+)#)?:外层加?:表示非捕获分组,末尾加?表示整个时间戳块为可选匹配
  2. 发言内容匹配规则从[\\S\\s]+?改为[^#]+?,避免误匹配后续时间戳的#字符,无时间戳时可正常匹配到行尾
  3. 末尾加$锚定行尾,排除多余空白字符的干扰

运行调整后的代码即可得到期望输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:04