我有大量文档,并且想使用text2vec和LDA(Gibbs Sampling)进行主题建模。使用text2vec包进行文本预处理和主题建模
步骤我需要的是为(按顺序):
从文本中删除数字和符号
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包(和兼容包)来做所有的步骤,因为我发现它非常高效;感谢Dmitriy Selivanov。
第二:如何在步骤5中设置LDA中参数的最优值?是否可以根据数据自动设置它们?
感谢曼努埃尔比克尔在我的文章更正。
感谢, 山姆
非常感谢您的回答。其实我有大量的拼写错误和缩写的数据,也是同一个词的不同缩写。主词只是一个词,但同义词可以是诸如“热水”之类的词组。我需要先删除停用词(我的问题中的第2步),然后用主词替换多个同义词。我如何按顺序完成这两个步骤,即先删除停用词,然后替换同义词?我做了所有使用“tm”和“topicmodels”包的工作,但它们非常慢,我想切换到text2vec。 –
我意识到你的问题的一部分已经在其他地方得到了回答。我已经相应地更新了我的答案,并包含了该答案的链接。 –
感谢Manuel的更新。在ngram之前删除一些停用词让我更容易关注重要的ngrams /短语。例如,“返回工作”,“返回工作”,“返回工作”全部被替换为返工。我有很多这种类型的短语。 –