2017-02-28 3 views
0

Ich bin ziemlich neu zu qdap, ich bin nicht sicher, ob diese Funktionalität vorhanden ist, aber es wäre toll, etwas wie unten erwähnt zu haben.Ersetze Wörter im Text durch generierte Wörter mit all_words

Mein erster Datensatz.

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 

Auf all_words() mit I mit den folgenden Daten enden.

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 

Gibt es eine Möglichkeit, in der die Hauptdatenmenge kann durch die genauen Worte ersetzt werden, die durch all_words() erscheinen?

edit1: Also die Liste, die von all_words() kommt, sollte die ursprünglichen Wörter im Datenrahmen ersetzen, d. H. 112 Mühlen sollten Mühlen werden, 56 mg) _job sollte mgjob werden.

+0

Wollen Sie sagen, dass Sie keine Zeichenfolgen mit Zahlen möchten? – akrun

+0

Können Sie es bitte besser erklären? Es ist nicht klar, was Sie brauchen. Wenn Sie Ihr Beispiel nachvollziehbar machen, können Sie einen großen Beitrag leisten. Bonus für das Ausarbeiten eines Bits in der 'all_words' Funktion – Sotos

+0

Versuchen Sie' un1 <- unlist (strsplit (df1 $ Keywords, "[,]")); as.data.frame (Tabelle (grep ("^ [A-Za-z] + $", un1, Wert = TRUE))) ' – akrun

Antwort

1

Es ist ein bisschen mehr manuelle und ich weiß nicht, wie Ihre Daten formatiert sind, aber mit etwas Bastelei sollte die Arbeit machen:

Edit: und es wird qdap nicht, aber ich habe angenommen, dies ist kein entscheidender Teil der Frage.

2. Bearbeitung: Ich habe vergessen, die Substitution, korrigierten Code unten.

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. bearbeiten hier:

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. bearbeiten, falls Sie Ihre Keywords kommen als Listen und Sie möchten, dass sie auf diese Weise halten.

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- Die zweite Bearbeitung machte das Leben einfach für mich. Vielen Dank ..... es ist nur, dass mein csv mehrere Leerzeichen getrennte Wörter enthält, die als einzelnes Wort betrachtet werden sollten. dh [Herzoperation, Spezifität, krank wie die Hölle] sollte als 3 Wörter anstelle von 6 betrachtet werden. – NinjaR

Verwandte Themen