我有大量文档,我想使用 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)
步骤3中的MyCorpurs是使用“tm”包获得的语料库。第 2 步和第 3 步不能一起工作,因为第 2 步的输出是词汇,但第 3 步的输入是“tm”语料库。
我的第一个问题是如何使用 text2vec 包(和兼容的包)完成所有步骤,因为我发现它非常有效;感谢德米特里·塞利瓦诺夫。
第二:我们如何在步骤 5 中为 LDA 中的参数设置最佳值?是否可以根据数据自动设置它们?
感谢 Manuel Bickel 在我的帖子中的更正。
谢谢,山姆