基于R实现ELAN标注片段长度的跨编码者信度评估脚本问询
跨ELAN标注编码者的匹配验证实现(R语言)
现成脚本说明
目前没有专门适配ELAN标注片段跨编码者信度验证的通用现成脚本,但可以用R的dplyr和purrr包快速实现你需要的功能。
实现步骤与代码
1. 模拟示例数据
先构造符合需求的示例数据集(实际使用时替换为你的真实数据即可):
library(dplyr) library(purrr) # 模拟Coder1的标注数据 Coder1 <- tibble( coder = "Coder1", segment_type = rep("vocalization", 5), begin = c(363, 356, 360, 369, 392), end = c(364, 356, 360, 374, 392), dur = c(0.41, 0.33, 0.29, 4.92, 0.21) ) # 模拟Coder2的标注数据 Coder2 <- tibble( coder = "Coder2", segment_type = rep("vocalization", 4), begin = c(363.2, 369.1, 371.5, 400), end = c(363.8, 371.2, 374.1, 401), dur = c(0.6, 2.1, 2.6, 1) )
2. 核心匹配逻辑实现
针对Coder1的每个"vocalization"片段,检查Coder2中是否存在至少一个同类型片段满足起始时间差≤1秒、结束时间差≤1秒、时长差≤1秒的条件,满足则标记Match=TRUE:
# 筛选出两个编码者的发声片段 c1_voc <- Coder1 %>% filter(segment_type == "vocalization") c2_voc <- Coder2 %>% filter(segment_type == "vocalization") # 为Coder1添加Match列 output <- c1_voc %>% mutate( Match = map_lgl(row_number(), function(i) { # 提取当前行的时间参数 curr_begin <- begin[i] curr_end <- end[i] curr_dur <- dur[i] # 检查Coder2中是否存在符合条件的片段 any( abs(c2_voc$begin - curr_begin) <= 1, abs(c2_voc$end - curr_end) <= 1, abs(c2_voc$dur - curr_dur) <= 1, .and = TRUE # 确保三个条件同时满足 ) }) )
3. 查看结果
运行后输出符合预期的结果:
> head(output) # A tibble: 5 x 6 coder segment_type begin end dur Match <chr> <chr> <dbl> <dbl> <dbl> <lgl> 1 Coder1 vocalization 363 364 0.41 TRUE 2 Coder1 vocalization 356 356 0.33 FALSE 3 Coder1 vocalization 360 360 0.29 FALSE 4 Coder1 vocalization 369 374 4.92 TRUE 5 Coder1 vocalization 392 392 0.21 FALSE
逻辑说明
- 先筛选出目标类型片段,避免无关数据干扰计算
- 使用
map_lgl逐行处理Coder1的数据,只要Coder2中有任意一个片段同时满足三个时间差条件,当前行的Match就设为TRUE,完美适配编码者对同一发声片段的拆分/合并标注场景
内容的提问来源于stack exchange,提问作者Catherine Laing
相关产品推荐
相关产品推荐

