Извлечение ключевых слов в каждой строке фрейма данных с использованием udpipe в R - PullRequest
0 голосов
/ 23 октября 2018

Я использую пакет R udpipe для извлечения ключевых слов в моем фрейме данных.Давайте начнем с некоторых данных, содержащихся в пакете:

library(udpipe)
data(brussels_reviews)

Если мы посмотрим на структуру, мы увидим, что она содержит 1500 комментариев (строк) и 4 столбца.

str(brussels_reviews)
'data.frame':   1500 obs. of  4 variables:
 $ id        : int  32198807 12919832 23786310 20048068 17571798 28394425 46322841 27719650 14512388 37675819 ...
 $ listing_id: int  1291276 1274584 1991750 2576349 1866754 5247223 7925019 4442255 2863621 3117760 ...
 $ feedback  : chr  "Gwen fue una magnifica anfitriona. El motivo de mi viaje a Bruselas era la busqueda de un apartamento y Gwen me"| __truncated__ "Aurelie fue muy atenta y comunicativa. Nos dio mapas, concejos turisticos y de transporte para disfrutar Brusel"| __truncated__ "La estancia fue muy agradable. Gabriel es muy atento y esta dispuesto a ayudar en todo lo que necesites. La cas"| __truncated__ "Excelente espacio, excelente anfitriona, un lugar accessible economicamente y cerca de los lugares turisticos s"| __truncated__ ...
 $ language  : chr  "es" "es" "es" "es" ...

Когда следует этот урок , я могу извлечь ключевые слова из всех фреймов данных вместе.Отлично.

Однако мое требование состоит в том, чтобы извлекать ключевые слова в каждой строке , а не во весь фрейм данных в целом.

Я признаю, что в этом примере этоне имеет особого смысла, так как есть только один столбец с текстом (feedback).Однако в моем реальном примере у меня есть много столбцов с текстом.

Итак, Я хотел бы извлечь ключевые слова в каждой строке фрейма данных.Так что если мы извлекаем ключевые слова в этом примере, я хотел бы получить 1500 групп ключевых слов, каждая группа для каждой строки .

Как я могу это сделать?

ОБНОВИТЬ с помощью и ПРИМЕР

Следуя этим двум шагам, мы получаем ключевые слова для всех данных.Однако я хотел бы получить ключевые слова в каждой строке фрейма данных.

Первый шаг

library(udpipe)
library(textrank)
## First step: Take the Spanish udpipe model and annotate the text. Note: this takes about 3 minutes
data(brussels_reviews)
comments <- subset(brussels_reviews, language %in% "es")
ud_model <- udpipe_download_model(language = "spanish")
ud_model <- udpipe_load_model(ud_model$file_model)
x <- udpipe_annotate(ud_model, x = comments$feedback)
x <- as.data.frame(x)

Второй шаг

## Collocation (words following one another)
stats <- keywords_collocation(x = x, 
                             term = "token", group = c("doc_id", "paragraph_id", "sentence_id"),
                             ngram_max = 4)
## Co-occurrences: How frequent do words occur in the same sentence, in this case only nouns or adjectives
stats <- cooccurrence(x = subset(x, upos %in% c("NOUN", "ADJ")), 
                     term = "lemma", group = c("doc_id", "paragraph_id", "sentence_id"))
## Co-occurrences: How frequent do words follow one another
stats <- cooccurrence(x = x$lemma, 
                     relevant = x$upos %in% c("NOUN", "ADJ"))
## Co-occurrences: How frequent do words follow one another even if we would skip 2 words in between
stats <- cooccurrence(x = x$lemma, 
                     relevant = x$upos %in% c("NOUN", "ADJ"), skipgram = 2)

Ответы [ 2 ]

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

У меня была похожая проблема, как вы упомянули.Следующий код может быть полезен.

Однако, если вы используете функцию keywords_phrases в том же пакете, вы можете использовать функцию txt_recode_ngram, чтобы сделать то же самое.

library(data.table)
library(dplyr)
library(magrittr)
library(udpipe)
data("brussels_reviews_anno")
x <- brussels_reviews_anno
x <- as.data.table(x)
x <- subset(x, xpos %in% c("NN", "VB", "IN", "JJ"))
x <- x[, cooccurrence(lemma, order = FALSE), by = list(doc_id)]
x <- x %>%
  group_by(doc_id) %>%
  mutate(keywords = paste(term1, term2)) %>%
  summarize(keywords = paste(keywords, collapse = ", "))     
0 голосов
/ 24 октября 2018

Простой цикл for:

result <- NULL
for(i in 1:nrow(brussels_reviews)){
    result[i] <- somefunction(brussels_reviews[i, 3])
}

Приведенный выше код представляет собой общий подход для цикла по всем строкам brussels_reviews, применения функции к 3-му столбцу и сохранения результата в векторе.Это может также включать вложенный цикл для столбцов.(см. ниже)

Если вы немного уточните, какую именно функцию вы используете, я буду рад помочь.

Код макета

k <- 1
result <- NULL

for(i in 1:nrow(df)){
    for(j in 1:ncol(df)){
        result[k] <- str_extract_all(df[i, j], "[A-Z]")
        k <- k + 1
    }
}

> head(result)
[[1]]
 [1] "P" "W" "Y" "V" "L" "X" "Y" "E" "E" "V" "T" "X" "O" "O" "Y" "A" "W" "P"
[[2]]
[1] "Q" "J" "O" "J" "P" "S"
[[3]]
 [1] "M" "E" "S" "I" "A" "Y" "J" "U" "M" "V" "W" "A" "P" "U" "I" "A" "X" "K"
[[4]]
[1] "T" "R" "H" "I" "S" "I"
[[5]]
 [1] "N" "T" "L" "H" "U" "G" "B" "Z" "H" "U" "Y" "O" "W" "L" "F" "P" "O" "O"
[[6]]
[1] "S" "S" "L" "M" "T" "R"

Данные макета

# Function by A5C1D2H2I1M1N2O1R2T1
# https://stackoverflow.com/a/42734863/9406040
rstrings <- function(n = 5000) {
    a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
    paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}


df <- data.frame(a = paste(rstrings(100), rstrings(100), 
                     rstrings(100)),
                 b = rstrings(100))

> head(df)
                                 a          b
1 PWYVL8045X YEEVT9271X OOYAW3194P QJOJP3673S
2 MESIA1348Y JUMVW0263A PUIAX6901K TRHIS9952I
3 NTLHU1254G BZHUY6075O WLFPO4360O SSLMT4848R
4 XIWRV0967X ERMLU3214U TNRSO3996F IJPTV3142Z
5 ESEKQ7976U RDDDK5322V ZZEJC7637W IBAJI6831N
6 PVDBQ3212K ZXDYV5256Z RVTPH3724W HTYYK5351R
...