У меня есть большое количество документов, и я хочу провести тематическое моделирование с использованием text2vec и LDA (Gibbs Sampling).
Шаги, которые мне нужны, следующие (по порядку):
Удаление цифр и символов из текста
library(stringr) docs$text <- stringr::str_replace_all(docs$text,"[^[:alpha:]]", " ") docs$text <- stringr::str_replace_all(docs$text,"\\s+", " ")
Удаление стоп-слов
library(text2vec) library(tm) stopwords <- c(tm::stopwords("english"),custom_stopwords) prep_fun <- tolower tok_fun <- word_tokenizer tok_fun <- word_tokenizer tokens <- docs$text%>% prep_fun %>% tok_fun it <- itoken(tokens, ids = docs$id, progressbar = FALSE) v <- create_vocabulary(it, stopwords = stopwords) %>% prune_vocabulary(term_count_min = 10) vectorizer <- vocab_vectorizer(v)
Замена синонимов терминами
У меня есть файл Excel, в котором первый столбец является основным словом, а синонимы перечислены во втором, третьем и ... столбцах. Я хочу заменить все синонимы на главные слова (столбец №1). У каждого термина может быть разное количество синонимов. Вот пример кода, использующего пакет "tm" (но мне интересен код из пакета text2vec):
replaceSynonyms <- content_transformer(function(x, syn=NULL)
{Reduce(function(a,b) {
gsub(paste0("\\b(", paste(b$syns, collapse="|"),")\\b"), b$word, a, perl = TRUE)}, syn, x) })
l <- lapply(as.data.frame(t(Synonyms), stringsAsFactors = FALSE), #
function(x) {
x <- unname(x)
list(word = x[1], syns = x[-1])
})
names(l) <- paste0("list", Synonyms[, 1])
list2env(l, envir = .GlobalEnv)
synonyms <- list()
for (i in 1:length(names(l))) synonyms[i] = l[i]
MyCorpus <- tm_map(MyCorpus, replaceSynonyms, synonyms)
Преобразовать в матрицу терминов документа
dtm <- create_dtm(it, vectorizer)
Применение модели LDA к матрице терминов документа
doc_topic_prior <- 0.1 # can be chosen based on data? lda_model <- LDA$new(n_topics = 10, doc_topic_prior = doc_topic_prior, topic_word_prior = 0.01) doc_topic_distr <- lda_model$fit_transform(dtm, n_iter = 1000, convergence_tol <- 0.01, check_convergence_every_n = 10)
MyCorpurs на шаге 3 - это корпус, полученный с помощью пакета «tm». Шаг 2 и Шаг 3 не работают вместе, так как на выходе Шаг 2 - это словарь, а на входе Шаг 3 - корпус "tm".
Мой первый вопрос здесь заключается в том, как я могу выполнить все шаги с использованием пакета text2vec (и совместимых пакетов), поскольку я считаю его очень эффективным; спасибо Дмитрию Селиванову.
Во-вторых: как мы устанавливаем оптимальные значения для параметров в LDA на шаге 5? Можно ли установить их автоматически на основе данных?
Спасибо Мануэлю Бикелю за исправления в моем сообщении.
Спасибо, Сэм