如何在R中基于结束标记为分词添加连续句子标签?
这问题我熟!要给每个句子按顺序加标签,其实用dplyr里的cumsum()配合lag()就能轻松搞定,思路是根据stop列的标记来累计句子数:
完整实现代码(dplyr版本)
首先先定义你的原始数据(推荐用tibble()替代data_frame(),这是dplyr当前的标准写法):
library(dplyr) # 原始数据 df <- tibble( word = c("I'm", "going", "to", "be", "sick", "I", "want", "to", "go", "home"), stop = c(FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) )
接着新增句子标签列:
# 生成句子编号 df2 <- df %>% mutate( sentence_id = cumsum(lag(stop, default = FALSE)) + 1 )
代码逻辑解释
lag(stop, default = FALSE):把stop列整体向后偏移一位,第一个元素用FALSE填充。这样每一行的结果就代表上一个单词是否是句子结尾。cumsum():累计这个偏移后的stop值,每遇到一个TRUE(即上一个单词是句子结尾),累计数就加1。- 最后
+1:让第一个句子的编号从1开始,避免出现从0起步的情况。
运行后得到的df2就是你要的结果:
# 查看最终结果 df2 #> # A tibble: 10 × 3 #> word stop sentence_id #> <chr> <lgl> <dbl> #> 1 I'm FALSE 1 #> 2 going FALSE 1 #> 3 to FALSE 1 #> 4 be FALSE 1 #> 5 sick TRUE 1 #> 6 I FALSE 2 #> 7 want FALSE 2 #> 8 to FALSE 2 #> 9 go FALSE 2 #> 10 home TRUE 2
不用dplyr的Base R版本
如果不想加载dplyr包,用Base R也能实现相同效果:
# Base R 写法 df$sentence_id <- cumsum(c(FALSE, head(df$stop, -1))) + 1
这里head(df$stop, -1)去掉了stop列的最后一个元素,前面补FALSE,和lag()的作用完全一致,再累计求和加1即可。
内容的提问来源于stack exchange,提问作者mowglis_diaper
相关产品推荐
相关产品推荐

