2017-02-28 8 views
0

qdap에 새로 입문했기 때문에이 기능의 존재 여부를 잘 모릅니다. 아래에서 언급 한 내용이있는 것이 좋습니다.텍스트의 단어를 all_words를 사용하여 생성 된 단어로 바꿉니다.

나의 초기 데이터 세트.

ID   Keywords 
1   112 mills, open heart surgery, great, great job 
2   Ausie, open, heart out 
3   opened, heartily, 56mg)_job, orders12 
4   order, macD 

all_words()을 사용하여에 나는 다음과 같은 데이터와 끝까지.

WORD  FREQ 
1 great  2 
2 heart  2 
3 open  2 
4 ausie  1 
5 heartily 1 
6 job   1 
7 macd  1 
8 mgjob  1 
9 mills  1 
10 opened  1 
11 order  1 
12 orders  1 
13 out   1 
14 surgery  1 

주요 데이터 세트가 all_words()를 통해 나타나고있다 정확한 단어로 대체 될 수있는 방법이 있나요?

edit1 : 그래서 all_words()를 사용하여 만들어진 목록은 데이터 프레임의 원래 단어를 대체해야합니다. 즉, 112 밀스가 밀이되어야하고, 56mg이되어야합니다. _job은 mgjob이되어야합니다.

+0

숫자가 포함 된 문자열을 원하지 않는다는 말입니까? – akrun

+0

더 잘 설명해 주시겠습니까? 당신이 필요로하는 것이 명확하지 않습니다. 또한 예제를 재현 가능하게 만드는 것이 먼 길을 가도록 도와 줄 수 있습니다. 'all_words' 함수에 약간의 정교함을위한 보너스 – Sotos

+0

'un1 <- unlist (strsplit (df1 $ Keywords, "[,]")); unbox, value = TRUE))) – akrun

답변

1

그것은 좀 더 수동 내가 당신의 데이터를 포맷하는 방법을 알고하지 않습니다하지만 일부 땜질에 대한 작업 수행해야합니다

편집 : 그것은 qdap를 사용하지 않는,하지만 난 이것이 가정 하였다 이 질문의 중요한 부분은 아닙니다.

두 번째 편집 : 아래의 대체 코드는 잊어 버렸습니다. 여기

library(data.table) 
library(tm) # Functions with tm:: below 
library(magrittr) 

dt <- data.table(
    ID = 1L:4L, 
    Keywords = c(
    paste('112 mills', 'open heart', 'surgery', 'great', 'great job', sep = ' '), 
    paste('Ausie', 'open', 'heart out', sep = ' '), 
    paste('opened', 'heartily', '56mg)_job', 'orders12', sep = ' '), 
    paste('order', 'macD', sep = ' '))) 

# dt_2 <- data.table(Tokens = tm::scan_tokenizer(dt[, Keywords])) 
dt_2 <- dt[, .(Tokens = unlist(strsplit(Keywords, split = ' '))), by = ID] 

dt_2[, Words := tm::scan_tokenizer(Tokens) %>% 
     tm::removePunctuation() %>% 
     tm::removeNumbers() 
    ] 
dt_2[, Stems := tm::stemDocument(Words)] 

dt_2 
#  ID Tokens Words Stems 
# 1: 1  112     
# 2: 1  mills mills  mill 
# 3: 1  open  open  open 
# 4: 1  heart heart heart 
# 5: 1 surgery surgery surgeri 
# 6: 1  great great great 
# 7: 1  great great great 
# 8: 1  job  job  job 
# 9: 2  Ausie Ausie  Ausi 
# 10: 2  open  open  open 
# 11: 2  heart heart heart 
# 12: 2  out  out  out 
# 13: 3 opened opened  open 
# 14: 3 heartily heartily heartili 
# 15: 3 56mg)_job mgjob mgjob 
# 16: 3 orders12 orders order 
# 17: 4  order order order 
# 18: 4  macD  macD  macD 

# Frequencies 
dt_2[, .N, by = Words] 
#  Words N 
# 1:   1 
# 2: mills 1 
# 3:  open 2 
# 4: heart 2 
# 5: surgery 1 
# 6: great 2 
# 7:  job 1 
# 8: Ausie 1 
# 9:  out 1 
# 10: opened 1 
# 11: heartily 1 
# 12: mgjob 1 
# 13: orders 1 
# 14: order 1 
# 15:  macD 1 

2 편집 :

res <- dt_2[, .(Keywords = paste(Words, collapse = ' ')), by = ID] 
res 
# ID         Keywords 
# 1: 1 mills open heart surgery great great job 
# 2: 2      Ausie open heart out 
# 3: 3    opened heartily mgjob orders 
# 4: 4        order macD 

3 편집, 경우에 당신의 키워드 목록으로 와서 당신은 그 (것)들에게 그 방법을 유지하고 싶습니다.

library(data.table) 
library(tm) # Functions with tm:: below 
library(magrittr) 

dt <- data.table(
    ID = 1L:4L, 
    Keywords = list(
    c('112 mills', 'open heart', 'surgery', 'great', 'great job'), 
    c('Ausie', 'open', 'heart out'), 
    c('opened', 'heartily', '56mg)_job', 'orders12'), 
    c('order', 'macD'))) 

dt_2 <- dt[, .(Keywords = unlist(Keywords)), by = ID] 
dt_2[, ID_temp := .I] 

dt_3 <- dt_2[, .(ID, Tokens = unlist(strsplit(unlist(Keywords), split = ' '))), by = ID_temp] 

dt_3[, Words := tm::scan_tokenizer(Tokens) %>% 
     tm::removePunctuation() %>% 
     tm::removeNumbers() %>% 
     stringr::str_to_lower() 
    ] 
dt_3[, Stems := tm::stemDocument(Words)] 
dt_3 

res <- dt_3[, .(
    ID = first(ID), 
    Keywords = paste(Words, collapse = ' ') %>% stringr::str_trim()), 
    by = ID_temp] 
res <- res[, .(Keywords = list(Keywords)), by = ID] 

# Confirm format (a list of keywords in every element) 
dt[1, Keywords] %T>% {print(class(.))} %T>% {print(length(.[[1]]))} 
res[1, Keywords] %T>% {print(class(.))} %T>% {print(length(.[[1]]))} 
+0

@ m-dz- 두 번째 편집은 나를 위해 삶을 편하게 만들었습니다. 감사합니다. ..... 내 CSV에는 여러 단어가 포함되어 있으며 한 단어로 간주되어야합니다. 즉, [심장 수술, 특이성, 지옥 같은 아픈]은 6 대신 3 단어로 간주되어야합니다. – NinjaR