Распознать шаблоны в столбце и добавить их в столбец во фрейме данных - PullRequest
0 голосов
/ 04 июня 2018

Получил столбец с 50 ключевыми словами:

Keyword1 
Keyword2
Keyword3
KeywordN=50

Кроме того, я получил фрейм данных с двумя столбцами: заголовок и аннотация.

Title                    Abstract 
Rstudio Keyword1        A interesting program language keyword2  
Python Keyword3         A interesting program keyword3 language 

Я хочу получить дополнительный столбец (назовем его «Ключевые слова»), где будет отображаться имя ключевого слова, если оно находится в заголовке или аннотации, например:

Title             Abstract                                   Keywords
Rstudio Keyword1 A interesting program language keyword2  Keyword1, keyword2
Python Keyword2  A interesting program keyword3 language  Keyword2, Keyword3

Единственное, как я мог «решить» это, это сделать двоичные столбцы (если шаблон соответствовал).(функция grepl), но это не было желаемым решением ...

Ответы [ 4 ]

0 голосов
/ 04 июня 2018
Title<-as.character(c("Rstudio Keyword1","Python Keyword3"))
Abstract<-as.character(c("A interesting program language keyword2"," A interesting program keyword3 language"))
example1.data <- data.frame(Title,Abstract)


#loop answer
f<-length(example1.data)
example1.data$Keyword <- NA

for (i in 1:nrow(example1.data)){
testA[i]<-regmatches(example1.data$Title[i], regexpr("(Keyword|keyword) ([0-9])", example1.data$Title[i]))
testB[i]<-regmatches(example1.data$Abstract[i], regexpr("(Keyword|keyword)([0-9])", example1.data$Abstract[i]))
example1.data$Keyword[i]<-paste(testA[i],testB[i],  sep=", ")

}
0 голосов
/ 04 июня 2018

Другой подход с использованием strsplit (также в базе R):

ls <- strsplit(tolower(paste(df$Title, df$Abstract)), 
                       "(\\s+)|(?!')(?=[[:punct:]])", perl = TRUE)    

df$Keywords <- do.call("rbind", 
               lapply(ls, function(x) paste(unique(x[x %in% tolower(keywords)]), 
               collapse = ", ")))

#             Title                                Abstract           Keywords
#1 Rstudio Keyword1 A interesting program language keyword2 keyword1, keyword2
#2  Python Keyword2 A interesting program keyword3 language keyword2, keyword3

Пример данных

df <- data.frame(Title = c("Rstudio Keyword1", "Python Keyword2"), 
                 Abstract = c("A interesting program language keyword2",  
                              "A interesting program keyword3 language"), 
                 stringsAsFactors = F)

keywords <- paste0("Keyword", 1:4)
0 голосов
/ 04 июня 2018
cbind(dat,Keywords=do.call(paste,c(sep=",",Map(sub,paste0(".*(",paste(keywords,collapse="|"),").*"),"\\1",dat,TRUE))))
             Title                                Abstract          Keywords
1 Rstudio Keyword1 A interesting program language keyword2 Keyword1,keyword2
2  Python Keyword3 A interesting program keyword3 language Keyword3,keyword3

, где keywords=paste0("Keyword",1:3) и

dat=read.table(text="Title                    Abstract 
'Rstudio Keyword1'        'A interesting program language keyword2'  
'Python Keyword3'         'A interesting program keyword3 language'",h=T,strin=F)

Строка может показаться длинной: Разбивка:

a=paste0(".*(",paste(keywords,collapse="|"),").*")
b=do.call(paste,c(sep=",",Map(sub,a,"\\1",dat,TRUE)))
cbind(dat,keywords=b)
             Title                                Abstract          keywords
1 Rstudio Keyword1 A interesting program language keyword2 Keyword1,keyword2
2  Python Keyword3 A interesting program keyword3 language Keyword3,keyword3
0 голосов
/ 04 июня 2018

в базе R:

  • Обрабатывает пунктуацию, пробелы, конец / начало строк.
  • Ключевые слова могут содержать пробелы и некоторые знаки пунктуации (но не все)
  • ключевые слова в новом столбце соответствуют регистру исходного ключевого вектора:

код

ind  <- sapply(paste0('(^|[ [:punct:]])',tolower(keywords),'($|[ [:punct:]])'),grep,tolower(paste(df$Title,df$Abstract)))
ind[lengths(ind)==0] <- NA # for cases where no keyword is found
ind2 <- do.call(rbind,Map(data.frame,keyword=keywords,i=ind))
ind3 <- aggregate(keyword ~ i,ind2,paste,collapse=', ')
df$keywords[ind3$i] <- ind3$keyword
df$keywords[is.na(df$keywords)] <- "" # replacing NAs with empty strings
#              Title                                Abstract           keywords
# 1 Rstudio Keyword1 A interesting program language keyword2 Keyword1, Keyword2
# 2  Python Keyword2 A interesting program keyword3 language Keyword2, Keyword3

данные

keywords <- c("Keyword1", "Keyword2", "Keyword3")

df <- read.table(text="Title                    Abstract 
                 'Rstudio Keyword1'        'A interesting program language keyword2'  
                 'Python Keyword2'         'A interesting program keyword3 language'",h=T,strin=F)
...