我有几行聊天数据,其中包含如下所示的成绩单:
“参与者1(我):我不知道答案。参与者2:您怎么看?也许20%?参与者2:我也不知道。参与者1(我):那是我的猜测2:好的,我们去吧!...您怎么看?参与者1(我):肯定!参与者2:好的!参与者2:糟糕!对不起!”
我只想提取前缀Participant 1 (Me):
之后的文本,直到它说出Participant 1
或为止Participant 2
。之后Participant 1
直到紧接上述定界符的所有文本都应存储在名为的变量中participant_1_text
。我想将所有剩余的文本存储在一个名为的单独变量中participant_2_text
,如下所示:
participant_1_text = "I don't know the answer to this. that was my guess. sure!
participant_2_text = "What do you think? Maybe 20%? I don't know either. ok, let's go for
it! ...what do you think? ok! aww! sorry!"
因此,现在将参与者1的所有文本和参与者2的所有文本分开。
我尝试了以下正则表达式:
(?<=Participant 1)(.*)(?=Participant 2)
但这将匹配这两个定界符的第一次和最后一次出现之间的所有文本,而不是每次匹配。
编辑:我现在尝试获取以下版本的代码并将其应用于包含大量聊天记录的数据框:
因此,使用@akrun的代码,我制作了一个函数,该函数将给定的聊天记录分隔为my_chat
或partner_chat
返回一个命名列表:
extract_chat <- function(chat_text){
final_output = chat_text %>%
tibble(col1 = chat_text) %>%
mutate(col1 = str_replace_all(col1, "Participant", "\nParticipant")) %>%
separate_rows(col1, sep="\n") %>%
filter(nzchar(col1)) %>% #filter the non-empty strings
separate(col1, into = c('Participant', "text"), sep=":") %>%
group_by(Participant) %>%
summarise(text = str_c(text, collapse= ' ')) %>%
mutate(Participant = ifelse(str_detect(Participant, "(Me)"), "my_chat_extracted", "partner_chat_extracted")) %>%
spread(Participant, text)
return(list(my_chat_extracted = final_output$my_chat_extracted,
partner_chat_extracted = final_output$partner_chat_extracted))
}
这似乎工作正常,但是我不确定如何更改数据框中的实际列以使用此功能。
这是要使用的data.frame的示例:
str1 <- "Participant 1 (Me): I don't know the answer to this. Participant 2: What do you think? Maybe 20%? Participant 2: I don't know either. Participant 1 (Me): that was my guess Participant 2: ok, let's go for it! ...what do you think? Participant 1 (Me): sure! Participant 2: ok! Participant 2: aww! sorry!"
str2 <- "Participant 1 (Me): Hey, how are you? Participant 2: I'm good, how about you? Participant 2: I'm excited. Participant 1 (Me): I'm also good."
test = data.frame(chat = c(str1, str2))
我想做类似的事情:
tester = test %>%
rowwise() %>%
mutate(my_chat_extracted = extract_chat(chat)$my_chat_extracted)
但这在我的实际数据集上似乎很慢,而且很草率。
我们可以在Participant
(with str_replace_all
)之前插入下一个行字符,然后在\n
with处分割separate_rows
,filter
删除任何空格(nzchar
),separate
在处将其列为两个:
,按“参与者”分组,paste
将“文本”字符串分成一个字符串
library(dplyr)
library(stringr)
library(tidyr)
out <- tibble(col1 = str1) %>%
mutate(col1 = str_replace_all(col1, "Participant", "\nParticipant")) %>%
separate_rows(col1, sep="\n") %>%
filter(nzchar(col1)) %>%
separate(col1, into = c('Participant', "text"), sep=":") %>%
group_by(Participant = str_remove(Participant, "\\s*\\(.*")) %>%
summarise(text = str_c(text, collapse= ' '))
out
# A tibble: 2 x 2
# Participant text
# <chr> <chr>
#1 Participant 1 " I don't know the answer to this. that was my guess sure! "
#2 Participant 2 " What do you think? Maybe 20%? I don't know either. ok, let's go for it! ...what do you think? ok! aww! sorry!"
最好将其保留在中data.frame
,但如果需要list2env
在deframe
ing之后使用单独的对象
library(tibble)
list2env(as.list(deframe(out)), .GlobalEnv)
`Participant 1`
#[1] " I don't know the answer to this. that was my guess sure! "
str1 <- "Participant 1 (Me): I don't know the answer to this. Participant 2: What do you think? Maybe 20%? Participant 2: I don't know either. Participant 1 (Me): that was my guess Participant 2: ok, let's go for it! ...what do you think? Participant 1 (Me): sure! Participant 2: ok! Participant 2: aww! sorry!"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句