Данные
У меня есть кадр данных в R со следующей структурой:
ID group text
100 1 An apple is a sweet, edible fruit produced by an apple tree.
103 1 An apple is a sweet, edible fruit produced by an apple tree.
105 1 Some dog breeds show more variation in size than other dog breeds.
106 1 An apple is a sweet, edible fruit produced by an apple tree.
107 1 An apple is a sweet, edible fruit produced by an apple tree.
209 1 Some dog breeds show more variation in size than other dog breeds.
300 1 Some dog breeds show more variation in size than other dog breeds.
501 1 An apple is a sweet, edible fruit produced by an apple tree.
503 2 Ice cream is a sweetened frozen food typically eaten as a snack or dessert.
711 2 Pizza is a savory dish of Italian origin.
799 2 Ice cream is a sweetened frozen food typically eaten as a snack or dessert.
811 2 Ice cream is a sweetened frozen food typically eaten as a snack or dessert.
, которая может быть воспроизведена с помощью этого кода:
test_df <- data.frame(
"ID" = c(100, 103, 105, 106, 107, 209, 300, 501, 503, 711, 799, 811,),
"group" = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2),
"text" = c('An apple is a sweet, edible fruit produced by an apple tree.', 'An apple is a sweet, edible fruit produced by an apple tree.', 'An apple is a sweet, edible fruit produced by an apple tree.', 'Some dog breeds show more variation in size than other dog breeds.', 'Some dog breeds show more variation in size than other dog breeds.', 'An apple is a sweet, edible fruit produced by an apple tree.', 'An apple is a sweet, edible fruit produced by an apple tree.', 'Some dog breeds show more variation in size than other dog breeds.', 'Ice cream is a sweetened frozen food typically eaten as a snack or dessert.', 'Pizza is a savory dish of Italian origin.', 'Ice cream is a sweetened frozen food typically eaten as a snack or dessert.', 'Ice cream is a sweetened frozen food typically eaten as a snack or dessert.')
)
На самом деле тексты, касающиеся каждой темы, немного отличаются друг от друга, и их насчитывается несколько сотен тысяч, разбросанных по десяткам групп.
Что япытаюсь сделать
Я пытаюсь написать функцию, которая выполняет следующее:
- Для каждой группы в кадре данных, сравните все тексты в этой группе, иопределить основные лексические темы.
- Затем введите соответствующую тему для каждого текста в виде нового столбца в кадре данных.
Вот пример того, что две строки в кадре данных могутпосле анализа выглядит так:
ID group topic text
100 1 apple An apple is a sweet, edible fruit produced by an apple tree.
105 1 dog Some dog breeds show more variation in size than other dog breeds.
То, что у меня есть до сих пор
Я могу использовать следующий код для запуска такого рода функции в целом, на полнойкадр данных (без подгруппы по группам):
# Preparing the texts
library(tm)
corpus <- Corpus(VectorSource(test_df$text))
corpus <- tm_map(corpus, removeWords, stopwords('english'))
corpus <- tm_map(corpus, stemDocument, language = 'english')
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, stripWhitespace)
# Identifying topics
library(topicmodels)
TF <- DocumentTermMatrix(corpus, control = list(weighting = weightTf))
lda.output <- LDA(TF, k=2, method = 'Gibbs')
# Inputting the topic classification into the dataframe
test_df <- cbind(test_df, terms(lda.output)[topics(lda.output)])
У меня триредактировать, чтобы превратить это в функцию, а затем запустить функцию в кадре данных по подмножеству, используя следующий код:
library(tm)
library(topicmodels)
topic_identifier <- function(text) {
corpus <- Corpus(VectorSource(text))
corpus <- tm_map(corpus, removeWords, stopwords('english'))
corpus <- tm_map(corpus, stemDocument, language = 'english')
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, stripWhitespace)
TF <- DocumentTermMatrix(corpus, control = list(weighting = weightTf))
lda.output <- LDA(TF, k=2, method = 'Gibbs')
test_df <- cbind(test_df, terms(lda.output)[topics(lda.output)])
}
by(test_df$text, test_df$group, topic_identifier)
Но это не позволяет мне сохранить соответствующие выходные данные для каждого подмножества воригинал df.