Замените слова в тексте словами, сгенерированными с помощью all_words

Будучи новичком в qdap, я не уверен, присутствует ли эта функциональность, но было бы здорово иметь что-то, как указано ниже.

Мой исходный набор данных.

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.


person NinjaR    schedule 28.02.2017    source источник
comment
Вы говорите, что вам не нужны строки с числами?   -  person akrun    schedule 28.02.2017
comment
Не могли бы вы попытаться объяснить это лучше? Не понятно, что вам нужно. Кроме того, воспроизводимость вашего примера может значительно помочь вам. Бонус за доработку функции all_words   -  person Sotos    schedule 28.02.2017
comment
Попробуйте un1 <- unlist(strsplit(df1$Keywords, "[, ]")); as.data.frame(table(grep("^[A-Za-z]+$", un1, value = TRUE)))   -  person akrun    schedule 28.02.2017
comment
@akrun - получить список частот не проблема. Проблема заключается в замене исходных слов, из которых был получен этот список, словами в списке. т. е. 56mg)_job должен стать mgjob в строке номер 3. Надеюсь, это поможет лучше объяснить ситуацию.   -  person NinjaR    schedule 28.02.2017
comment
@Jishu, не могли бы вы взглянуть на мой ответ (особенно 3-е редактирование) и оставить отзыв?   -  person m-dz    schedule 03.03.2017


Ответы (1)


Это немного больше ручного управления, и я не знаю, как форматируются ваши данные, но с некоторыми изменениями должно работать:

Редактировать: и он не использует qdap, но я предположил, что это не важная часть вопроса.

2-е редактирование: я забыл о замене, исправил код ниже.

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

Второе изменение здесь:

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]]))}
person m-dz    schedule 28.02.2017
comment
@ m-dz- Второе редактирование только облегчило мне жизнь. Большое спасибо ..... просто мой CSV содержит несколько слов, разделенных пробелами, которые следует рассматривать как одно слово. т. е. [операция на сердце, специфичность, чертовски болен] следует рассматривать как 3 слова вместо 6. - person NinjaR; 03.03.2017