R - Матрица термина документа с разделенными запятыми текстовыми столбцами - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть фрейм данных со столбцом, состоящим из Strings (project_skills), который обозначает навыки, которые дает определенная работа (job_id).Я хочу разделить эту строку для каждой работы, чтобы получить вектор навыков, которые дает работа, а затем создать матрицу условий документа, чтобы обозначить, какие навыки (из всех возможных навыков) дает определенная работа.

I´у нас есть следующий фрейм данных:

job_id           project_skills
107182           CSS,HTML,Joomla,PHP
108169           XTCommerce,Magento,Prestashop,VirtueMart,osCommerce
112969           Google Search Console,Google Analytics,Google Webmaster Central,C++,Java,C#
114660           Marketing,Email Marketing
118686           PHP

Результат должен выглядеть примерно так (в основном это матрица термина документа с разделенными запятыми фразами:

        project_skills
job_id  CSS   HTML   PHP   Google Search Console   Google Analytics   Java ...
107182  1     0       0 ...         
108169  0     0       0     0                       0         
112969  0     0       0     1                       1 ...         
114660  0     0       0 ...            
118686  0     0       1 ...

Я пробовалследующее:

df <- data.frame(job_id = c(107182, 108169, 112969, 114660, 118686), project_skills = c("CSS,HTML,Joomla,PHP", "XTCommerce,Magento,Prestashop,VirtueMart,osCommerce", "Google Search Console,Google Analytics,Google Webmaster Central,C++,Java,C#", "Marketing,Email Marketing", "PHP"))

corpus <- Corpus(VectorSource(df$project_skills))
corpus <- tm_map(corpus, function(x) {
PlainTextDocument(
    strsplit(x,"\\,")[[1]], 
    id=ID(x)
)
})
inspect(corpus)
dtm <- DocumentTermMatrix(corpus)
as.matrix(dtm)

Но, к сожалению, это разделяет все слова, а не запятые (например, Google Search Console следует рассматривать как один термин в DTM).

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Есть много решений, но strsplit - ваш друг. Именно это и делается в следующем коде:

library(udpipe)
df <- data.frame(job_id = c(107182, 108169, 112969, 114660, 118686), project_skills = c("CSS,HTML,Joomla,PHP", "XTCommerce,Magento,Prestashop,VirtueMart,osCommerce", "Google Search Console,Google Analytics,Google Webmaster Central,C++,Java,C#", "Marketing,Email Marketing", "PHP"), 
                 stringsAsFactors = FALSE)
dtm <- document_term_frequencies(x = df$project_skills, document = df$job_id, split = ",")
dtm <- document_term_matrix(dtm)
colnames(dtm)
 [1] "C#"                       "C++"                      "CSS"                      "Email Marketing"         
 [5] "Google Analytics"         "Google Search Console"    "Google Webmaster Central" "HTML"                    
 [9] "Java"                     "Joomla"                   "Magento"                  "Marketing"               
[13] "osCommerce"               "PHP"                      "Prestashop"               "VirtueMart"              
[17] "XTCommerce"              
rownames(dtm)
[1] "107182" "108169" "112969" "114660" "118686"
dim(dtm)
[1]  5 17
0 голосов
/ 15 ноября 2018

tm (или некоторые другие пакеты для интеллектуального анализа текста) разделяются на слова (пробелы), и если вы не отметите галочкой, как правило, удаляйте знаки препинания, такие как + и #. Самый простой вариант - просто использовать strsplit. Я показываю опцию ниже, используя tidyr и dplyr. Первая группа по job_id, затем разделить столбцы. Это создаст вложенность, которая при отсутствии вложенности создает длинный data.frame. Здесь я добавляю значение 1 для каждой записи, которая действует как 1 в матрице терминов документа. Затем распространите в широком формате, чтобы получить ожидаемый результат. Если вы посмотрите на результирующую структуру, имена столбцов будут такими, как вы ожидаете, не показывая тильду (~).

library(tidyr)
library(dplyr)

outcome <- df1 %>%
  group_by(job_id) %>% 
  mutate(project_skills = strsplit(project_skills, ",")) %>% 
  unnest() %>% 
  mutate(value = 1) %>% # add 1 for every value
  spread(key = project_skills, value = value) # use fill = 0 if you don't want NA's

head(outcome)
# A tibble: 5 x 18
# Groups:   job_id [5]
  job_id  `C#` `C++`   CSS `Email Marketin~ `Google Analyti~ `Google Search ~ `Google Webmast~  HTML  Java Joomla Magento Marketing
   <int> <dbl> <dbl> <dbl>            <dbl>            <dbl>            <dbl>            <dbl> <dbl> <dbl>  <dbl>   <dbl>     <dbl>
1 107182    NA    NA     1               NA               NA               NA               NA     1    NA      1      NA        NA
2 108169    NA    NA    NA               NA               NA               NA               NA    NA    NA     NA       1        NA
3 112969     1     1    NA               NA                1                1                1    NA     1     NA      NA        NA
4 114660    NA    NA    NA                1               NA               NA               NA    NA    NA     NA      NA         1
5 118686    NA    NA    NA               NA               NA               NA               NA    NA    NA     NA      NA        NA
# ... with 5 more variables: osCommerce <dbl>, PHP <dbl>, Prestashop <dbl>, VirtueMart <dbl>, XTCommerce <dbl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...