如何优化正则表达式用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*$")
正则调整说明
- 把
\\s*#([^#]+)?#替换为(?:\\s*#([^#]+)#)?:外层加?:表示非捕获分组,末尾加?表示整个时间戳块为可选匹配 - 发言内容匹配规则从
[\\S\\s]+?改为[^#]+?,避免误匹配后续时间戳的#字符,无时间戳时可正常匹配到行尾 - 末尾加
$锚定行尾,排除多余空白字符的干扰
运行调整后的代码即可得到期望输出。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

