>

전체 감정 점수를 계산하려는 문자열 열이 포함 된 데이터 집합과 모든 문자열에 나타나는 모든 고유 단어가 포함 된 데이터 프레임이 있습니다. >

library(stringr)
df <- data.frame(text = c('recommend good value no problem','terrible quality no good','good service excellent quality commend'), score = 0)
words <- c('recommend','good','value','problem','terrible','quality','service','excellent','commend')
scores <- c(1,2,1,-2,-3,1,0,3,1)
wordsdf <- data.frame(words,scores)

내가 접근 할 수있는 유일한 방법은 stringer 패키지에서 중첩 된 for 루프와 str_count 함수를 사용하는 것입니다 :

for (i in 1:3){
  count = 0
  for (j in 1:9){
    count <- count + (str_count(df$text[i],as.character(wordsdf$words[j])) * wordsdf$scores[j])
  }
  df$score[i] <- count
}

이것은 내가 원하는 것을 거의 달성한다 :

                                   text score
1        recommend good value no problem     3
2               terrible quality no good     0
3 good service excellent quality commend     7

'commend'이라는 단어도 'recommend'라는 단어에도 포함되어 있기 때문에 코드에서 두 단어가 모두 문자열에 포함 된 것처럼 점수를 계산합니다.

따라서 두 가지 쿼리가 있습니다. 1-정확한 단어에만 맞추는 방법이 있습니까? 2-중첩 루프를 사용하지 않고이를 달성 할 수있는 방법이 있습니까?

  • 답변 # 1

    1 개의 tidyverse  가능성은 다음과 같습니다.

    df %>%
     rowid_to_column() %>%
     mutate(text = strsplit(text, " ", fixed = TRUE)) %>%
     unnest() %>%
     full_join(wordsdf, by = c("text" = "words")) %>%
     group_by(rowid) %>%
     summarise(text = paste(text, collapse = " "),
               scores = sum(scores, na.rm = TRUE)) %>%
     ungroup() %>%
     select(-rowid)
      text                                   scores
      <chr>                                   <dbl>
    1 recommend good value no problem             2
    2 terrible quality no good                    0
    3 good service excellent quality commend      7
    
    

    먼저 "텍스트"열을 별도의 단어로 나눕니다. 둘째,이 단어들에 대해 완전한 결합을 수행합니다. 마지막으로 '텍스트'열의 단어를 다시 결합하여 요약을 수행합니다.

  • 이전 pandas - 파이썬 테이블 조인
  • 다음 azure - powershell 오류의 SQL"Log Bytes Flushed/sec"카운터