Saya sedang mengerjakan giliran berbicara dalam percakapan. Ketertarikan saya adalah pada kata-kata yang diulang dari belokan sebelumnya ke belokan berikutnya:

turnsX <- data.frame(
  speaker = c("A","B","A","B"),
  speech = c("let's have a look", 
             "yeah let's take a look",
             "yeah okay so where to start",
             "let's start here"), stringsAsFactors = F
)

Saya ingin mengekstrak bentuk kata yang berulang. Untuk tujuan ini, saya telah menjalankan loop for, secara iteratif mendefinisikan setiap putaran speech sebagai pola regex untuk putaran speech berikutnya dan str_extractmengucapkan kata-kata yang diulang dari belok ke belok:

library(stringr)
pattern <- c()
extracted <- c()
for(i in 1:nrow(turnsX)){
  pattern[i] <- paste0(unlist(str_split(turnsX$speech[i], " ")), collapse = "|")
  extracted[i+1] <- str_extract_all(turnsX$speech[i+1], pattern[i])
}

Namun hasilnya sebagian salah:

extracted
[[1]]
NULL

[[2]]
[1] "a"     "let's" "a"     "a"     "look" 

[[3]]
[1] "yeah" "a"    "a"   

[[4]]
[1] "start"

[[5]]
[1] NA

Hasil yang benar seharusnya:

extracted
[[1]]
NULL

[[2]]
[1] "let's"    "a"     "look" 

[[3]]
[1] "yeah"   

[[4]]
[1] "start"

Di mana kesalahannya? Bagaimana kode dapat diperbaiki, atau pendekatan lain apa yang ada, untuk mendapatkan hasil yang benar?

2
Chris Ruehlemann 23 Desember 2020, 12:58

3 jawaban

Jawaban Terbaik

Anda ingin batas kata "\\b"

library(stringr)
pattern <- c()
extracted <- c()
for(i in 2:nrow(turnsX)){
  pattern[i - 1] <- paste0(unlist(str_split(turnsX$speech[i - 1], " ")), collapse = "|\\b")
  extracted[i] <- str_extract_all(turnsX$speech[i], pattern[i - 1])
}
# [[1]]
# NULL
# 
# [[2]]
# [1] "let's" "a"     "look" 
# 
# [[3]]
# [1] "yeah"
# 
# [[4]]
# [1] "start"
1
jay.sf 23 Desember 2020, 10:20

Mungkin Anda bisa menggunakan Map dan %in%.

x <- strsplit(turnsX$speech, " ")
Map(function(y,z) y[y %in% z], x[-length(x)], x[-1])
#[[1]]
#[1] "let's" "a"     "look"
#
#[[2]]
#[1] "yeah"
#
#[[3]]
#[1] "start"
2
GKi 23 Desember 2020, 10:04

Inilah pendekatan R dasar menggunakan Map :

tmp <- strsplit(turnsX$speech, ' ')
c(NA, Map(intersect, tmp[-1], tmp[-length(tmp)]))

#[[1]]
#[1] NA

#[[2]]
#[1] "let's" "a"     "look" 

#[[3]]
#[1] "yeah"

#[[4]]
#[1] "start"
2
Ronak Shah 23 Desember 2020, 10:04